点击此处获得更好的阅读体验
WriteUp来源
题目考点
文件包含
md5碰撞
rce
fuzz
解题思路
由于题目正则出现了点问题,最后一个 fuzz 的考点没有考到。导致很多队伍直接通过最简单的 Bypass 就可以拿到 flag。稍后在题解中详谈。
观察 url 根据 url 中 img 参数 img=TXpVek5UTTFNbVUzTURabE5qYz0
推测文件包含加密脚本
1 | import binascii |
读取 index.php 源码之后审计源码。发现通过 rce 拿到 flag 之前需要通过一个判断
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b']))
通过md5碰撞即可 rce 拿到 flag
1 | POST数据 |
关于 rce 有一个过滤的黑名单如下,过滤了常见的读取文件的操作
1 | if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) |
因为过滤了大多常见的文件读取的命令,最后的核心考点是拿 linux 命令去 fuzz ,但是因为过滤反斜杠 |\|\\|
这里的时候正则没有写好,导致了反斜杠逃逸。因此造成了 ca\t
命令可以直接读取 flag
预期解也不唯一,毕竟很多命令都能读取文件内容。这里还是给出相对比较常见的一个。sort
即可。