一、实验内容:
- 命令注入的3个条件;
- Low等级、Medium等级以及High等级;
- Impossible等级的机制以及修复、防御命令注入的方法。
- 描述上面之外你所知道的其他技巧(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进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。这个确实已经结合业务场景来进行约束了。
修复和防御命令注入的方法包括:
- 使用安全的API:尽可能使用已经实现的库函数,这些库函数设计用来防止注入攻击。
- 参数化查询:对于数据库查询,使用参数化查询而不是动态构造SQL语句。
- 限制权限:运行应用程序的账户应该具有尽可能少的权限,以减少注入攻击的影响。
- 错误处理:避免在错误消息中泄露敏感信息,如数据库结构或系统信息。
- 输入验证:对所有用户输入进行严格的验证,包括前端和后端验证。
- 输出编码:在输出数据到浏览器或其他客户端之前,进行适当的编码处理。
6、描述上面之外你所知道的其他技巧(3种以上)。
- 使用时间盲注:如果注入攻击不能直接返回结果,可以通过比较查询时间来推断信息。
- 利用日志注入:有时候,注入的命令会在日志文件中留下痕迹,可以被用来泄露信息。
- 利用文件包含漏洞:如果命令注入可以控制文件路径,可能通过包含服务器上的文件来泄露信息。
- 使用布尔盲注:通过观察应用程序对真/假查询的响应时间差异,来推断数据库中的内容。
- 堆叠查询:在某些情况下,可以在一个查询的末尾添加额外的命令或查询。