Nginx文件类型错误解析漏洞--攻击演练
Nginx⽂件类型错误解析漏洞--攻击演练
今天看书看到其中提到的⼀个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置⾥ cgi.fix_pathinfo=1 那么就会产⽣⼀个漏洞。这个配置默认是1的,设为0会导致很多MVC框架(如Thinkphp)都⽆法运⾏。这个漏洞就是⽐如 localhost/img/1.jpg 是正常地访问⼀张图⽚,⽽localhost/img/1.jpg/1.php却会把这张图⽚作为PHP⽂件来执⾏!如下图,应该是404 NotFound 才对的,它却显⽰说是有语法错误。
好家伙,既然有漏洞那就尝试怎么攻击吧。先看思路:⾸先弄⼀个很⼩的JPG⽂件⽅便修改,然后在JPG⽂件中插⼊代码,再上传,最后在浏览器打开。
第⼀步,⼩的JPG⽂件当然是直接⽤Photoshop做⼀个了;
⼏个像素就够了。样⼦随便,你喜欢就好。
第⼆步,在JPG中插⼊代码,这个要⽤到⼆进制编辑器;
JPG图⽚如何修改成为可以执⾏PHP代码?这⾥以实验⽬的,以成功执⾏⼀个输出PHP运⾏环境信息的函数 phpinfo() 为例。
⾸先这⾥编辑图⽚的话并不是说⽤画图或者Phtoshop之类的图形软件,这次要⽤到的软件叫做⼆进制编辑器,其中我⽤的这款名叫
<,打开图⽚⽂件如下图
不要被吓到,就是16进制的数⽽已,右边显⽰的是对应的ASCII码,我们直接改右边就可以了。通过⼏个JPG⽂件的对⽐发现,从第⼆⾏开始就可以⾃⾏修改了,于是开⼯修改,注意不要使⽤退格删除导致长度缩短,要⽤字符替换的,否则会造成⽂件格式损坏。修改成如下图,保存到本地的图⽚⽂件夹中,在本地测试。
!注意不要使⽤退格删除导致长度缩短,图⽚损坏,⽐如像下图第⼀个的那种改了之后不显⽰缩略图的就已经是损坏了,损坏的图⽚可能会在上传的时候被拦截掉。
攻击类型转换
改好之后再本地测试,
似乎还不⾏,看起来应该是后⾯有⼀些PHP语法错误,那就简单粗暴,修改成下图这样,即是把后⾯的内容全部使⽤/* 来注释掉结尾
⽤ */ 闭合注释,当然结尾的注释不加也可以,只会多显⽰⼀个“Unterminated comment starting”的警告⽽已。建议不需要改成*/结尾,否则修改后的图⽚在Photoshop中会打不开(因为FF D9是jpg⽂件的标
准结尾)。
可以看到,已经可以执⾏PHP代码了。本地攻击演练成功!
第三步,上传,因为上传的确实是jpg格式的⽂件,⽹站⼏乎⽆法识别和拦截;
第四步,在浏览器打开,Hello World!
这⼀步成功需要以下⼏个条件:
1)服务器是Nginx+PHP并且配置⾥是cgi.fix_pathinfo=1。这个是不是nginx⼀般可以在Http响应头⾥到相应服务器信息,⽤Firebug等浏览器调试⼯具就能看到,⾄于这个配置项是不是1⼀般很难看出,就暂且当它是吧~~;
2)⽹站没有屏蔽上传⽬录的脚本执⾏权限。这个就⽐较难啰,⽤得上Nginx的公司基本上都有专门的运维,如果这点安全意识都没有,运维可以回家了;如果是⼩公司什么都不懂就冒然使⽤Nginx那恭喜;
3)可以访问原图,这个看机遇,有的可以有的没有;
所以,慢慢吧,也许可遇⽽不可求;
|++ 此漏洞的功击效果与“⽂件上传漏洞”相当
∞、防御建议
1)使⽤Apache、IIS等成熟久经考验的服务器软件,在动态语⾔的⽀持上,Nginx还是太年经了。你应该也偶尔会见到有些⽹站挂掉了显⽰个nginx错误出来,却极少见⽹站挂掉显⽰不是nginx的(未备案,过期⽋费等等除外)。
2)上传⽬录、静态资源(CSS/JS/图⽚等)⽬录,都设置好屏蔽PHP执⾏权限。例如使⽤Apache服务器的在相应⽬录下放⼀个 .htaccess ⽂件,⾥⾯写上
<FilesMatch "(?i:\.php)$">
Deny from all
</FilesMatch>
3)可以不提供原图访问,所有图⽚输出时都经过程序处理,也可以在上传存储时就处理⼀遍根本不保存原图;
4)图⽚使⽤不同的服务器,这样可以与业务代码数据完全隔离,即使图⽚服务器被⿊了,也不会泄漏多少信息;5)如鸟哥所说的把那个配置项设为0,此举慎⽤,除⾮你⼗分确定该服务器上的所有项⽬都不会因此⽽⽆法运⾏。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。