渗透测试步骤

这种类型的漏洞表现在许多不同的情况下,包括账户恢复令牌;基于令牌访问经过验证的资源;以及向客户端发送的、需要防篡改或对用户不可读的任何其他值。

(1)在应用程序中查找任何使用加密(而非散列)的位置。确定任何应用程序加密或解密用户提交的值的位置,并尝试替代在应用程序中发现的任何其他加密值。尝试在应用程序中导致可以揭示加密值,或可以在屏幕上“有意”显示加密值的错误。

(2)确定应用程序中可以通过提交加密值导致在响应中显示对应的解密值的位置,以查找“提示提示”漏洞。确定这种漏洞是否会导致敏感信息(如密码或信用卡)被披露。

(3)确定可以通过提交明文值导致应用程序返回对应的加密值的位置,以查找“提示加密”漏洞。确定是否可以通过指定任意值,或应用程序将会处理的恶意有效载荷,对这种漏洞加以利用。

11.2.2 例2:欺骗密码修改功能

我们曾在一家金融服务公司使用的Web应用程序以及AOL AIM企业网关应用程序中发现过这种逻辑缺陷。

1.功能

应用程序为终端用户提供密码修改功能。它要求用户填写用户名、现有密码、新密码与确认新密码字段。

应用程序还为管理员提供密码修改功能。这项功能允许他们修改任何用户的密码,而不必提交现有密码。这两项功能在同一个服务器端脚本中执行。

2.假设

应用程序为用户和管理员提供的客户端界面仅有一点不同:在管理员界面中没有用于填写现有密码的字段。当服务器端应用程序处理密码修改请求时,它通过其中是否包含现有密码参数确定请求是来自管理员,还是来自普通用户。换句话说,它认为普通用户总会提交现有密码参数。

负责执行这项功能的代码如下:

img322a

3.攻击方法

一旦确定开发者做出的假设后,逻辑缺陷就变得非常明显。当然,普通用户也可以提交并不包含现有密码参数的请求,因为用户控制着他们提出的请求的每一个方面。

这种逻辑缺陷可能给应用程序造成巨大破坏。攻击者可利用这种缺陷重新设置任何用户的密码,完全控制他们的账户。