[安洵杯 2019]easy_web 1
打开题目

抓个包看一下

这里有一个base64编码传输的图片,get提交有2个传参,img可能是文件对象,cmd可能是执行命令的
img参数是经过处理的

前面是2次base64加密,后面那一串并不是很敏感,不知道是16进制,还是做太少了

得到了555.png文件名
那是不是可以反过来,把数据进行编码再传过去,传一下index.php试一下


把index.php传过去,得到了index.php的base64编码

解码一下

源码:
<?php error_reporting(E_ALL || ~ E_NOTICE); header('content-type:text/html;charset=utf-8'); $cmd = $_GET['cmd']; if (!isset($_GET['img']) || !isset($_GET['cmd'])) header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd='); //解码得出真实文件名 $file = hex2bin(base64_decode(base64_decode($_GET['img']))); //将文件名中的一些特殊符号替换为空 $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file); //不能直接读flag文件 if (preg_match("/flag/i", $file)) { echo '<img src ="./ctf3.jpeg">'; die("xixiï½ no flag"); } else { //将文件base64编码后传到前端 $txt = base64_encode(file_get_contents($file)); echo "<img src='data:image/gif;base64," . $txt . "'></img>"; echo "<br>"; } echo $cmd; echo "<br>"; //禁用的函数或特殊符号列表 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)) { echo("forbid ~"); echo "<br>"; } else { //md5强碰撞 if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) { //反引号,可以执行该命令 echo `$cmd`; } else { echo ("md5 is funny ~"); } } ?>
对代码进行审计,file参数是用来读源码,后面主要是cmd,a,b的传参
代码对cmd进行了过滤,过滤了我所知道查看文件的命令,但使用\就可以进行绕过



md5碰撞可以用fastcoll来获取值,用fastcoll.exe -p *txt -o *.txt *.txt 生成文件,第一个参数文件内容可以随便写也可以是空的,然后读取文件的md5值


测试结果:

直接读取flag


浙公网安备 33010602011771号