0%

DVWA通关指南-Command Injection(命令注入)

说明

  • 承接上文DVWA通关指南-Brute Force(爆破),本文对Command Injection(命令注入)进行实践
  • 命令注入攻击的目的是,在易受攻击的应用程序中注入和执行攻击者指定的命令。在这种情况下,执行不需要的系统命令的应用程序就像一个伪系统外壳,攻击者可以将其作为任何授权的系统用户使用。但是,执行命令的权限和环境与 web 服务相同。
  • 在大多数情况下,由于缺少正确的输入数据验证,攻击者对例如表单、cookies、HTTP标头等进行操控,使得命令注入攻击成为可能。此攻击也称为“远程命令执行 (RCE)”。
  • 通过 RCE 远程查找操作系统上 web 服务的用户以及机器主机名。

安全等级为LOW

  • 在该等级下允许直接输入指令给一些 PHP 函数,从而使这些指令将在操作系统上执行。在输入其他的一些的指令时,有可能发生不符合设计意图的命令被执行。

  • 这可以通过在请求中添加“一旦命令成功执行,运行此命令”的其他指令来完成。

源码分析

传入的 ping 命令的参数 target,并没有进行任何过滤。

image-20220129092654893

攻击方式

  • 由于在操作系统中,“&”、“&&”、“|”、“||”都可以作为命令连接符使用,由于网页没有对参数进行任何过滤,因此可以用连接符后面接上其他指令来执行
  • 输入: 127.0.0.1 && ls

image-20220129092930315

安全等级为Medium

开发人员已经知晓有关命令注入的一些问题,并使用了各种方式来过滤输入。然而这还不够,攻击者仍然可以使用各种其他系统语法来执行所需的命令。

源码审计

源码如下,medium 级别的代码加入了对“&&”和“;”的过滤,替换成空格

image-20220129095247031

攻击方式

  • 输入127.0.0.1&ls /usr/

  • “&&” 连接符不能用了,那我们就用 “&” 连接符来替代就行了。这里需要注意的是”&&”与” &”的区别:

  • Command 1&&Command 2

    • 先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
  • Command 1&Command 2

    • 先执行Command 1,不管是否成功,都会执行Command 2

image-20220129095529294

安全等级为High

源码审计

相比 Medium 级别的代码,High 级别的代码进一步完善了过滤的黑名单。

image-20220129104751233

攻击方式

输入:127.0.0.1|ls /usr/

image-20220129104936769

安全等级为impossible

源代码分析

mpossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

  • 代码中使用stripslashes() 函数 删除反斜杠,该函数可用于清理从数据库中或者从 HTML 表单中取回的数据。
  • explode() 函数 使用一个字符串分割另一个字符串,并返回由字符串组成的数组
  • is_numeric(string): 该检测string是否为数字或数字字符串

image-20220129105616718

总结与防御

在一些 Web 程序中需要调用一些执行系统命令的函数,例如 PHP 的 system、exec、shell_exec 函数等。当攻击者能够直接操作命令执行的参数,并且没有代码对传入的参数进行过滤时,攻击者就能将用于搞破坏的系统命令夹带进来让系统执行。
在 Windows 系统和 Linux 系统中都有一些管道符,这些管道符可以被用来拼接攻击指令:

  • “&&”:前面的语句正确执行时,才执行后面的语句;
  • “&”:前面的语句执行出错时,执行后面的语句;
  • “|”:将前面的语句运行的结果,当做后面语句的输入,显示后面语句的执行结果;
  • “||”:前面的语句出错时,执行后面的语句。

对于指令注入漏洞,比较好的防御方式是尽可能别用命令执行函数,对于输入的参数要做好黑名单过滤或者白名单验证