3.2 客户端HPP
客户端HPP漏洞使攻击者可以向URL中注入额外的参数,从而对客户端产生影响(客户端最常见的操作方式是个人电脑,通常是通过浏览器触发,并不是发生在网站的服务器端)。
Luca Carettoni和Stefano di Paola在他们的演讲中引用了一个这种类型的例子(参见http://host/page.php?par=123%26action=edit),以下为服务器端代码:
此代码基于par的值(用户输入的参数)生成一个新的URL。在此示例中,攻击者将123%26action=edit作为par的值传递,以生成其他额外的意外参数。&的URL编码值为%26,这意味着当解析URL时,%26被解释为&。该值将一个附加参数添加到生成的href中,而无须在URL中明确显示action参数。如果参数使用123&action=edit而不是%26,则&将被解释为分隔两个不同的参数。但是由于该站点仅在其代码中使用参数par,故action参数被丢弃。使用%26通过确保action最初不会被识别为一个单独的参数来解决这个问题,因此par被赋值为123%26action=edit。
接下来,将par(&编码为%26)传递给htmlspecialchars函数❶。该函数将特殊字符(例如%26)转换为它们的HTML编码值,从而将%26转换为&;(在HTML中代表&的HTML值),在这里该字符具有特殊含义。转换后的值将存储在$val中,在那之后,通过将$val赋值给❷处的href属性生成新链接。因此生成的链接变成了<a href="/page.php?action=view&par=123&action=edit">。这意味着攻击者已设法将额外的action=edit添加到href的URL,这可能造成了漏洞,具体危害性取决于应用程序如何处理非预期的action参数。
以下三个示例详细介绍了在HackerOne和Twitter上发现的客户端和服务器端的HPP漏洞。这些示例都涉及URL参数篡改。但是你应该注意,所有例子使用的方法或产生的原因都不相同,这进一步说明在寻找HPP漏洞时进行全面测试是十分重要的。