类型: 安全缺陷

    HTTP响应截断是由于应用程序未对用户提交的数据进行严格过滤,当用户恶意提交包含CR(回车,即URL编码%0d或r)和LF(换行符,即URL编码%0a或n)的HTTP请求,服务器可能会创建两个 HTTP 响应,攻击者可以控制第二个响应并加载攻击。攻击者可控制响应的内容构造 XSS 攻击,其中响应中包含恶意的 JavaScript 或其它代码在用户的浏览器中执行,也有可能让用户重定向到攻击者控制的Web内容或在用户的主机上执行恶意操作。
    例1:下列代码片段中,程序读取HTTP请求参数AUTHOR_PARAM的值,并将它设置到HTTP响应的Cookie中。

    1. String author = request.getParameter(AUTHOR_PARAM);
    2. ...
    3. Cookie cookie = new Cookie("author", author);
    4. cookie.setMaxAge(cookieExpiration);
    5. response.addCookie(cookie);

    正常情况下,如果请求中提交参数是字符串Jane Smith,那么包含Cookie的HTTP响应头格式如下:
    HTTP/1.1 200 OK

    Set-Cookie: author=Jane Smith

    但是如果攻击者提交一个恶意字符串,比如Wiley Hacker\r\nHTTP/1.1 200 OK\r\n…,那么HTTP应答就会被分割成下面两个响应:

    HTTP/1.1 200 OK

    Set-Cookie: author=Wiley Hacker
    HTTP/1.1 200 OK

    这样第二个响应已完全由攻击者控制,攻击者可以用所需的头文件和正文内容构建该响应实施攻击。

    例2:以下Android代码会从Activity中直接取值,并将其置于一个HTTP响应的cookie头文件中,而该值很可能是受用户控制的。

    1. CookieManager cookieManager = CookieManager.getInstance();
    2. Intent intent = activity.getIntent();
    3. String value = intent.getStringExtra("value");
    4. cookieManager.setCookie("url", value);