测试代码:
<?php
$a="flag.php";
if(preg_match("/flag/",$a)){
echo "错误";
}
else{
echo"正确";
}
?>
测试图片:
题目:
Polar靶场WEB简单狗黑子的RCE
一.转义绕过
$a="f\lag.php";
转义原理:
- 在 shell 中,反斜杠
\
用于转义特殊字符。 f\lag.php
→ 解析为flag.php
(文件名中的转义被忽略)。
测试图片:
二.数组绕过
$a=["flag.php"];
$a=array("f\lag.php");
原理:
- 数组作为参数:
preg_match()
期望的参数是字符串,但传入的是数组["f\lag.php"]
。 - 类型不匹配:PHP 会发出警告(
Warning: preg_match() expects parameter 2 to be string, array given
),但表达式返回false
。 - 条件判断:由于
preg_match()
返回false
,条件判断为false
,因此执行else
分支,输出 "正确"。
测试图片:
三.类型混淆绕过
$a="flag.php"*10;
原理:
- 如果右操作数是整数,PHP 会尝试将左操作数转换为数值类型(通常是 0),然后执行数值乘法。
- 由于
$a
是整数0
,PHP 会将其转换为字符串"0"
进行匹配。字符串"0"
中显然不包含f
,因此匹配失败,返回0
。
测试图片:
四.回溯限制次数绕过
默认回溯限制通常是 1000,000
(100 万)
$a = str_repeat("a", 1000000) . "flag.php";