摘要: 正常输入的请求中加入恶意代码,控制HTTP响应header中的字符(Location,Set-Cookie),注入一个 %0d%0a,可以控制首部,注入两个%0d%0a,可以控制主体, 浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。

1|00x01 什么是CRLF


•CRLF是“回车+换行”(\r和\n)/(%0d和%0a)的简称。

•CRLF利用: 正常输入的请求中加入恶意代码,控制HTTP响应header中的字符(Location,Set-Cookie),注入一个 %0d%0a,可以控制首部,注入两个%0d%0a,可以控制主体, 浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。

•形成原因:Web应用程序未对用户提交的数据进行严格过滤和检查,导致攻击者可以提交一些恶意字符如(CR、LF等)然后进行构造恶意代码进行攻击。

1.png



2|00x02 实验环境


•webgoat v5.4 

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

2.png

3.png


2.1 控制response主体——XSS弹窗

4.png

 构造payload如下(这里换行用%0A,空一行用%0A%0A,实验也是成功的):

image.png



2.2 控制response主体——XSS跳转

8.png

构造输入(换行符是%0d%0a,空一行是%0d%0a%0d%0a,实验也是成功的):

image.png

9.png

① server根据response1跳转:

10.png

② 发起第二个request,跳转

11.png

③ response跳转至baidu

12.png


2|52.4 缓存毒化 

Server收到带Last-Modified这个头,下次浏览器发送request就会带上If-Modified-Since或者If-Unmodified-Since,服务器收到这个request的If-Modified-Since后,通过读取它的值对比资源存在的地方的Last-Modified,服务器就告诉浏览器是否可以使用缓存。

13.png

14.png


3|00x03 说明


现在的主流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中文手册

转载于:https://www.cnblogs.com/flokz/p/crlf.html

上一篇:XXE漏洞原理及利用
下一篇:DOS+DNS放大攻击工具编...