说明
- 承接上文DVWA通关指南-Brute Force(爆破),本文对Command Injection(命令注入)进行实践
- 命令注入攻击的目的是,在易受攻击的应用程序中注入和执行攻击者指定的命令。在这种情况下,执行不需要的系统命令的应用程序就像一个伪系统外壳,攻击者可以将其作为任何授权的系统用户使用。但是,执行命令的权限和环境与 web 服务相同。
- 在大多数情况下,由于缺少正确的输入数据验证,攻击者对例如表单、cookies、HTTP标头等进行操控,使得命令注入攻击成为可能。此攻击也称为“远程命令执行 (RCE)”。
- 通过 RCE 远程查找操作系统上 web 服务的用户以及机器主机名。
安全等级为LOW
在该等级下允许直接输入指令给一些 PHP 函数,从而使这些指令将在操作系统上执行。在输入其他的一些的指令时,有可能发生不符合设计意图的命令被执行。
这可以通过在请求中添加“一旦命令成功执行,运行此命令”的其他指令来完成。
源码分析
传入的 ping 命令的参数 target,并没有进行任何过滤。
攻击方式
- 由于在操作系统中,“&”、“&&”、“|”、“||”都可以作为命令连接符使用,由于网页没有对参数进行任何过滤,因此可以用连接符后面接上其他指令来执行
- 输入:
127.0.0.1 && ls
安全等级为Medium
开发人员已经知晓有关命令注入的一些问题,并使用了各种方式来过滤输入。然而这还不够,攻击者仍然可以使用各种其他系统语法来执行所需的命令。
源码审计
源码如下,medium 级别的代码加入了对“&&”和“;”的过滤,替换成空格
攻击方式
输入
127.0.0.1&ls /usr/
“&&” 连接符不能用了,那我们就用 “&” 连接符来替代就行了。这里需要注意的是”&&”与” &”的区别:
Command 1&&Command 2
- 先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
Command 1&Command 2
- 先执行Command 1,不管是否成功,都会执行Command 2
安全等级为High
源码审计
相比 Medium 级别的代码,High 级别的代码进一步完善了过滤的黑名单。
攻击方式
输入:127.0.0.1|ls /usr/
安全等级为impossible
源代码分析
mpossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
- 代码中使用
stripslashes()
函数 删除反斜杠,该函数可用于清理从数据库中或者从 HTML 表单中取回的数据。 explode()
函数 使用一个字符串分割另一个字符串,并返回由字符串组成的数组is_numeric(string)
: 该检测string是否为数字或数字字符串
总结与防御
在一些 Web 程序中需要调用一些执行系统命令的函数,例如 PHP 的 system、exec、shell_exec 函数等。当攻击者能够直接操作命令执行的参数,并且没有代码对传入的参数进行过滤时,攻击者就能将用于搞破坏的系统命令夹带进来让系统执行。
在 Windows 系统和 Linux 系统中都有一些管道符,这些管道符可以被用来拼接攻击指令:
- “&&”:前面的语句正确执行时,才执行后面的语句;
- “&”:前面的语句执行出错时,执行后面的语句;
- “|”:将前面的语句运行的结果,当做后面语句的输入,显示后面语句的执行结果;
- “||”:前面的语句出错时,执行后面的语句。
对于指令注入漏洞,比较好的防御方式是尽可能别用命令执行函数,对于输入的参数要做好黑名单过滤或者白名单验证
- 本文主要来自DVWA通关详解