CVE-2012-0053分析报告
发布时间:2012-02-03   作者:启明星辰

Original release date:01/28/2012

 

Last revised:02/01/2012

 

Source: US-CERT/NIST

 

概述:

 

Apache HTTP Server 2.2.x多个版本没有正确严格限制HTTP请求头信息,HTTP请求头信息超过LimitRequestFieldSize长度时服务器返回400(Bad Request)错误,并在返回信息中将出错请求头内容爆出,攻击者可以利用该漏洞获取httponly cookies。

 

受影响软件版本:
Apache Http Server:
Affected: 2.2.21, 2.2.20, 2.2.19, 2.2.18, 2.2.17, 2.2.16, 2.2.15, 2.2.14, 2.2.13, 2.2.12, 2.2.11, 2.2.10, 2.2.9, 2.2.8, 2.2.6, 2.2.5, 2.2.4, 2.2.3, 2.2.2, 2.2.0

 

漏洞描述:

 

1、当HTTP请求头长度大于apache配置LimitRequestFieldSize长度时,服务器返回400错误页面中会携带LimitRequestFieldSize长度的错误请求头内容,如Cookies,User-agent等。

 

2、HTTP请求头长度不包含HTTP请求头名称与“:”。

 

3、Cookies请求头不包含多个cookies之间的空格,为实际多个cookies的长度总和。

 

4、Apache默认配置LimitRequestFieldSize长度为8196,浏览器正常访问默认截取请求头长度最大为4k

 

5、任意请求头(不限制于Cookie)超过LimitRequestFieldSize长度,服务器都会返回400错误并显示原始错误请求头信息。

 

原文描述:

 

1) HTTP request header line is longer than configured LimitRequestFieldSize limit.  In this case, httpd adds the line (actually, a prefix of it read before reaching the limit) to its default 400 error page. 

 

2) HTTP request header line is continuation of the previous line and both lines combined together exceed configured LimitRequestFieldSize limit.  In this case, httpd adds previous line to its default 400 error page.  Note: previous line here may refer to a concatenation of more than one line, if previous lines were continuations too. 

 

3) HTTP request header line does not contain : , which is a separator between the header name and its value.

 

解决方案:

 

升级apache版本至2.2.22

 

漏洞原因分析:

 

具体出现问题的函数在ap_get_mime_headers_core中,该函数对于两种错误http请求的检查返回的信息出现了问题,具体如下:

 

1.在对http_header超长的检查后,会返回错误码Bad Request,并将错误的部分返回给浏览器

 

有漏洞的代码如下:
field[len - 1] = '\0';
apr_table_setn(r->notes, "error-notes",
apr_pstrcat(r->pool,
     "Size of a request header field "
        "exceeds server limit.<br />\n"
        "<pre>\n",
        ap_escape_html(r->pool, field),
        "</pre>\n", NULL));
新修改
apr_table_setn(r->notes, "error-notes",
apr_psprintf(r->pool,
     "Size of a request header field "
        "exceeds server limit.<br />\n"
        "<pre>\n%.*s\n</pre>/n",
        field_name_len(field), //这是添加的一个函数,返回一个需要格式化的字符串长度。
        ap_escape_html(r->pool, field)));
               
field_name_len函数如下:
#define LOG_NAME_MAX_LEN 80
static int field_name_len(const char *field)
{
    const char *end = ap_strchr_c(field, ':');
    if (end == NULL || end - field > LOG_NAME_MAX_LEN)
        return LOG_NAME_MAX_LEN;
    return end - field;
}
检查长度是否大于80个字节或者是否包含冒号,如果大于该限制长度或者不包含冒号,则只拼凑80个字节的内容;如果相反,则按照原样返回。
2.如果检查HTTP请求头中的某个域不包含冒号,则也返回错误的部分,代码如下:
if (!(value = strchr(last_field, ':'))) { /* Find ':' or    */
r->status = HTTP_BAD_REQUEST;      /* abort bad request */
    apr_table_setn(r->notes, "error-notes",
     apr_pstrcat(r->pool,
      "Request header field is "
      "missing ':' separator.<br />\n"
         "<pre>\n",
         ap_escape_html(r->pool,
          last_field),
       "</pre>\n", NULL));
    return;
}
修复漏洞的代码如下:
if (!(value = strchr(last_field, ':'))) { /* Find ':' or    */
r->status = HTTP_BAD_REQUEST;      /* abort bad request */
    apr_table_setn(r->notes, "error-notes",
     apr_psprintf(r->pool,
         "Request header field is "
            "missing ':' separator.<br />\n"
            "<pre>\n%.*s</pre>\n",
            (int)LOG_NAME_MAX_LEN, //这里同样作了长度限制,直接将长度限制为80个字节
           ap_escape_html(r->pool,last_field)));

 

从以上描述可以看出,在新版本代码对漏洞的修补中,如果触发了上述两种条件,通过限制返回字符串的长度避免了信息泄露。


漏洞利用方法:

发送http畸形报文后,浏览器显示cookies

 

 


解决方案:

1、 更新至NIPS/WAF产品最新特征库

文章来源:http://www.venustech.com.cn/
  • 公司总部 | 分支机构 | 法律声明 | 投资者关系 | 400-624-3900 800-810-6038
  • © 启明星辰1996-2015 版权所有 京ICP备05032414号 京公网安备11010802024551号