所谓智慧,就是孤独者在人声鼎沸的市场上对自己的窃窃私语。——尼采
漏洞介绍
这个漏洞实和代码执行没有太大的关系,主要原因是错误地解析了请求的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; 但如果nginx发现URI中存在空格会跳到如下代码
上面代码执行完后state='sw_check_uri’然后继续处理URI中的剩余部分,这说明了如果空格和零截断符相邻的话nginx就不会检测到零截断并放回错误了,这是一个逻辑漏洞,所以通过这种方式我们就可以在URI中开心的使用零截断的,这就是CVE-2013-4547
所以我们将上面的url改造一下
http://192.168.37.128:8080/uploadfiles/123.png[20][00].php访问试试

复现成功