> For the complete documentation index, see [llms.txt](https://0un390.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://0un390.gitbook.io/notes/articles-and-write-ups/hpp-http-parameter-pollution.md).

# HPP (HTTP Parameter Pollution)

ماهي ثغرة الHTTP Parameter Pollution؟ هي ثغرة تتعلق بكيفية تعامل الموقع مع ال parameters خلال الHTTP request. وهي تحدث عندما يتم ادخال parameters  زائدة عن ما يفترض بالمستخدم إدخالها مما يؤدي الى تصرف غير متوقع, ويمكن تصنيفها الى صنفين الا وهي: server side او client side. في ال client side غالبا هو المتصفح الخاص فيك. وتعتمد هذه الثغرة بشكل عام على تصرف ال server side وكيفية تعامله مع ال parameters.

&#x20;

### 1-server side

هنا نحاول ارسال معلومات غير متوقعة للسيرفر لنرى نتائج غير متوقعة، وهذا الشيء يعتمد على كيفية عمل الموقع والاكواد التي بداخله والتي لا يمكن لنا رؤيتها ولذلك نختبر بعض الأشياء لنرى ردة الفعل من الموقع.

#### <mark style="background-color:green;">مثال1</mark>:

نرى هنا مثال البنك المشهور خلال عملية التحويل. لنفترض أنك تريد تحويل مبلغ 1000 من حساب محمد الى حساب خالد بحيث يكون لدينا ثلاث parameters الا وهي from, to, amount لذلك يكون الطلب كالتالي:

<mark style="background-color:yellow;"><https://www.Mybank.com/profile/transfer?from=mohammed\\&to=khaled\\&amount=1000></mark>

هذا هو الطلب الأصلي ويتوقع الموقع منك ادخال 3  parameter فقط، ولكن، ماذا لو عدلنا عليه واضفنا parameter  اخر؟ مثال:

<mark style="background-color:yellow;"><https://www.Mybank.com/profile/transfer?from=mohammed\\&to=khaled\\&amount=1000\\&from=abdullah></mark>

هنا اضفنا parameter اخر الا وهو from واضفنا مستخدم اخر وهو Abdullah, وهنا تكمن احتمالية اننا يمكن ان نحول من حساب Abdullah والذي لا نملكه الى حساب Khaled.

#### <mark style="background-color:green;">مثال2</mark>:&#x20;

تعتمد ردة فعل الموقع على التقنيات المستخدمة فيه لذلك نحتاج ان نجرب.

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FrNf17pBjNOOWR5vGJQ6o%2Fimage.png?alt=media\&token=415fd48c-ed6d-450b-b377-004651bf3a68)

مثلا هنا في مثال لل PHP وكيفية تعامله مع ال parameters:

```
<html>
<head>
  <title>HPP</title>
</head>
<body>
  <?php
    if (isset($_GET["q"]) && !empty($_GET["q"])) {
      echo "You have searched for " . $_GET["q"] . "!";
      exit(0);
    }
  ?>
  <form method=get action=""> Input: <input name="q"> </form>
</body>
</html>

```

هنا ندخل parameter   اسمه q وراح يطبع 'You have searched for parameter'  نجرب parameter  واحد بعدها نجرب اثنين ونرى الفارق بينهم.

&#x20;![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FhHe0jCDayExJYD1BDVtk%2Fimage.png?alt=media\&token=d5f4d8e0-22c8-45b2-9ef5-fa9d514f31d1)

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FaKa6ciZaHBtT7l7J6Aio%2Fimage.png?alt=media\&token=e4424581-7ab5-4fdd-bd5d-062705eaf42d)

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FDwVQABrtSdKBOv5rq6Nn%2Fimage.png?alt=media\&token=f2d9e02d-e300-44bc-957b-6fb7ba208c76)

هنا نرى انه في حالة أدخلنا parameter  اخر راح يأخذ قيمة ال parameter الأخير.

#### <mark style="background-color:green;">مثال3:</mark>

هنا نطلع على احدى لابات الport swiggers  واستطعنا الوصل الى XSS عن طريق الHPP.

هنا الطلب الأصلي: <mark style="background-color:yellow;">js/geolocate.js?callback=setCountryCookie/</mark>

&#x20;![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2F2avzKHZrePoRiqucuAg9%2Fimage.png?alt=media\&token=4aa3fd9f-f0b2-4f52-8d3e-341a8398f834)

هنا الطلب بعد التعديل عليه:

&#x20;<mark style="background-color:yellow;">/js/geolocate.js?callback=setCountryCookie\&utm\_content=Myname;callback=alert(1)</mark>

&#x20;![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2F0jhxqvAwV0Q2xGWOshx4%2Fimage.png?alt=media\&token=5275e377-6341-4faa-9001-5c653cfd2411)

