常见web中间件漏洞(三)Nginx漏洞

nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,有  开源,内存占用少,并发能力强,自由模块化,支持epoll模型,可限制连接数,支持热部署,简单灵活等等优点。。。。。。

能提供web服务、负载均衡反向代理、web cache服务

nginx也是个跨平台服务器

一个简单新手介绍安装 作者taiyonghai   https://www.cnblogs.com/taiyonghai/p/9402734.html

 

 

先说点题外话:关于反向代理(也是常常说到的一个小知识点),都用nginx做反向代理,那么啥是反向代理

三句话+一张图说明,绝不啰嗦

第一句话:正向代理,代理的是客户端,为了向服务端隐藏客户端信息;反向代理,代理的是服务端,为了向客户端隐藏服务端信息

第二句话:正向代理,处理请求的服务端是明确的,但对于服务端来说,客户端具体由哪台客户机发起请求是不明确的;反向代理,发起请求的客户端是明确的,但对于客户端来说,服务端具体由哪台服务器处理请求是不明确的

第三句话:正向代理,代理服务器与客户端可视为一个部分,对服务端透明;反向代理,代理服务器与服务端可视为一个部分,对客户端透明

一张图:

 

 

言归正传

先声明一个概念FastCGI

FastCGI是一种可伸缩的、高速的在HTTP server和独立进程之间通信的协议。FastCGI被众多脚本语言支持,包括PHP。FastCGI是从CGI发展而来的。FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分离开,

同时在脚本解析服务器上启动一个或多个脚本解析守护进程。Nginx并不支持对外部程序的直接调用或解析,所有外部程序都要通过FastCGI接口来调用。FastCGI接口在脚本解析服务器上启动一个或多个守护进程动态解析脚本,这也成

为FastCGI进程管理器,spawn-fcgi与PHP-FPM就是两个进程管理器

 

