中间件-Nginx-文件解析&目录穿越漏洞&CRLF

CVE-2013-4547 文件上传

漏洞原理:

CGI:是一种协议,定义了web服务器传递的数据格式。

FastCGI:优化版的CGI程序

PHP-CGI:PHP解释器,能够对PHP文件进行解析并返回相应的解析结果

PHP-FPM:FastCGI进程管理程序

当Nginx得到一个用户请求时,首先对url进行解析,进行正则匹配,如果匹配到以.php后缀结尾的文件名,会将请求的PHP文件交给PHP-CGI去解析。其中处理模块如下:

location ~ \.php$ {
    root           html;
    include        fastcgi_params;

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

以.php结尾的文件都会交给该模块处理,其中fastcgi_pass就是Nginx与PHP-FPM之间的媒介,通过ip+port的方式将请求转发给PHP解释器

CVE-2013-4547漏洞是由于非法字符空格和截止符导致Nginx在解析URL时的有限状态机混乱,导致攻击者可以通过一个非编码空格绕过后缀名限制。假设服务器中存在文件‘123.png ',则可以通过访问如下网址让服务器认为'123.png '的后缀为php
http://192.168.146.1/123.png \0.php

从代码层面来说,我们请求的url中123.png[0x20][0x00].php正好与location模块中的.php相匹配,但进入该模块后Nginx确认为请求的文件名是’123.png ‘,就设置其为script_name的值交给CGI进行解析,最终造成解析漏洞

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

https://vulhub.org/#/environments/nginx/CVE-2013-4547

条件:(1) 符合的漏洞版本 ,(2) 文件上传点

解析漏洞(配置不当)

目录穿越(配置不当)

漏洞原理:

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。 错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

location /files {
    alias /home/;
}

Payload: http://your-ip:8081/files../ ,成功穿越到根目录:

CRLF注入(配置不当)

Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。
错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location / {
    return 302 https://$host$uri;
}

%0a是换行 %0d是回车

检测:手工检测方式 %0aSet-cookie:JSPSESSID%3Ddrops

如果要触发XSS,那么XSS代码就要写在下面的html中,而不是响应头部上,所以%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>/

工具检测,CRLFuzz:https://github.com/dwisiswant0/crlfuzz/releases

支持单个目标和批量目标

没有漏洞payload测试

有漏洞payload测试

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注