简单介绍NGINX:

  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。

  • 其特点是占有内存少,并发能力强,nginx的并发能力在同类型的网页服务器中表现较好。主要应用在百度,淘宝等高并发请求情形。

漏洞:

1.NGINX解析漏洞

(1)Nginx文件名逻辑漏洞(CVE-2013-4547)

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

漏洞原理:主要原因是nginx错误的解析了请求的URI,比如说下面这个模块,nginx会匹配以|.PHP|结尾的请求,发送给FastCGI(一个ong-live型CGI,激活后不用每次都fork,减少内存消耗)。而存在文 件名漏洞时,1.jpg[0x20][0x00].php会匹配为php文件(0x20为空格,0x00是null,查询ASCII表)但进入该模块后,因为1.jpg后是空格,会被设置为script_filename的值被发送到fastcgi解析。就完成了一次错误的解析。

location ~ \.php$ {
include fastcgi_params; fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}

小扩展: 很多网站限制了允许访问后台的IP,那么在请求时可以这么请求/test[0x20]/../admin/index.php,前提是有test这个文件夹

漏洞复现:

  • 访问靶机url:8080,可以看到是一个上传页面,看看能不能直接上传php;

  • 那看看后缀名能不能绕过;

  • 接下来就是要使该文件被解析为php文件,根据CVE-2013-4547文件名错误解析原理,.jpg[0x20][0x00].php就可以进入php的函数,而被cgi解析。重放访问上传文件的数据包, 可以看到没被解析;

  • 先在请求头中添加一些字符,观察16进制的数据

  • 0x20代表的是空格,这里我输了两个空格,方便修改数值;将第二个0x20修改为0x00,即空,满足漏洞实现条件,再重放发包。

  可以看到,1.jpg的内容成功被php解析。

(2)用户配置不当导致

漏洞原理:

  该漏洞与nginx,php的版本无关,这是由于 php 中的选项 cgi.fix_pathinfo 默认值为1,表示开启;nginx看到.php结尾的文件就交给php处理,而不先判断文件是否存在,这一点IIS与nginx是一样的。

漏洞复现:

  • 制作一个简单的图片马,绕过上传,可以看到上传成功,也可以正常解析为图片

  • 利用nginx php 文件解析特点,可以成功解析文件中的php代码。

(3)%00截断解析

影响版本:0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37

漏洞原理:php-fastcgi在执行php文件时,URL在处理 %00 空字节时 与FastCGI处理不一致,使得我们在其他文件中插入php代码,访问 URL+%00.php 即可执行其中的php代码。

2.CVE-2017-7529  NGINX越界读取缓存漏洞

漏洞详情:

  在nginx作为反向代理服务器,且开启了缓存时,攻击者可以构造恶意的range域,来获取相应服务器中的缓存文件头部信息,导致敏感的服务器信息泄露。

  在进行实践之前,先了解一下这个关键的range,range是HTTP中允许客户端分批断点续传请求资源的一个参数,举例,在请求大资源时,可以通过range并发下载;若网络中断,可以断电续传。range设置在http请求头中。

对range域的详情感兴趣的可参见:https://www.freebuf.com/articles/terminal/140402.html,介绍的很详细

影响版本:Nginx version 0.5.6 - 1.13.2

漏洞复现:

  • 正常请求返回的数据如下:

3.错误配置导致的漏洞

(1)CRLF注入漏洞

  漏洞介绍:CRLF是“\r\n”的简称,即回车+换行的意思。在HTTP协议里,http头部和http正文是用两个CRLF分割的,恶意的注入http返回包头部,即是CRLF注入漏洞。这也叫HTTP Response Splitting ,简称HRS。

  漏洞复现:这里搭建了一个简单的靶机环境,错误配置示例如下,传入的 %oa%0d 会被uri解码为 \r\n 。

location / {
return https://$host$uri;
}
  • 在请求头部注入%0a%0dSet-Cookie:hello,可以看到返回头部中确有注入成功,可造成会话固定漏洞。

  • 也可以注入%0a%0d%0a%0dxxxx,插入正文到返回正文中,但这里我没有弹框,因为环境中重定向的https://host 没有被定义。

这里有一个新浪的CRLF利用实例参见:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html

(2)目录穿越漏洞

 漏洞介绍:nginx在配置别名(alias)时,将“/files” 等同为“/home/”,可以看到这里多了一个“/”,这个就导致可从/home/目录穿越到他的上层目录,即 /files../ == /home/../  ,其错误配置示例如下:

       

  漏洞复现:

  • http://url:8081/files是公共文件目录,files 会被解析为/home/,files../ = /home/./ , 可以访问到根目录下的文件,造成任意文件下载。

                      

(3)add_headers被覆盖

错误配置如图所示: 

                              

漏洞原理:

1. add_header是headers模块中定义的一个指令,用来添加http响应头部。格式如:add_header Cache-Control no-store

2. nginx是分层级组织的,每层可以有自己的指令,子块继承父块的配置;但对于相同指令,子块的配置可以覆盖掉父块的配置。

3. Content Security Policy,简称CSP,内容安全策略,来限制网站是否可以包含某些来源内容,来预防一些注入漏洞,如XSS;

4. 在上图错误示例中,server块配置为:

add_header Content-Security-Policy "default-src 'self'";     ===>  使页面只能加载同源资源,且禁止内联代码执行。

add_header X-Frame-Options DENY;    ===>    使页面中不能被放在iframe框架中,避免被用作点击劫持。

