DVWA-Command Injection模块实验

一、实验内容:

  1. 命令注入的3个条件;
  2. Low等级、Medium等级以及High等级;
  3. Impossible等级的机制以及修复、防御命令注入的方法。
  4. 描述上面之外你所知道的其他技巧(3种以上)。

二、实验过程与结果:

1、命令注入的3个条件;

命令注入的三个基本条件如下:

调用可执行系统命令的函数:这意味着应用程序中存在可以调用系统命令的函数或接口。

函数或函数的参数可控:攻击者需要能够控制这些函数或它们的参数,以便能够注入恶意命令。

可控参数能有效拼接注入命令:攻击者需要将恶意命令有效地拼接到原始命令中,使得系统执行恶意命令而不是预期的命令。

2、Low等级

192.168.196.1

相当于执行ping 192.168.196.1

可以看到输入 echo hello也不能正常执行

接着我们看一下源码:

利用管道命令符:|

管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

192.168.196.1 | echo hello

实现:

192.168.196.1 && ipconfig

发现是乱码:进入到D:\Teachings\phpstudy_pro\WWW\DVWA\dvwa\includes这是我自己的目录下找到dvwaPage.inc.php这个文件

将字符集编码utf-8改为GB2312

问题完美解决:

3、Medium等级;

可以看到&&被过滤掉了

输入:192.168.196.1 & ipconfig

4、High等级

可以看源码:

| 明显后面有个空格,所以如果不使用空格的话依然可以绕过:

|后面有个空格,去掉|后面的空格就行了

实现:

输入:192.168.196.1 |ipconfig

5、Impossible等级的机制以及修复、防御命令注入的方法。 

查看源码:

这里加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。这个确实已经结合业务场景来进行约束了。

修复和防御命令注入的方法包括:

  1. 使用安全的API:尽可能使用已经实现的库函数,这些库函数设计用来防止注入攻击。
  2. 参数化查询:对于数据库查询,使用参数化查询而不是动态构造SQL语句。
  3. 限制权限:运行应用程序的账户应该具有尽可能少的权限,以减少注入攻击的影响。
  4. 错误处理:避免在错误消息中泄露敏感信息,如数据库结构或系统信息。
  5. 输入验证:对所有用户输入进行严格的验证,包括前端和后端验证。
  6. 输出编码:在输出数据到浏览器或其他客户端之前,进行适当的编码处理。

6、描述上面之外你所知道的其他技巧(3种以上)。

  1. 使用时间盲注:如果注入攻击不能直接返回结果,可以通过比较查询时间来推断信息。
  2. 利用日志注入:有时候,注入的命令会在日志文件中留下痕迹,可以被用来泄露信息。
  3. 利用文件包含漏洞:如果命令注入可以控制文件路径,可能通过包含服务器上的文件来泄露信息。
  4. 使用布尔盲注:通过观察应用程序对真/假查询的响应时间差异,来推断数据库中的内容。
  5. 堆叠查询:在某些情况下,可以在一个查询的末尾添加额外的命令或查询。
### 文件包含漏洞与命令注入问题分析 文件包含漏洞通常允许攻击者通过恶意构造的参数来访问或执行服务器上的任意文件。而命令注入则是指攻击者能够通过输入特定字符串破坏原有命令结构并执行其他系统指令。 在DVWA(Damn Vulnerable Web Application)环境中,当尝试利用`Command Injection`功能模块时,如果向其传递一个IP地址并通过提交按钮触发命令执行,则可能会观察到返回的结果中存在中文字符乱码的现象[^1]。这种现象通常是由于编码设置不一致引起的。 #### 编码问题的根本原因 在PHP环境下运行某些外部程序(如`ping`),这些程序可能输出非UTF-8编码的内容(例如GBK)。然而,默认情况下Web应用界面期望接收的是UTF-8编码数据流。因此,在处理来自不同源的数据时如果没有正确转换编码格式就会引发显示异常——即所谓的“乱码”。 为了修复这一问题可以采取以下措施: 1. **修改响应头中的Content-Type字段** 确保HTTP头部包含了正确的charset声明。可以通过调整如下代码实现: ```php header('Content-Type: text/html; charset=utf-8'); ``` 2. **使用iconv函数进行编码转换** 如果已知原始数据采用的具体编码方式(比如GBK),那么可以在将其呈现给用户之前先做一次转码操作。下面是一个简单的例子展示如何运用iconv库完成这项工作: ```php $output = shell_exec($cmd); echo iconv('gbk', 'utf-8//IGNORE', $output); // 将GB2312/GBK编码转化为UTF-8编码 ``` 上述方法均有助于改善因编码差异而导致的信息失真状况。另外值得注意的是,在实际开发过程中应当尽可能减少对外部不可控资源调用次数,并严格验证所有传入系统的变量值合法性以防止潜在安全风险的发生[^3]。 对于更深层次的安全加固建议参阅有关资料进一步学习了解最佳实践指南[^2]。 ```php function safeExec($command){ $whitelist = ['localhost','127.0.0.1']; // 定义白名单列表 preg_match('/\b(?:\d{1,3}\.){3}\d{1,3}\b/', $command, $matches); if(in_array($matches[0], $whitelist)){ return exec($command); }else{ throw new Exception("Invalid IP Address"); } } ``` 以上示例展示了如何创建一个基本防护机制用于过滤非法请求,仅允许指定范围内的主机名或者IPv4地址作为合法目标参与后续流程之中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值