文件解析漏洞总结-Nginx

Nginx解析漏洞

原理:在任意文件名后面添加如/*.php,nginx都会将该文件当做php文件类型,交给php去解析执行
例:xx.jpg,其中源码为
访问xx.jpg时,在xx.jpg后面添加/xx.php,即可实现nginx解析漏洞,将xx.jpg以php解析执行

我们将上述情况做个实验:这里我使用的是集成环境phpstudy
在这里插入图片描述
浏览器访问:
在这里插入图片描述
在这里插入图片描述
返回了Access denied,这是为何?
我们先来梳理一遍流程,Nginx看到xx.jpg,根据mime.types,知道它是图片类型,就交给图片去处理;Nginx看到xx.jpg/xx.php,看到了.php,知道它是php类型,就交给php去处理,php看到xx.jpg/xx.php后缀是.php,就执行xx.jpg/xx.php这个文件,执行时发现不存在xx.php,就删除/xx.php,继续向前看,发现了xx.jpg,但php发现.jpg不是他认识的php类型,就不以php执行,就返回了Access denied.

为什么php可以遇到删除它呢,这是因为php.ini中的配置:cgi.fix_pathinfo=1,一般默认为1,当他为1时,即表示开启php对文件路径的修理,假设当php见到aa.xxx/aa.yyy/aa.zzz这个文件时,php没有找到aa.xxx/aa.yyy/aa.zzz这个文件(记住,aa.xxx/aa.yyy/aa.zzz是个整体!),就删除后面的/aa.zzz,检测aa.xxx/aa.yyy这个文件是否存在,若存在,并且php认识它,就以php解析执行(不认识返回Access denied.),若不存在,删除/aa.yyy,检测aa,xxx文件是否存在,以此类推
注:文章中所有实验,全部默认开启php修理功能(cgi.fix_pathinfo=1)

测试上面的xx.jpg/xx.php时,cgi.fix_pathinfo是开启的,为什么还是无法解析呢,正如上面所说,php不认识.jpg这个类型,需要配置http-fpm.conf中的security.limit_extensions为空(这个配置完后需要重启nginx)
例:security.limit_extensions默认配置为;security.limit_extensions = .php .php3 .php4 .php5
文件解析漏洞总结-Nginx_第1张图片
这个什么意思?这个表示security.limit_extensions允许解析其他文件为php类型,我的理解就是,规定php认识的后缀类型有哪些(限制它),这也就是为什么php不认识.jpg,要知道,但凡php认识的后缀类型,都要以php格式来解析执行的,一开始security.limit_extensions只认识.php .php3 .php4 .php5,现在改为空,表示php认识任何后缀类型,那又有疑问了,有人说我设置了security.limit_extensions=空,可我直接访问xx.jpg,xx.jpg没有被php解析执行,Why?其实,security.limit_extensions=空确实表示将任何后缀名文件当做php解析执行,但你要知道,文件首先是要经过Nginx判断的,像这个xx.jpg,Nginx认识他,直接判断他为图片,就交给图片处理了,那还轮得到php修理后执行,所以要想将xx.jpg给php修理执行,首先要过Nginx这一关,如使用xx.jpg/xx.php或xx.jpg/xx.php/xx.xxoo(从右往左判断Nginx是否认识),使用.php欺骗Nginx,告诉他,我这是php文件,交给php去。
可以看看IIS7.x的解析漏洞,有异曲同工之妙 文件解析漏洞总结-IIS
如果想让xx.jpg可以以php解析,可以配置nginx.conf,就像配置apache的httpd.conf中的AddType(当然这个我是猜的,实际可能没有,nginx可能只能通过在url中,在xx.jpg后面添加/xx.php来将xx.jpg以php解析执行,毕竟每个中间件都不同嘛)

所以综合而言,Nginx漏洞利用的条件是:
(1)Nginx的http-fpm.conf中security.limit_extensions=空或其它指定的以php解析执行的后缀
(2)php开启文件修理:php.ini中cgi.fix_pathinfo=1

接下来就可以进行漏洞复现了,分别在说一下流程
xx.jpg源码:
在这里插入图片描述
利用一:xx.jpg/xx.php,Nginx从右向左找认识的后缀,看到.php,将xx.jpg/xx.php交给php去修理执行,php修理时发现xx.jpg/xx.php不存在,删除/xx.php,继续修理,发现xx.jpg存在,就将xx.jpg以php解析执行
在这里插入图片描述
利用二:xx.jpg/xx.php/xx.xxoo,Nginx从右向左找认识的后缀,看到.xxoo,不认识,看到.php认识,将xx.jpg/xx.php/xx.xxoo交给php去修理执行,php修理时发现xx.jpg/xx.php/xx.xxoo不存在,就删除/xx.xxoo,继续修理,发现xx.jpg/xx.php不存在,删除/xx.php,继续修理,发现xx.jpg存在,就将xx.jpg以php解析执行
在这里插入图片描述
防御方法:
(1)php.ini中设置cgi.fix_pathinfo=0
(2)php-fpm.conf中设置security.limit_extensions=.php,只允许.php后缀以php解析执行

注意:我写的实验室linux下的,windows又是另外一回事了,不会全部相同,例如windows中没有php-fpm.conf配置文件,直接可以利用nginx解析漏洞,访问图片时会显示源码,不会返回图片等等。
这篇文章我是使用phpstudy集成环境搭的,有些文件路径和网上直接用agnix或docker环境所说的路径不一致。
有些东西还得用原装,这个目录遍历准备写的,配置了参数环境还是复现不了,也有可能是我phpstudy使用还不到家~

你可能感兴趣的:(Web中间件)