渗透测试步骤

有几种方法可以对通过客户端传送的模糊数据实施攻击。

(1)如果知道模糊字符串的明文值,可以尝试破译模糊处理所使用的模糊算法。

(2)如第4章所述,应用程序的其他地方可能包含一些功能,攻击者可以利用它们返回由自己控制的一段明文生成的模糊字符串。在这种情况下,攻击者可以向目标功能直接提交任意一个有效载荷,获得所需要的字符串。

(3)即使模糊字符串完全无法理解,也可以在其他情况下重新传送它的值,实现某种恶意效果。例如,前面显示的表单的pricing_token参数中可能包含一个加密的产品价格。尽管攻击者无法对选择的任意价格以相同的算法进行加密,但是,他们可以把另一个更加便宜的产品的加密价格复制过来,放在这里提交。

(4)如果其他所有方法全都无效,还可以通过提交畸形字符串——如包含超长值、不同字符集等错误的字符串——尝试攻击负责对模糊数据进行解密或去模糊处理的服务器端逻辑。

5.1.6 ASP.NET ViewState

ASP.NET ViewState是一种通过客户端传送模糊数据的常用机制。它是一个由所有ASP.NET Web应用程序默认创建的隐藏字段,其中包含关于当前页面状态的序列化信息。ASP.NET平台使用ViewState提高服务器的性能——服务器通过它在连续提交请求的过程中保存用户界面中的元素,而不需要在服务器端维护所有相关的状态信息。例如,服务器会根据用户提交的参数填充下拉列表。用户随后提交请求时,浏览器并不向服务器提交列表的内容。相反,浏览器提交隐藏的ViewState字段,其中包含该列表的序列化格式。然后,服务器对ViewState进行去序列化处理,并重新建立相同的列表,再将其返回给用户。

除这种核心功能外,开发者还在连续提交请求的过程中使用ViewState保存任意信息。例如,应用程序可以不将产品价格保存在隐藏表单字段中,而是将其保存在ViewState中,如下所示:

string price = getPrice (prodno);

ViewState.Add(“price”, price);

返回给用户的表单如下所示:

img112a

当用户提交表单时,浏览器将发送以下请求:

img112b

很明显,上面的请求中并不包含产品价格——只有订购的数量和模糊处理后的ViewState参数。随意更改这个参数会导致应用程序显示错误消息,并因此终止购买交易。

ViewState参数实际上是一个Base64编码字符串,用户可以轻松对这个字符串进行解码,以查看其代表的价格参数,如下所示:

img112c

img004  提示  在对一个可能为Base64编码的字符串进行解码时,用户常常会犯一个错误,即从字符串的错误位置开始解码。鉴于Base64编码的特点,如果从错误的位置开始解码,解码后的字符串中会出现乱码。Base64采用基于数据块的格式,每4字节的编码数据解码后会变为3个字节。因此,如果解码后的Base64字符串并无意义,请尝试从编码字符串中的4个相邻的偏移值位置开始解码。

默认情况下,ASP.NET平台通过在ViewState中加入一个密钥散列(称为MAC保护)来防止篡改。但是,一些应用程序禁用了这项默认启用的保护,这意味着攻击人员可以修改ViewState的值,以确定其是否会对应用程序的服务器端处理产生影响。

Burp Proxy提供一个指示ViewState是否受MAC保护的ViewState解析器,如图5-3所示。如果ViewState未受到保护,则攻击人员可以使用ViewState树下的十六进制编辑器在Burp中编辑ViewState的内容。在向服务器或客户端发送消息时,Burp将发送经过更新的ViewState,具体到前面的示例,这样就可以更改购物时商品的价格。

img113

图5-3 如果未设置EnableViewStateMac选项,Burp Proxy可解码并显示ViewState,允许攻击者查看其内容并对它们进行编辑