[靶场笔记]第七章
intval函数 用于获取变量的整数值(将其他进制转换成10进制输出) 数组绕过 来看看下面这段代码 include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; } } 绕过方法很简单,把num变成数组就行,即num[]=1 +号利用 碰到一道比较巧妙的绕过题,先看代码 include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]|\./i", $num)){ die("no no no!!"); } if(!strpos($num, "0")){ die("no no no!!!"); } if(intval($num,0)===4476){ echo $flag; }} 可以看到要想拿到flag,就得使用转换结果为4476的num值 但是显然8与16进制无法直接使用。怎么办呢?仔细观察if(!strpos($num, "0")),可以看这句用来阻止8进制使用的判断其实原理是判断第一位是不是0。怎么办呢?看到这里你应该也猜到了,利用+在url中代表空格的特点,最后的payload是num=+010574 ./绕过 同样也是一道很有意思的绕过题 if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); } } 虽然没法直接读取flag.php,但只要在前面加个./就能混淆视听 md5()函数空值 在题目中碰到md5函数第一反应不应该是去撞库(要是实在没办法也不是不行),而是想办法让其成为0或空值。来看看下面代码 if (isset($_POST['a']) and isset($_POST['b'])) { if ($_POST['a'] != $_POST['b']) if (md5($_POST['a']) === md5($_POST['b'])) echo $flag; } 当md5函数参数为数组的时候会发生错误,并返回NULL。可以利用这点进行构造payload a[]=1&b[]=2 ...