吹毛求疵还是精益求精?再谈 nginx fastcgi/fpm 正则禁止上传目录 php 执行

2016-07-29 11:55:57 +08:00
 tntsec

注意,本文讨论的仅仅是如何绕过禁止规则进入 cgi 。

nginx fastcgi/fpm 禁止上传目录 php 执行 因为上传目录是具备写入权限的,写入权限很恐怖。

1.最常见的,完全错误的方法 来源,百度下最常见的

location ~ ^/upload/.*\.(php|php5)$
{
deny all;
}

正则解释 ^/upload/.*.(php|php5)$ 开头匹配^ 中间任意匹配.* 点匹配\. (php|php5)php扩展名选择器 结尾匹配$

绕过方法, 1.php 可以是个目录 /1.php/3038714494.png

2.Nginx 下多站点正确限制目录 php 执行权限 来源 http://www.freebuf.com/articles/system/49428.html

location ~ /(ups)/.*\.(php|php5)?$
                       {
                               deny all;
                        }

正则解释 比上面的多了一个?问号,问号代表零次或一次。

绕过方式,同上 /1.php/3038714494.png

3.nginx+cgi 解析 php 容易出现的漏洞 来源 http://www.nginx.cn/316.html

location ~* ^/upload/.*.(php|php5)($|/)
{
    deny all;
}

正则解释 ^/upload/.*.(php|php5)($|/) 开始匹配^ 匹配任意多字符.* 匹配任意字符请输入代码.(怀疑此处其实他想匹配点,但是正则中的点代表任意字符) 结束或者目录符号($|/)

此方式解决了上面的绕过问题

缺点,封杀太严格,目录中包含 php 三个字母就会封杀 /php/3038714494.png

4.关于 lnmp 目录禁止执行的绕过与正确方法 来源地址 http://zone.wooyun.org/content/16213 谷歌缓存 http://webcache.googleusercontent.com/search?q=cache:g3B4qj-SGXgJ:zone.wooyun.org/content/16213+&cd=1&hl=zh-CN&ct=clnk&gl=cn

location ^~ /upload/ { 
    default_type text/plain; 
    expires 30d; 
} 

解释,这不是正则,却更加有趣 ^~表示匹配一次,不再让其他 location 处理,从而不会匹配到 cgi 中 这种方式需要的判断最少,是非常好的方式

他只有一点点瑕疵,那就是源码泄漏 如果 config.php 文件被复制到这个目录下,源码一览无余。因为这个方法只是不让 php 进入 cgi ,但是却没有禁止他的解析。

5.我的方法 当你看完上面的内容,相信你已经有了自己的方法了 我这里稍微修改下第三种方法,就是括号里的部分

location ~ (/usr/uploads/|/admin/).*\.(php|php5)($|/) {
    deny all;
}

增加的部分 location ~ (/usr/uploads/|/admin/).*\.(php|php5)($|/) 将从匹配任意字符调整为匹配点,这样就不会拦截包含 php 字符的目录了,但是依然会拦截 如果出现.php目录,我们可以默认认为他是黑客行为。

小提示,注意(/usr/uploads/|/admin/)和(/usr/uploads|/admin)的区别

6402 次点击
所在节点    NGINX
28 条回复
tntsec
2016-07-30 09:53:02 +08:00
@kiwi95 并不是为了防止.php 后缀,而是为了防止图片马用.php 前缀绕过
tntsec
2016-07-30 09:53:52 +08:00
@aprikyblue 那里不是正则?
kiwi95
2016-07-30 09:57:35 +08:00
我觉得第一条就是最直观最好的方法,后面确实是吹毛求疵,不知道文章种说的第一条绕过方法有什么问题,且不说一般不会用 .php 作为文件夹名,就算用 .php 做文件夹名也不会有什么问题
tntsec
2016-07-30 09:58:02 +08:00
@jarlyyn 现在的一些基于 tp 的网站,连根目录都必须有写入权限,已经不明白他怎么想的了
tntsec
2016-07-30 10:01:40 +08:00
@kiwi95 http://www.2cto.com/Article/201502/378373.html
第一种方法是典型的解析漏洞
jarlyyn
2016-07-30 10:03:02 +08:00
@tntsec

所以我一直觉得 PHP 程序的部署是很难的
kiwi95
2016-07-30 10:18:32 +08:00
@tntsec try_files 加 =404 就好了,并且现在 cgi.fix_pathinfo 配置都是(推荐)关掉的,并且现在的 php-fpm 的默认配置应该也能避免它;总之这种漏洞很容易用其他方法避免
tntsec
2016-07-30 10:28:02 +08:00
@kiwi95 那就请看文章第一句话

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295734

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX