当前位置:WooYun(白帽子技术社区) >> linux运维安全 >> 关于lnmp目录禁止执行的绕过与正确方法

关于lnmp目录禁止执行的绕过与正确方法

phith0n (我也不会难过 你不要小看我) | 2014-11-02 17:50

#
    无意中看到了这篇文章:http://www.freebuf.com/articles/system/49428.html

    对于下面我莫名其妙中枪的事。。。我就不多说了(谁干的,有种站出来,我绝对不打死你):

    08.jpg

    于是我详细地把文章看了一遍,文章比较基础但也不失为一个引导新手的一个方法。但其中对于禁止执行的方式,我就不敢苟同了。在某种配置下,这个方法是能够很容易被绕过的。

    文中提到,使用lnmp1.1搭建的nginx环境,正好我的vps也是lnmp搭建的环境,所以我可以在我的vps里做实验。

    看到文中的解决方案:

    11.jpg

    在location中,将匹配到/(avatar|uploads|ups)/.*\.(php|php5)?$的请求全部禁用掉。

    似乎是一个很好的方法,那我们怎么绕过?

    在web世界里,有一种请求方式叫pathinfo,我们在图中也可以看到,倒数第二行注释掉了一个include pathinfo.conf。前面的说明里也说到了,如果要开启pathinfo,只要注释掉try_files $uri =404即可。

    很多框架、CMS的默认请求方式就是pathinfo,如著名php框架codeigniter,所以可见pathinfo用的是比较广的,所以也会有大量vps在这里是允许pathinfo的。

    那么,当开启了pathinfo后,前面的deny all;就完全失效了,我们只需要在upload目录里上传xxx.php后,如下方式访问:

    http://xxx/upload/xxx.php/xxx

    即可让location /(avatar|uploads|ups)/.*\.(php|php5)?$这条规则完全失效,因为上述请求并不以.php结尾。


    那么,怎样才能有效禁止某目录下解析php?

    那还是应该回到nginx解析php的方式上。我们看到上图,我们可以发现,实际上进入这个location块:location ~ [^/]\.php(/|$),才真正将请求交给fastcgi去解析。

    所以,我们只需要阻止请求进入这个location块,那么这个请求不论是怎样的后缀,怎样的方式,都不会被php-fpm解析的。

    所以,我的方法是:

location ^~ /upload/ {
    default_type text/plain;
    expires 30d;
}
location ~ [^/]\.php(/|$)
{
        # comment try_files $uri =404; to enable pathinfo
        #try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-leavesongs.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
}


    在php的解析块前,加上“location ^~ /upload/ ”块,^~的意思是“一旦匹配上该块,则不再匹配其他块,一般匹配目录”。所以,这里正好满足我的要求,只要在/upload/目录下的文件,都将匹配到这个块中,而且不会再匹配别的块,所以也不会再进入下面的php解析块中。

    附location匹配命令的一些说明:http://www.nginx.cn/115.html
    附drops中关于lnmp安全配置的方法:
    http://drops.wooyun.org/tips/1323 (其中就包含这个有问题的方法)
    http://drops.wooyun.org/tips/2866
    测试:http://www.leavesongs.com/upload/1.php

分享到:
  1. 1# 感谢(1)
    回复此人 感谢
    ′ 雨。 | 2014-11-02 18:13

    新技能 √

  2. 2#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2014-11-02 19:08

  3. 3#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2014-11-02 19:08

    另外还有个正则表达式的问题

  4. 4#
    回复此人 感谢
    Mody | 2014-11-02 19:26

    get新技能

  5. 5#
    回复此人 感谢
    sin (寻找最优雅的解决方案) | 2014-11-02 19:36

    好文,文章就该这样嘛。有图有文,有代码有引用有亮点。不会像有的博客,一到关键点就闪烁其词。囧

  6. 6#
    回复此人 感谢
    老和尚 | 2014-11-02 20:02

    ph出品必精

  7. 7#
    回复此人 感谢
    phith0n (我也不会难过 你不要小看我) | 2014-11-02 20:24

    @xsser 什么问题。。。没看出来

  8. 8#
    回复此人 感谢
    0x_Jin (世上人多心不齐) | 2014-11-02 20:45

    @phith0n ph牛 你这么腻害 这样真的好么

  9. 9#
    回复此人 感谢
    bey0nd | 2014-11-02 20:56

    为何这么吊

  10. 10#
    回复此人 感谢
    不速之客 | 2014-11-02 21:59

    NBBB

  11. 11#
    回复此人 感谢
    爱捣蛋的鬼 | 2014-11-03 09:07

    @phith0n  那要是upload下面是图片的话, default_type会把图片已ascii码显示到页面,还是正确显示图片啊

  12. 12#
    回复此人 感谢
    付弘雪 | 2014-11-03 09:57

    pathinfo在 很多框架之下应用确实很多

  13. 13#
    回复此人 感谢
    phith0n (我也不会难过 你不要小看我) | 2014-11-03 12:15

    @爱捣蛋的鬼
    default_type只是遇到不认识的才生效,图片是认识的后缀,是正确显示。

  14. 14#
    回复此人 感谢
    Bird | 2014-11-15 12:33

    新技能Get

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录