6.2 v.shopify.com响应分割攻击
难度:中
URL:v.shopify.com/last_shop?<YOURSITE>.myshopify.com
报告位置:https://hackerone.com/reports/106427/
报告日期:2015年12月22日
支付奖金:500美元
在2015年12月,HackerOne的用户krankopwnz报告Shopify没有对传递给URL v.shopify.com/last_shop?<YOURSITE>.myshopify.com的商店参数进行验证。Shopify发送一个GET请求给该URL,以便设置一个记录用户访问过的最后一个商店的cookie。结果是,攻击者可以在URL中包含CRLF字符%0d%0a(编码时不区分大小写)作为last_shop参数的一部分。当这些字符被提交后,Shopify将使用整个last_shop参数值来生成HTTP响应中新的头部信息。下面是krankopwnz注入商店名称中以测试如何利用该漏洞的一段代码:
因为Shopify用不进行过滤的last_shop参数值来设置HTTP响应中的cookie,所以响应消息就会包含浏览器解释为两个响应消息的全部内容。字符%20表示空格的编码,当响应消息被浏览器接收后就会解码。
上面的响应消息被浏览器接收后解码为:
响应消息的第一部分为原始的HTTP响应头。原始响应的内容长度被声明为0❶,这告诉了浏览器在响应体中没有内容。接着,CRLF开始了一个新的行和一个新的响应头。相应的文本建立了一个新的响应头信息并告诉浏览器有第二个响应,它是HTML格式的并且长度为19。然后在❷处,头信息又进一步给出了浏览器用于呈现的HTML。当一个恶意攻击者可以使用注入过的HTTP头时,就可能会存在各种各样的漏洞,这些漏洞中就包含我们将在第7章详细探讨的XSS。
要点
关注网站接受输入信息作为响应头的一部分内容的情况,特别是当这部分输入信息用于设置cookie时。当你在某个网站发现有这种情况时,试着提交%0D%0A(在IE浏览器中是%0A%20)以检查该网站是否对CRLF注入采取了防护措施。如果网站没有采取CRLF防护措施,就测试一下你是否能够加入新的消息头或者加入一个额外的完整HTTP响应。该漏洞在很少有用户交互时(如在GET请求中)最容易被利用。