渗透测试步骤

(1)通常可以使用ping命令让服务器在一段时期内检测它的回环接口(loopback interface),从而触发时间延迟。Windows和UNIX平台在处理命令分隔符与ping命令方面存在一些细微的差别,但是,如果没有设置过滤,下面的通用测试字符串应该能够在两个平台上引起30秒的时间延迟。

img288a

如果应用程序过滤掉某些命令分隔符,为加大检测到命令注入漏洞的可能性,还应该轮流向每一个目标参数提交下面的每个测试字符串,并监控应用程序进行响应的时间。

img288b

(2)如果发生时间延迟,说明应用程序可能易于受到命令注入攻击。重复几次测试过程,确定延迟不是由于网络延时或其他异常造成的。可以尝试更改–n或–i参数的值,并确定经历 的时间延迟是否会随着提交的值发生对应的变化。

(3)使用所发现的任何一个可成功实施攻击的注入字符串,尝试注入另一个更有用的命令(如ls或dir),确定是否能够将命令结果返回到浏览器上。

(4)如果不能直接获得命令执行结果,还可以采用其他方法。

img002 可以尝试打开一条通向自己计算机的带外通道。尝试使用TFTP上传工具至服务器,使用telnet或netcat建立一个通向自己计算机的反向shell,并使用mail命令通过SMTP发送命令结果。

img002 可以将命令结果重定向到Web根目录下的一个文件,然后使用浏览器直接获取结果。例如:

img289a

(5)一旦找到注入命令的方法并能够获得命令执行结果,就应当确定自己的权限(通过使用whoami或类似命令,或者尝试向一个受保护的目录写入一个无害的文件)。然后就可以设法提升自己的权限,进而秘密访问应用程序中的敏感数据,或者通过被攻破的服务器攻击其他主机。

有时,由于某些字符被过滤掉,或者应用程序所使用的命令API的特殊行为,可能无法注入一个完全独立的命令。但是,攻击者仍然可以破坏所执行的命令的行为,得到想要的结果。

笔者曾遇到这样的情况:应用程序向操作系统命令nslookup传递用户输入,以查找用户提交的域名的IP地址。注入新命令所需的元字符被阻止,但允许使用<和>字符重定向命令的输入和输出。nslookup命令通常输入某个域名的IP地址,这似乎并未提供任何有效的攻击向量。但是,如果在这时提交一个无效域名,该命令就会输出错误消息,并在其中包含所查询的域名。通常,这种行为足以导致严重的攻击。

img002 提供一个服务器可执行的脚本代码片段,以替代要解析的域名。可以将这段脚本放在引号中,以确保命令解释器将其视为一个令牌。

img002 使用>字符将命令的输出重定向到Web根目录下的可执行文件夹中的某个文件。由操作系统执行的命令如下所示:

img289b

img002 运行以上命令时,会将以下输出重定向到可执行文件:

img289c

img002 然后,使用浏览器调用该文件,注入的脚本代码将在服务器上执行。由于大多数脚本语言允许页面同时包含客户端内容和服务器端标记,攻击者无法控制的错误消息部分将被视为明文,并且会执行注入脚本中的标记。因此,攻击者就可以通过利用受限制的命令注入条件,在应用程序服务器中插入一个不受限制的后门。