漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现
前言 影响版本:Nginx 0.8.41 到 1.4.3 / 1.5.0 到 1.5.7。
利用条件:php-fpm.conf中的security.limit_extensions为空。
建议在学习该漏洞前先学习nginx的原理:https://zhuanlan.zhihu.com/p/136801555。
【漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现】security.limit_extensions设置了就只能解析指定后缀的文件,为空可以解析所有后缀文件。漏洞原理 首先来看nginx解析php文件的配置信息:
location ~ \.php$ {includefastcgi_params;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/var/www/html$fastcgi_script_name;
fastcgi_paramDOCUMENT_ROOT /var/www/html;
}
该配置文件大概意思就是匹配以
.php
结尾的文件,然后把这个文件当成php来执行。众所周知正则匹配遇到\0
是不会停止匹配的,但是nginx遇到\0
就会停止。现在有一个文件名为
a.jpg\0.php
,该文件可以通过上面的正则匹配,并且交给php来解析,而且nginx将该文件交给php解析时遇到\0
会停止读取文件名,所以真正去解析的文件名为a.jpg
。按这个逻辑我们只要上传一个名为a.jpg的木马到服务器,然后访问a.jpg\0.php即可成功执行木马。但是实践中失败了,原因是nginx读取文件名中包含\0
就会抛出一个错误并停止执行。当我们在
\0
前加上空格时, nginx会跳过检测文件名中是否含有\0
,这样就可以成功的利用00截断。 为什么在\0
前加上空格就会跳过nginx对00截断的检测呢?这个需要审计nginx的代码,感兴趣的可以参考:https://blog.csdn.net/Blood_Pupil/article/details/88565176。\0为字符串结束标志,十六进制为0x00漏洞复现 首先将一句话木马写入a.jpg中。
空格十六进制为0x00
然后上传该文件,同时使用burpsuite截断数据。
![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/b46d368cf01849c79ad6b69041e16ca3.jpg)
文章图片
![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/15a84f5a406d444eb80b4ac485764069.jpg)
文章图片
在文件名末尾加上空格,如下图所示。然后点击
Forward
提交。linux系统需要这一步,而windows系统可以省略。因为在windows中文件名不可以包含空格,而linux的文件名中可以包含空格。在访问a.jpg[20][00].jpg
时,在windows系统中会识别为a.jpg
,在linux系统中会识别为a.jpg[20]
。
![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/bdb344c45b20411f8ca5c7b6ed96d02e.jpg)
文章图片
然后可以在浏览器中看到上传文件的地址。
![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/155d764810b54aa39711b575534b34d2.jpg)
文章图片
然后访问
http://192.168.119.131:8080/uploadfiles/a.jpg.php
,同时用burpsuite抓取数据。![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/2a75c2cd408d453b964911164f654a1b.jpg)
文章图片
然后进入16进制编辑视图,在
.jpg
与 .php
中间添加 20
和00
,这是空格和 /0
的十六进制。![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/8beefdbb279845cb93fe58198bf07c4f.jpg)
文章图片
然后右击鼠标,点击
Send to Repeater
发送到重放模块,然后点击导航栏上的Repeater
,在这里可以多次发送数据包。在文件名的后面添加上参数即可执行任意命令,如下图所示。
![漏洞复现之中间件专栏|Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞复现](https://img.it610.com/image/info8/17a9a5f05a7146308e94e5694f019e03.jpg)
文章图片
参考文献 [1] https://zhuanlan.zhihu.com/p/136801555,Nginx服务漏洞详解
[2] https://blog.csdn.net/Blood_Pupil/article/details/88565176,漏洞复现之CVE-2013-4547
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天