[靶场笔记]第八章
tab绕过 非常少见的一种绕过形式,看标题就知道怎么操作了吧,想必就不用多介绍了 变量覆盖 先来看看下面这题 include('flag.php');error_reporting(0);$error='你还想要flag嘛?';$suces='既然你想要那给你吧!';foreach($_GET as $key => $value){ if($key==='error'){ die("what are you doing?!"); } $$key=$$value;}foreach($_POST as $key => $value){ if($value==='flag'){ die("what are you doing?!"); } $$key=$$value;}if(!($_POST['flag']==$flag)){ die($error);}echo "your are good".$flag."\n";die($suces); 想拿到flag的方法无非就是利用die($error)和die($suces)这两个函数 先上分别利用到这两个函数的payload 方法一: POST:error=a GET:a=flag 方法二 GET:a=flag&flag= 方法一利用的是一次POST判断和一次GET判断,达到第三变量a传值的目的 而方法二则是利用两次GET传值进行变量覆盖,并且绕过了下面的if(!($_POST['flag']==$flag)) md5无法解析数组 RT,返回值均为null parse_str() 把查询字符串解析到变量中。使用参考如下 传值的艺术 发现了一个十分微妙的地方,先来看看题目 <?php highlight_file(__FILE__); error_reporting(0); include("flag.php"); if(isset($_POST['v1'])){ $v1 = $_POST['v1']; $v3 = $_GET['v3']; parse_str($v1,$v2); if($v2['flag']==md5($v3)){ echo $flag; } } ?> 这里有两种方法可以拿到flag,第一种是通过md5匹配,另一种是通过md5处理数组返回均为null这个特点,结合弱比较来进行 但当我在传值的时候发现了一个有趣的现象,直接看下面这些结果你就能看出端倪 #有flag v1=flag=0cc175b9c0f1b6a831c399e269772661 v3=a #无flag v1="flag=0cc175b9c0f1b6a831c399e269772661" v3=a #有flag v1="flag=0" v3[]=1 #无flag v1=flag=0 v3[]=1 根据后两条有无flag的结果,结合弱比较表可以推断,有加双引号的一组将flag值赋值为了数字型的0,而每加的赋值为了字符型的0 ...