【Nginx】Nginx 文件名逻辑漏洞(CVE-2013-4547)

所谓智慧,就是孤独者在人声鼎沸的市场上对自己的窃窃私语。——尼采

漏洞介绍

这个漏洞实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。

漏洞影响

Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 范围较广

环境搭建

使用vulhub复现漏洞

cd vulhub/nginx/CVE-2013-4547
docker-compose up -d

漏洞复现

访问 http://192.168.37.128:8080

 环境搭建成功

我们先看看后端代码

可以看到,是黑名单过滤,不能上传.php文件。

burp抓包,我们上传一张图片码123.png[空格]

注意:如果是windows服务器则不需要文件名后面带空格,因为windows创建文件名或查找文件名时,默认会去掉文件名后的空格,再执行操作。

可以看到成功上传,我们访问看看

可以访问,现在要做的就是要让php处理器执行图片码。

在Nginx中Nginx会把所有的php文件交给fast-cgi(相当于webserver与php解释器之间的通信协议)进行处理。所以我们访问/uploadfiles/123.png并用burp抓包,截断试试。因为当我们访问

/uploadfiles/123.png[0x00].php时,Nginx还是会将文件交给fast-cgi处理,但是fast-cgi拿到文件后,会把png后面的过滤,也就拿到了123.png,然后使用php解释器编译执行123.png,后门运行就成功了,理论可行,试试。

 不成功,返回信息什么也没有。经过查阅资料发现在对url的解析过程中,当路径中存在’.’或url存在’\0’会有如下处理:

#!cpp
case sw_check_uri:      
   ……
       case '.': 
           r->complex_uri = 1;  //此作为flag会判断使用ngx_http_parse_complex_uri方法,对路径修复
           state = sw_uri; 
           break;    
casesw_check_uri:    
   ……
        case '\0':   //当遇到\0是,将会判断为非法字符
           return NGX_HTTP_PARSE_INVALID_REQUEST;  

代码参考:CVE-2013-4547 Nginx解析漏洞深入利用及分析 – 百度安全中心 | 漏洞人生

但如果nginx发现URI中存在空格会跳到如下代码

 2

上面代码执行完后state='sw_check_uri’然后继续处理URI中的剩余部分,这说明了如果空格和零截断符相邻的话nginx就不会检测到零截断并放回错误了,这是一个逻辑漏洞,所以通过这种方式我们就可以在URI中开心的使用零截断的,这就是CVE-2013-4547

代码参考:漏洞复现之CVE-2013-4547_Blood_Pupil的博客-CSDN博客

所以我们将上面的url改造一下

http://192.168.37.128:8080/uploadfiles/123.png[20][00].php

访问试试

复现成功


版权声明:本文为ab_bcd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。