注意,本文讨论的仅仅是如何绕过禁止规则进入 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)
的区别
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.