安洵杯 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

![easy_web-1](E:\ICloud\iCloudDrive\Note\CTF\安洵杯 2019\easy_web-1.png)

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

![easy_web-2](E:\ICloud\iCloudDrive\Note\CTF\安洵杯 2019\easy_web-2.png)

将得到的值进行传入,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