وهنا النتيجة:

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FGocMT82Zp8yYwlR5dtDx%2Fimage.png?alt=media\&token=bfacfb9e-fd43-4aa4-9b2b-2b79966cc49f)

### 2-client side

هنا التأثير يكون عند المستخدم وليس السيرفر، وغالبا تؤثر على التصرف على جهازك عن طريق المتصفح

#### <mark style="background-color:green;">مثال4:</mark>

هنا نطبق على الbWAPP والسيناريو هو عبارة عن تصويت ل اسم فلم, ويطلب منك ادخال اسمك والتصويت

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-1.php></mark>

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FeJZ1jxLRUNWRNGC233Sd%2Fimage.png?alt=media\&token=f603a5fb-ae29-4312-af76-bddaa926eec8)

نجرب ندخل اسم ليصبح الطلب هكذا, وتظهر لنا قائمة بعدة أفلام لنصوت لها

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-2.php?name=khaled\\&action=vote></mark>

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FjZI1hpRuOkt2IryvEw3b%2Fimage.png?alt=media\&token=c44bb30a-e27f-4ea6-a743-d4b61347d4b2)

هنا يتغير الطلب بمجرد ان نصوت لفلم معين ليصبح هكذا:

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-2.php?movie=9\\&name=khaled\\&action=vote></mark>

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2Fn9eu5p2YsAaPvlj100AV%2Fimage.png?alt=media\&token=3dc4146e-661e-43fc-b259-331427bcafae)

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-2.php?movie=2\\&name=khaled\\&action=vote></mark>

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2F1459WmVAqQDvI8ZQjVUu%2Fimage.png?alt=media\&token=102c5575-af73-4ac9-a24a-9ab7fc072dc6)

والان نجرب ادخال هذه القيمة في الparameter: \&movie=2 لنرى ماهي النتيجة

&#x20;![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2F7CmWhshy2cV2vPmBrXz5%2Fimage.png?alt=media\&token=38102967-5a2b-4bc0-ba72-e941438c3dbe)

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-2.php?name=\\&movie=2\\&action=vote></mark>

هنا بمجرد ان نصوت لأي فيلم نلاحظ ان التصويت يذهب الى الفيلم رقم 2

<mark style="background-color:yellow;"><http://localhost/bWAPP/hpp-2.php?movie=9\\&name=\\&movie=2\\&action=vote></mark>

![](https://2752057469-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FR6AKTTx9BiP41XS2dxsN%2Fuploads%2FR2ZPvj0NRWvc5vun20xc%2Fimage.png?alt=media\&token=ded83b97-3bd0-432f-a1a5-6f3797f58261)

### 3-تكنيكات

```
-اذا رأيت أي parameter حاول تضيف  parameter اخر سواء كان بنفس الاسم او اسم اخر وباي قيمة عشوائية لترى رد فعل السيرفر
```

```
-إذا رأيت رابط يتصل بخدمة أخرى مثلا:
 https://www.example.com/welcome?url=https://www.some_site.com/post
حاول إضافة parameter اخر هكذا:
https://www.example.com/welcome?url=https://www.some_site.com/post&url=https://attacker.com
وربما تصل الى ثغرة  open redirect بهذه الطريقة
```

```
-اذا وجدت أي شيء يدل على معرف للمستخدم مثل ID, UID, Profile   الخ.. حاول إضافة parameter  اخر وربما تصل الى ثغرة IDOR مثال:
https://example.com/page?id=22
  ليصبح هكذا:
https://example.com/page?id=22&id=90
```

```
-عندما تجد خانة لإضافة ايميل في موقع، حاول إضافة نفس الايميل عدة مرات او اضف عدة ايميلات أخرى, ولاحظ: هل سيتم ارسال رسالة التأكيد او التسجيل او الOTP الى كل الايميلات ؟ او الى ايميل واحد فقط ؟
```

### 4-مصادر

<https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/04-Testing_for_HTTP_Parameter_Pollution>

<https://blog.mindedsecurity.com/2009/05/client-side-http-parameter-pollution.html>

<https://www.blackhat.com/docs/webcast/bhwebcast28-balduzzi.pdf>

<https://www.madlab.it/slides/BHEU2011/whitepaper-bhEU2011.pdf>

<https://macrosec.tech/index.php/2021/05/24/http-parameter-pollution-hpp/>

<https://twitter.com/paulosyibelo/status/1430972472942284806>

<https://infosecwriteups.com/behind-the-scene-http-parameter-pollution-534b4fa2449c>

<https://www.acunetix.com/blog/whitepaper-http-parameter-pollution/>

<https://fsec404.github.io/blog/HTTP-parameter-pollution/>

<https://www.youtube.com/watch?v=QVZBl8yxVX0&t=350s>
