安洵杯 2019
Web
easy_web
进入页面后可以获得 Hint md5 is funny ~ ,并且从 URL 可以发现 payload 如下
?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=在开发者工具 - Elements 中将 background 注释掉方便查看回显。
尝试传入以下 Payload
img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=ls
img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=echo回显 forbid ~ ,说明均被过滤了,尝试将 img 的值删除回显时图片消失,说明图片时通过 img 引入的。
将 TXpVek5UTTFNbVUzTURabE5qYz0 丢进 CyberChef 一把梭可以得到经过两次 base64 解码以及一次 16 进制转字符串的值 555.png

那就反其道而行之,将 index.php 的值以上面的逆序进行转换得到值 TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

将得到的值进行传入,Payload 如下
img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=回显后进行 base64 解码可以得到 index.php 的源码
想要执行系统命令就需要进行 md5 强比较绕过,这里进行了 string 强制类型转换,所以只能通过碰撞找出 md5 值相同的两个字符串了,可以通过 fastroll 进行生成,也可以在网上找生成好的,构造 Payload(body) 如下
回显时 md5 is funny ~ 消失了,说明绕过成功了,之后就是绕过黑名单,虽然空格没有过滤,但是还是没找到突破口,通过百度才发现 PHP 正则替换存在一个特别的情况。当我们想过滤 \ 的时候,我们会想到用 \\ 来解决,但是实际上并没有实现过滤,因为 PHP 会先进行一次解析,这时候我们要过滤的实际变成空白,所以要想过滤 \ 需要使用 \\\\ 来解决,这时候 PHP 进行解析后变成 \\ ,这就匹配成功了。
因此上述正则中的 |\\|\\\\| 其实是 |\|\\| ,也就是过滤了 |\ ,并没有过滤 \ 。故可以通过构造如下 Payload 进行绕过
这时候这道题就结束了。
easy_serialize_php
当 $function == 'show_image' 时,会输出 $userinfo['img'] 的内容,因此下一步就是修改 $userinfo['img'] 的值。
在源码上方存在 extract($_POST); 因此可以通过该函数进行传值,但是传入的值会被后面的 $_SESSION['img'] 顶掉,所以这题需要通过 filter() 函数进行反序列化字符串逃逸。
先根据提示在 phpinfo() 中找到了 d0g3_f1ag.php ,猜测 flag 就在这里。
通过输出 $serialize_info 的序列化可以得到回显如下
通过传入 Payload 如下
即可使得序列化字符串变为
此时再进行反序列化则会得到
验证逃逸成功,再设置 param:f=show_image 即可得到 d0g3_f1ag.php 源代码如下
那就将 /d0g3_fllllllag base64 编码得到 ZDBnM19mbGxsbGxsYWc= ,这时的 Payload 如下
就可以得到 flag 力。
Last updated