文章目录
Nginx是一款轻量级的web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
一、目录跨越及代码执行漏洞(CVE-2013-4547)
CVE-2013-4547则是Nginx目录跨越及代码执行漏洞,也被称为是文件名逻辑漏洞。
涉及版本:Nginx 0.8.41~1.4.3 / 1.5.0<=1.5.7
漏洞原理
这个漏洞虽然也被称为代码执行漏洞,但跟代码执行没有太大关系,主要是由于非法的字符空格和截止符(\0)导致Nginx解析URI时的有限状态机混乱,攻击者通过一个非编码的空格绕过后缀名限制,导致出现权限绕过,代码执行等影响。
payload如下:
http://127.0.0.1/test.jpg \0.php
在存在CVE-2013-4547的状态下,我们构造payload如上,请求的是test.jpg \0.php,在Nginx解析URI时,由于文件名后面的字符串为.php,而.会被当做URI扩展名的分隔符,所以Nginx认为是此次处理是.php,就会通过配置传给fastcgi处理,fastcgi内容如下:
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;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
fastcgi在查找文件“test.jpg \0.php”时被\0截断,所以找到的文件为“test.jpg ”文件,将其当做php文件进行解析,造成了解析漏洞。
漏洞复现
测试环境:vulhub靶场(具体搭建请看上一篇文章)
启动漏洞环境
docker-compose up -d
访问环境
http://you-ip:8080/
开始测试:
上传页面如下:
由于该上传环境环境是黑名单验证,我们无法上传php后缀的文件,需要利用CVE-2013-4547。所以首先创建一个含有php代码的jpg文件,php代码为:
<?php
phpinfo();
?>
将文件名改为“test2.jpg ”并上传!(注意jpg后面的空格)
界面提示上传成功。
尝试去该路径下访问“test2.jpg ”文件,界面报404错误。
上传的文件找不到,是因为浏览器自动将空格编码为%20,服务器中找不到名为“test2.jpg%20”的文件。
接下来,我们想要上传的jpg文件作为php解析,就需要利用未编码的空格和截止符(\0)进行构造,构造请求如下:
http://ip:8080/uploadfiles/test2.jpgAAAphp
发送请求并使用burpsuite抓包。使用burpsuite将AAA分别更改为20(空格)、00(截止符\0)和2e(分隔符号.)。
这样我们发送的请求就变为:
http://you-ip:8080/uploadfiles/test2.jpg[0x20][0x00].php
Nginx解析后,将“test2.jpg ”文件当做php文件解析。
二、Nginx配置不当漏洞(CRLF和目录穿越)
1、CRLF注入漏洞
漏洞原理
CRLF是回车换行(\r\n)的简称,其十六进制的编码分别为0x0b和0x0a。在http协议中,http消息头以明文的字符串格式传送,以冒号分隔的键/值对,如:Accept-Charset: utf-8,每一个消息头以回车符(CR)和换行符(LF)结尾。而在http消息头结束后,会使用两个连续的CR-LF来进行标识,用来分隔http 消息头 和 http 消息体(请求或响应的内容)。
Nginx中错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location