谈谈CVE-2012-0053
0x00 前言
看编号就知道是个比较老的洞了,最近测东西的时候又碰到,找了点资料大致看了下形成原因,然后再分享下POC。
0x01 漏洞描述
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错误并显示原始错误请求头信息。
0x02 漏洞分析
在ap_get_mime_headers_core中,该函数对于两种错误http请求的检查返回的信息出现了问题。
1.缺陷代码如下,在检测http_header超长后会返回Bad Request并将错误的部分返回给浏览器
1 2 3 4 5 6 7 8 |
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)); |
2.如果检查HTTP请求头中的某个域不包含冒号,则也返回错误的部分
1 2 3 4 5 6 7 8 9 10 11 12 |
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; } |
近期评论