漏洞摘要
NodeJS 14.13.1 版本在处理HTTP请求头部时时,允许两个一样的头字段存在,并且在处理字段时,第一个字段的值为准,这样可以让我们发送两个Transfer-Encoding字段头,在某些条件下可以触发一个CL-TE型的HTTP Request Smuggling。漏洞提交到hackerone,得到确认,分配了一个CVE:CVE-2020-8287。
漏洞复现
使用haproxy作为前端代理演示漏洞,TE-TE型利用
配置前端代理haproxy 1.5.3,配置文件haproxy.cfg,配置文件禁止了对/flag目录的访问
1 | global |
配置后端NodeJS服务脚本app.js,脚本对/flag目录访问返回设置内容
1 | var express = require('express'); |
POC
1 | POST / HTTP/1.1 |
使用POC发包后,前端代理haproxy依次处理了两个请求头字段Transfer-Encoding
,并以第二个头字段值为准,haproxy识别到无效头Transfer-Encoding: chunked-false
,认为数据包是非Transfer-Encoding型HTTP请求,把58字节数据传递给后端NodeJS。
NodeJS收到前端转发给他的HTTP请求后,依次处理了两个请求头字段Transfer-Encoding
,并以第一个头字段值为准,第一个头字段Transfer-Encoding: chunked
是一个合法的TE头,检查通过,认为自己收到了一个Transfer-Encoding
型HTTP请求,把0\r\n
前的数据作为一个HTTP请求,0\r\n
后的数据作为另一个HTTP请求,最终导致HTTP Request Smuggling。
POC攻击成功,将绕过前端代理haproxy对/flag目录的访问限制。
同样的问题在PHP中也存在,但是PHP认为这不是一个安全问题:https://bugs.php.net/bug.php?id=80043