注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

那些星星点点的微芒,终会成为燃烧生命的熊熊之光

 
 
 
 
 

日志

 
 

Apache httponly cookie获取  

2012-08-24 11:48:38|  分类: 安全一路走来 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

从腾讯分站上发现了这个,提交地址

引用下二哥 gainover  给力的分析...


相关阅读

PHP程序 httponly cookie获取

来自VIP同学在drops中的分析

httponly cookie获取及利用


概述

Apache HTTP Server 2.2.x多个版本没有正确严格限制HTTP请求头信息,HTTP请求头信息超过LimitRequestFieldSize长度时服务器返回400(Bad Request)错误,并在返回信息中将出错请求头内容爆出,攻击者可以利用该漏洞获取cookie,仅管对cookie 加了httponly 属性;由于在请求头中填入的数据与返回400时的数据一致;so,有蓄意者就可以构造一个基于应用层的DDOS。


影响版本
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


当请求头中长度大于 Apache LimitRequestFieldSize 限制长度时,此时server 会返回400错误页并连原始请求头中的错误信息一并显示。

1;修改请求头,如cookie值,:

Apache httponly cookie - 墨水心 - 墨水心


2;显示如下: 

Apache httponly cookie - 墨水心 - 墨水心


原因分析

具体出现问题的函数在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)));

 

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


 漏洞修复

做错误处理或升级Apache即可。

  评论这张
 
阅读(215)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017