MRCTF2020套娃
打开网页查看源代码
关于$_SERVER['QUERY_STRING']取值,例如:
http://localhost/aaa/?p=222
$_SERVER['QUERY_STRING'] = "p=222";
substr_count()函数计算子串在字符串中出现的次数
PS:子串区分大小写
上述代码不能出现'_'和'%5f',可以用‘ ’或‘.’或‘ %5F’绕过
通过get取得的参数b_u_p_t不等于23333但是正则,匹配需要匹配到23333所以这里用%0a(因为正则匹配中'^'和'$'代表的是行的开头和结尾,所以能利用换行绕过)绕过
payload:?b%5Fu%5Fp%5Ft=23333%0a
打开secrettw.php查看源码
复制注释代码放进控制台
随便POST一个Merak值,回显如下
分析一下代码
1.需要IP地址为127.0.0.1 在header中加client-ip:127.0.0.1
2.file_get_contents用php伪协议绕过
2333=php://input
post:todat is a happy day
3.change函数的作用,传入的参数先进行base64解码,然后将字符转化成ASCII并且+$i*2
反写change函数,exp:
<?php
function unchange($v){
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) - $i*2 );
}
return $re;
}
$real_flag = unchange('flag.php');
echo base64_encode($real_flag);
?>
得到ZmpdYSZmXGI=
用burp传入参数得到flag