渗透测试步骤

(1)检查提交到应用程序的全部参数的名称和参数值,了解它们支持的功能。

(2)从程序员的角度考虑问题,想象应用程序可能使用了哪些服务器端机制和技术来执行能够观察到的行为。

2.推测应用程序的行为

通常,应用程序以统一的方式执行其全部功能。这可能是因为不同的功能由同一位开发者编写,或者可遵循相同的设计规范,或者共享相同的代码组件。在这种情况下,我们可轻松推断出服务器端某个领域的功能,并据此类推其他领域的功能。

例如,应用程序可能会执行某种全局输入确认检查,如在处理前净化各种潜在的恶意输入。确定一个SQL盲注漏洞后,会遇到如何利用它的问题,因为专门设计的请求正被输入确认逻辑以不可见的方式修改。然而,应用程序中可能还有其他功能为正在执行的净化提供良好的反馈,例如,将用户提交的数据“反射”给浏览器的功能。可以使用这项功能测试不同编码及SQL注入有效载荷的各种变化形式的有效性,判定在应用输入确认逻辑后,必须提交哪些原始输入才能获得想要的攻击字符串。如果幸运,会发现整个应用程序使用相同的确认机制,让攻击者可以利用注入漏洞。

当在客户端保存敏感数据时,一些应用程序可使用定制的模糊处理方案,防止用户随意查阅和修改这些数据(请参阅第5章了解相关内容)。由于只能访问一个经过模糊处理的数据样本,这类模糊处理方案可能非常难以解译。然而,应用程序中可能具有某些功能,用户向其提交模糊字符串即可获得原始字符串。例如,错误消息中可能包含导致错误的反模糊处理数据。如果整个应用程序使用相同的模糊处理方案,就可以从某个位置(如cookie中)提取一个模糊字符串,将其提交给其他功能,解译出它的意义。而且,我们还可以对模糊处理方案执行逆向工程,系统地向该功能提交各种数据并监控反模糊处理后得到的结果。

最后,应用程序处理各种错误的方式并不一致,一些区域合理防御并处理错误,而另外一些区域则简单放弃错误,向用户返回冗长的调试信息(请参阅第15章了解相关内容)。在这种情况下,我们可以从某个区域返回的错误消息中收集相关信息,并将其应用于合理处理错误的其他区域。例如,通过系统化地操纵请求参数并监控得到的错误消息,可以判定相关应用程序组件的内部结构和逻辑;幸运的话会发现这个结构的某些方面还被沿用到其他区域。