Nginx常见2个漏洞复现

0x01:CVE-2013-4547

1.使用vulhub进行漏洞搭建,切换到nginx/cve-2013-4547,虽然漏洞时间比较早,但是漏洞类型还是比较经典,在当下还是会存在许多这样的漏洞,允许docker:

docker-compose up -d

该漏洞是文件名逻辑漏洞:

这个漏洞其实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。这是一个nginx解析漏洞

2.漏洞复现

受影响版本

Nginx 0.8.41~1.4.3

Nginx 1.5.0~1.5.7

漏洞原理:

Nginx匹配到.php结尾的请求,就发送给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;

}

正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php ,这个URI可以匹配上正则 .php$,可以进入这个Location块;但进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。

直接上传php文件:

上传失败:

bp抓包改后缀加空格绕过:

3.访问上传,修改后缀,增加截断

访问:http://192.168.18.181:8080/uploadfiles/1.gif ...php

再通过hex增加截断:

0x02:CVE-2017-7529

这是一个低危的漏洞,一些敏感信息的泄漏,但是我们通过复现可以加深理解:

注意⚠️:

  • 出现在靶场具有python3的内部环境
  • 外网复现失败,说明不可外部读取敏感信息
  • 影响版本:Nginx 的 0.5.6 - 1.13.2版本

1.漏洞搭建同样使用vulhub切换到cve-2017-7529:

docker-compose up -d

2.漏洞复现,直接使用准备好的py脚本

3.实验原理

(1)由于对http header中range域处理不当造成。

(2)主要代码是ngx_http_range_parse函数中的循环。

(3)Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。

(4)如果我们的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。当Nginx服务器使用代理缓存的情况下,攻击者通过利用该漏洞可以拿到服务器的后端真实IP

posted @ 2023-06-19 18:39  Arrest  阅读(339)  评论(0编辑  收藏  举报