借用知乎用户Code Diy 的比喻(https://www.zhihu.com/question/30672017)

把服务器看作餐厅,用户请求看作来用餐的顾客,服务器处理请求看作解决顾客的就餐问题(响应输出一份饭)。

服务器上静态资源看作已做好的饭,只要放到餐盒里就可以返回给顾客,动态资源需要厨房大厨现成做份再放到餐盒里返回给顾客。

php_mod这个大厨有个特点,看见有顾客进门就点火,不管顾客要不要现做的,有点浪费资源

php_fpm这个大厨有好多小弟一直点着火(多个处理进程),等有顾客说要现做,大厨就安排小弟做份返回给客户

cgi也是个大厨,不过他等到顾客要现做,他才点火,做饭,然后熄火。等待下一个要现做的到来

fastcgi呢就是个大厨雇了一帮小弟,专门做需要现场做的饭,大厨只管分派任务,小弟真正操锅做饭

 

 

1.nginx解析漏洞

任意文件名后加 /xxxxx.php(xxxxx处可添任意字符),可将文件作为PHP解析

常见利用方法就是你搞个图片马a.jpg,上传,(知道绝对路径)浏览器访问图片马后面加个/lcx.php,变成 https://xxxxxxx.xxxxx/xxxxxx/a.jpg/lcx.php这种格式,然后菜刀连,OK(玩烂了没啥新意不截图了)

 

假装有图.jpg

 

此漏洞是与nginx配置相关的,不是nginx版本的问题,或者更确切地说是nginx 中PHP配置不当才有此漏洞

与Apache不同,当Apache看到a.jpg/lcx.php这种文件会先判断lcx.php文件是否存在,而nginx看到.php会直接把文件交给PHP处理(此漏洞产生的最初原因,梦开始的地方),PHP就找这个lcx.php文件,那肯定是找不到的,因为文件名是我瞎写的

这又涉及到另一个东西cgi.fix_pathinfo=1(漏洞产生的第二个原因)

 

上图为PHP配置文件php.ini中的截图

从名字就可以看出来,这个值是一种对于文件路径的fix(修复),1表示开启

开启后,PHP看到不认识的路径就删,删到认识为止,a.jpg/lcx.php找不到不认识,删,a.jpg找得到认识,停。把a.jpg当成要执行的文件(什么,不执行?不执行传给我干嘛),仔细看了看a.jpg的脸,产生两个选项:

 

A.我认得你,你就是php文件,即使你叫jpg,你的心还是php的

B.我不认你,你就是jpg文件,不是php文件,不执行,access denied!

 

要是B选项,那就利用失败了,必须产生A选项才行。要想产生A选项,php-fpm.conf中有security.limit_extensions(漏洞产生的第三个原因)来限制文件解析类型,啥也不写的话,默认就是按照PHP执行,就会出现A选项中的情况

不过一般都是写成

security.limit_extensions=.php的,意思就是你只有是.php我才承认你是一个php文件,我按照PHP来执行。你明明写做.jpg,不是.php,你说你是php,对不起我不同意

 

所以,要想这个洞能在实战中复现成功还是挺难的(苦笑),然而一旦有就是可以批量日穿一堆的(废话)

 

防御的话,从第三点来说,用高版本PHP就是security.limit_extensions=.php了,就不会出现上述问题

从第二点来说,要么cgi.fix_pathinfo=0 ,要么cgi.fix_pathinfo=1但禁止上传目录脚本执行权限

 

 

2.nginx空字节任意代码执行漏洞

nginx版本0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37受到影响

原理是啥?在使用PHP的FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问文件来执行其中的php代码

举例来说:

我上传一个图片,a.jpg,里面写<?php phpinfo();?>   上传,之后访问绝对路径下的a.jpg,burp抓包,改成a.jpg..php,将Hex第一个.的编码改成00,传过去,返回了执行结果phpinfo(cgi.fix_pathinfo=0也拦不住,XX说的)

 

防御,不要用这几个版本

 

3.CVE-2013-4547(nginx文件名逻辑漏洞)

 nginx版本 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7受到影响

这个东西,实际上是一种错误的URL解析

正常来说nginx发现 .php文件 ,扔给PHP fastcgi解析,在nginx.conf中

 

 

 啊,通常是有各种配置的,我这里没有配置

nginx.conf中常见配置类似

location ~ \.php$ {
    include        fastcgi_params;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
}

这种

如果我们请求a.jpg[0x20][0x00].php这种(hex下的 空格 和 \0),也匹配到了正则.php$,进入这个location块,但fastcgi查询的时候被\0所截断,于是nginx认为文件名是a.jpg[0x20](是a.jpg空格),把他经fastcgi发出去了

于是我们可以做到让  a.jpg空格  这种格式的文件被当做PHP解析

 

于是乎,还是第2点的例子,传图片a.jpg,里面写<?php phpinfo();?>,上传,访问绝对路径下的a.jpg,burp抓包,文件名改成a.jpg...php,把前两个.的hex码由2e 2e改成20 00,发包,返回了执行结果phpinfo

 

其实。。。在现在,基本都有各种重命名,各种路径找不到,2、3两个点如果有遇到那还真是幸运啊(苦笑)

 

防御不用这些版本或者改代码

 

4.nginx错误配置漏洞

 

(1)CRLF注入

如果在nginx.conf里面location中有这样一行

 

 那就要注意了

这是一个强制跳转的功能,让http请求跳转到https上

nginx会将$uri解码,如果传入%0a%0d,就是进入换行符,造成一个CRLF注入

然后就是老套路了

访问什么http://xxxx.com/%0a%0d%3Cimg%20src=1%20onerror=alert(/xss/)%3E  随便插点什么setCookie也成

一般会在回包的Location下面出现插入的东西

毕竟代码里常常这么写  header("Location: ". $_GET["url"]);

 

防御 换成   return 302 https://$host$request_uri;  试试,直接把完整的URL扒下来,不再解码,也就没事了

 

 

 

(2)目录穿越漏洞

nginx配置别名Alias时,忘记加/,会造成此漏洞

我这没有别名,没截图

 

location /files {

  autoindex on;

  alias c:/xxxxxxx/xxxxxx/home/;

}

类似这种(这个例子是把/files 等同于/home),访问/files../也是访问/home../

 

防御的话改成这种

 

location /files/ {

 

  autoindex on;

 

  alias c:/xxxxxxx/xxxxxx/home/;

}

或者这种

 

location /files {

 

  autoindex on;

 

  alias c:/xxxxxxx/xxxxxx/home;

}

 

(3)目录遍历漏洞

 

 

 这样的,autoindex为on

 访问主页就好,就能看到很多有的没的,该看的不该看到的东西

 

防御 将autoindex改成off

 

随便转载,请标明作者出处

 

posted @ 2020-09-07 15:05  anoldcat  阅读(5968)  评论(0编辑  收藏  举报