但是location = /test2 子块中,add_header 被重新配置了,这个会覆盖父块的配置,所以在/test2 页面下没有做安全限制。

以上内容是提取出来与此漏洞有关的,要详细了解的请参见:

add_header :https://www.jb51.net/article/156230.htm

csp:http://www.mamicode.com/info-detail-2440203.html

x-frame-options:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

漏洞复现:

  • 可以看到两个页面中响应头中的变化:

 总结:

  本文涉及的漏洞分为三大类

  • 解析错误漏洞:

    • CVE-2013-4547:.jpg0x20 0x00.php

    • cgi.fix_pathinfo=1 时,.jpg/.php
    • %00.php (版本过低)
  • 缓存读取漏洞:CVE-2017-7529

  • 版本配置错误漏洞:

    • CRLF注入---HRS HTTP响应头注入;%0a%0d的利用

    • alias /files  = /home/

    • add_header指令,子块覆盖父块

NGINX 类漏洞 整理记录的更多相关文章

  1. Nginx配置日志格式记录cookie

    Nginx配置日志格式记录cookie1. 一般用来做UV统计,或者获取用户token等. 配置方式:  在nginx的配置文件中有个变量:$http_cookie来获取cookie的信息.配置方式很 ...

  2. nginx解析漏洞,配置不当,目录遍历漏洞环境搭建、漏洞复现

    nginx解析漏洞,配置不当,目录遍历漏洞复现 1.Ubuntu14.04安装nginx-php5-fpm 安装了nginx,需要安装以下依赖 sudo apt-get install libpcre ...

  3. 对Integer类中的私有IntegerCache缓存类的一点记录

    对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可 ...

  4. 15.Nginx 解析漏洞复现

    Nginx 解析漏洞复现 Nginx解析漏洞复现. 版本信息: Nginx 1.x 最新版 PHP 7.x最新版 由此可知,该漏洞与Nginx.php版本无关,属于用户配置不当造成的解析漏洞. 使用d ...

  5. (转)Nginx的https配置记录以及http强制跳转到https的方法梳理

    Nginx的https配置记录以及http强制跳转到https的方法梳理 原文:http://www.cnblogs.com/kevingrace/p/6187072.html 一.Nginx安装(略 ...

  6. nginx解析漏洞复现

    nginx解析漏洞复现 一.漏洞描述 该漏洞与nginx.php版本无关,属于用户配置不当造成的解析漏洞 二.漏洞原理 1. 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件 ...

  7. CMDS目的端数据库碎片整理记录

    CMDS目的端数据库碎片整理记录 看看数据库里面需要做整理的表有哪些,条件可以根据需求稍微改动一下 SQL> select * from ( 2 select a.owner, 3 a.tabl ...

  8. 建筑设计类软件整理ACDSee,PS,CAD,Ecotect,SketchUp,Phoenics,Revit,Rhino,

    关于建筑设计类软件整理 1 建筑设计类专业最常用软件如下,包括SU,CAD, REVIT,PS等. 2 sketch up 简称SU,中文名草图大师,在推敲方案,拉推体块时有着不可或缺的作用,而且随着 ...

  9. Nginx 解析漏洞复现

    一.漏洞描述 该漏洞与nginx.php版本无关,属于用户配置不当造成的解析漏洞 二.漏洞原理 1.由于nginx.conf的如下配置导致nginx把以'.php'结尾的文件交给fastcgi处理,为 ...

随机推荐

  1. effective-java学习笔记---使用接口模拟可扩展的枚举38

    枚举类型( BasicOperation )不可扩展,但接口类型( Operation )是可以扩展的,并且它是用于表示 API 中的操作的接口类型. // Emulated extensible e ...

  2. 使用Python创建自己的Instagram滤镜

    不知道你有没有使用过Instagram滤镜,它们非常方便,只需单击几个按钮,就可以变换我要发布的照片​​. 你是否想过自己可以创建一个?答案是可以的! 在本文中,我将向你展示如何使用代码和示例图像来创 ...

  3. 思考设计SQL优化方案

    一.优化的哲学 注:优化有风险,涉足需谨慎 1.优化可能带来的问题? 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统: 优化手段本来就有很大的风险,只不过你没能力意识到和预见到: 任 ...

  4. python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关 ...

  5. Java的浅拷贝与深拷贝总结

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  6. 手工注入——access手工注入实战和分析

    今天进行了access手工注入,下面是我的实战过程和总结. 实战环境使用的是墨者学院的在线靶场.下面咱们直接进入主题. 第一步,判断注入点 通过‘ 或者 and 1=1 和 and 1=2 是否报错, ...

  7. CodeForces 280B(枚举 + 单调栈应用)

    题目链接 思路如下 这题恶心的枚举任意区间的 最大值及次最大值 ,正常的操作是,是很难实现的,但偏偏有个 单调栈这个动西,能够完成这个任务,跟单调队列相似,有单调 递增.递减的栈,这一题我们需要维护的 ...

  8. JS数据结构与算法 - 二叉树(一)基本算法

    仅供JavaScript刷题参考用. 二叉查找树和平衡二叉树 其它树:满二叉树.完全二叉树.完美二叉树.哈弗曼树.二叉查找树BST.平衡二叉树AVL 了解:红黑树,是一种特殊的二叉树.这种树可以进行高 ...

  9. JS数据结构与算法——栈

    JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...

  10. sqlchemy查询的其他操作

    sqlalchemy的数据查询排序 1 .正序排序:session.query(model).order_by(model.attr).all() session.query(model).order ...