百度空间 | 百度首页 
 
查看文章
 
[updated]Nginx ngx_http_parse_complex_uri() buffer underflow vulnerability
2009-09-17 12:04
[UPDATED 2009-9-17]
感谢热心的朋友,现在已经能触发了.
默认情况就可以触发这个heap overflow. 所以这个危险还是很大的.

///////////////
看来挺严重的,http://www.kb.cert.org/vuls/id/180065
研究了一小时暂时没能触发这个漏洞,先放着, 看看哪位大虾能把它触发了,或者证明构造的畸形数据触发不到那个地方?  我暂时没能构造出数据到达那个地方.

补丁看起来比较简单,heap overflow
Index: src/http/ngx_http_parse.c
===================================================================
--- src/http/ngx_http_parse.c (revision 2410)
+++ src/http/ngx_http_parse.c (revision 2411)
@@ -1134,11 +1134,15 @@
#endif
case '/':
state = sw_slash;
- u -= 4;
- if (u < r->uri.data) {
- return NGX_HTTP_PARSE_INVALID_REQUEST;
- }
- while (*(u - 1) != '/') {
+ u -= 5;
+ for ( ;; ) {
+ if (u < r->uri.data) {
+ return NGX_HTTP_PARSE_INVALID_REQUEST;
+ }
+ if (*u == '/') {
+ u++;
+ break;
+ }
u--;
}
break;

类别:技术讨论 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2009-09-17 14:46 | 回复
我分析的结果是这样的,当请求的url中兼容符号,且NGIX开启了/合并功能的情况下。如果请求的url开始是 /../ 那么下面的这段代码会被触发
case '/':
state = sw_slash;
u -= 4;
if (u < r->uri.data) {
    return NGX_HTTP_PARSE_INVALID_REQUEST;
}
while (*(u - 1) != '/') {
           u--;
}
break;

这时候 r->uri.data = (uint8_t*)waf_palloc(r->pool, r->uri.len + 1);
    u = r->uri.data;
那么u -= 4; 就到达r->uri.data的位置,然后再u--
应该会出问题。

 
2
2009-09-17 17:12 | 回复
开始我也是这样认为的,但是达到不了出问题的地方.

前面还有个ngx_http_read_request_header函数做了不少事情
 
3
2009-09-21 09:33 | 回复
可以说一下如何构造url吗?
 
4
2009-09-24 10:11 | 回复
从patch的内容来看:

其实就是对/../这种情况进行处理,在运行到该处代码时,u指针指向了/
xx/../
^
u
那么u-=4的话,u的指针指向了
xx/../
^
u
在这种情况下,只要u不小于r->uri.data,就会进入到下一个while循环中,直到发现有'/',才会停止。

那么问题的关键,就是如何构造/../之前的那个字符。
我尝试构造了//../,但是 r->uri.data这个指针是当有两个//开始的话,将会指向第二个/。这样就不会满足
u不小于r->uri.data的条件。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu