注意,本文讨论的仅仅是如何绕过禁止规则进入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)
的区别
评论