影响范围:

  • Nginx 0.8.41 - 1.4.3
  • Nginx 1.5.0 - 1.5.7

漏洞类型:

任意文件解析

操作系统限制:

配置要求:

默认配置

漏洞利用:

远程命令执行

利用原理:

在受影响的版本中,Nginx 读取路径中的字符时候,遇到空格会认为路径部分结束,接下来是 HTTP 协议版本,如果在空格后面接着一个空字节(0x00),Nginx 错误地跳过正常终止逻辑,允许非法字符序列进入后续路径处理。攻击者修改文件后缀,末尾有一个空格,Nginx 接收到请求后在磁盘找到相应文件后认为请求合法,但完整路径是/uploadfiles/文件名.gif[0x20] [0x00].php,配置文件 conf 正则匹配到.php,就会交给后端 FastCGI 处理,由于 FastCGI 协议和 PHP 解析器是基于 C 语言字符串处理,C 语言中的 0x00 代表字符串结束,PHP 实际处理的文件则是/uploadfiles/文件名.gif,因为该文件已经被 Nginx 指定文件后缀,PHP 会忽略其 gif 后缀,直接解析其中的 PHP 代码,导致远程代码执行

漏洞复现:

现成的 vulhub 来拉取镜像

1
2
3
4
5
6
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/nginx/CVE-2013-4547
#拉取镜像
docker-compose up -d

1773154432311

写一个 phpinfo,保存为 php 文件

1
<?php phpinfo(); ?>

1773154466853

访问 http://靶机 ip:8080,将刚刚写的的 php 木马上传

1773154489302

上传失败

1773154498191

选择木马 php 文件,用 burpsuite 抓取数据包

1773154569504

发送到 Repeater 模块

1773154729254

修改文件后缀为.gif ,gif 后面有一个空格

1773154881633

发送后返回 200

1773155039760

用 burpsuite 抓取 http://公网 ip:8080/uploadfiles/payload.gif.php 的数据包

1773155089351

发送到 Repeater 模块,并修改访问路径,在 gif 后面加两个空格

1773155128963

到 Hex 将后一个 20(空格)改为 00,后发送返回 200

1773155196297

查看页面,可以看到执行了 phpinfo (),可以上传一句话木马,但是该信道是发一次数据包执行一次命令,并不是连续且实时通信的信道

1773155242548