记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

nginx CVE-2013-4547漏洞分析

2013-11-21 16:14
漏洞细节不说了,从补丁反过来看:
ngx_http_parse.c的617行和670行分别加了个p--,原因是nginx在ngx_http_parse_request_line的时候,本来有个对非法字符的检查和对"/"字符后的"."字符的检查:
 538         case sw_check_uri:    
......
 593             case '\0':                                                     
 594                 return NGX_HTTP_PARSE_INVALID_REQUEST;                     
 595             }                                

 479         case sw_after_slash_in_uri:       
......
 500             case '.':                                                      
 501                 r->complex_uri = 1;                                        
 502                 state = sw_uri;                                            
 503                 break;          
但是只要uri中有个空格,state就会跳到下面的分支:
 598         /* space+ after URI */                                             
 599         case sw_check_uri_http_09:                                         
 600             switch (ch) {                                                  
 601             case ' ':                                                      
 602                 break;                                                     
 603             case CR:                                                       
 604                 r->http_minor = 9;                                         
 605                 state = sw_almost_done;                                    
 606                 break;                                                     
 607             case LF:                                                       
 608                 r->http_minor = 9;                                         
 609                 goto done;                                                 
 610             case 'H':                                                      
 611                 r->http_protocol.data = p;                                 
 612                 state = sw_http_H;                                         
 613                 break;                                                     
 614             default:                                                       
 615                 r->space_in_uri = 1;                                       
 616                 state = sw_check_uri;                                      
 617                 break;       
这边把两种字符的检查都略过去了,所以补丁最后的方案是在几个空格后处理的部分都加上了p--,来重过检查


利用上面,越过null字符检查就可以不被bad request扔出来,给后端的fastcgi传个带null字符的scriptname,之后就截断了,如果php-fpm没有限制security的extentsion,而且可以上传个带空格的东东来真找到这个文件,就可以执行了。至于目录跨越那个,则是因为越过了对"/"后面"."的检查,而导致r->complex_uri标志位没有set上,也就不会在ngx_http_process_request_uri中去做ngx_http_parse_complex_uri来处理掉uri中的"..",最后导致location没匹配到,穿越了。
知识来源: hi.baidu.com/tcpper/item/c8b540247179b7c4dcf69a93

阅读:150462 | 评论:0 | 标签:nginx

想收藏或者和大家分享这篇好文章→复制链接地址

“nginx CVE-2013-4547漏洞分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云