Nginx中php配置错误导致的解析漏洞
影响范围¶
这一漏洞是由于Nginx中php配置不当而造成的,与Nginx版本无关
漏洞详情¶
Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了
这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项有什么用呢?看名字就知道是对文件路径进行“修理”。何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。
该选项在配置文件php.ini中
新版本的php引入了“security.limit_extensions”,限制了可执行文件的后缀,默认只允许执行.php文件
复现过程¶
1、 使用docker搭建漏洞环境
2、 执行如下命令,运行环境
docker-compose up -d
3、 浏览器访问http://192.168.247.129/
4.上传一个图片马
5.浏览器访问http://192.168.247.129/uploadfiles/156005c5baf40ff51a327f1c34f2975b.jpg/a.php
下图看到成功执行了php代码,说明存在解析漏洞 6.我们用中国蚁剑去连接
漏洞修复¶
主要是两个配置文件中配置不当造成的。
- 修改配置文件vim /etc/php5/fpm/php.ini
将cgi.fix_pathinfo=1,设置为0
2.修改配置文件vim /etc/php5/fpm/pool.d/www.conf
将security.limit_extensions=,设置为:
security.limit_extensions=.php,只允许php文件解析