Nginx 文件名逻辑漏洞 CVE-2013-4547
影响范围:
- 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 | #下载vulhub源代码 |

写一个 phpinfo,保存为 php 文件
1 | <?php phpinfo(); ?> |

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

上传失败

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

发送到 Repeater 模块

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

发送后返回 200

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

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

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

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