# CTF-從入門到菜雞之路4 ## SQL基本介紹 ~~稍微進階到我也不太會的東東了~~ 首先要來介紹SQL這個東東 https://zh.wikipedia.org/wiki/SQL 簡單的來說他代表的是一種資料庫結構 而如果視覺化一個SQL資料庫會長得像這樣 | id | name | password | | -- | ------ | ---------- | | 1 | Kirito | LinkStart | | 2 | Asuna | Busna | 而這種類型的資料庫皆需要透過SQL的語句來進行操作 像是如下的語句 ```sql SELECT name FROM table1 WHERE password="LinkStart" ``` 上面的算是最基本的查詢語句 SELECT name FROM table1 代表的是查詢table1裡name的這個欄位 WHERE password=123 代表的是限制為只有password=123的欄位 這算是最基本的語句 如果要看一些其他語句的用法請參閱wiki或google ## SQL Injection 而今天當程式語言要執行一個SQL的動作時 必須要先構建一個SQL語句的字串 像是(以下為pseudo code) ``` var user = input() var pass = input() var line = "SELECT user FROM table WHERE user='${user}' AND pass='${pass}'" var result = sql.exec(line) if(result){ login() }else{ notLogin() } ``` 如果我隨便輸入Kirito跟LinkStart 構建成的語句應該會長這樣 ```sql SELECT user FROM table WHERE user='Kirito' AND pass='LinkStart' ``` 乍看之下似乎沒什麼問題 但是假如我在輸入中加入'會發生什麼事呢? 把Kirito改成K'irito ```sql SELECT user FROM table WHERE user='K'irito' AND pass='LinkStart' ``` ~~從hackmd的程式碼上色就可以看到很憨的事情出現了~~ 當然如果只有這樣子的話,在執行SQL查詢的時候會直接出錯 但是似乎這樣給了我們方法可以來控制SQL的語句 如果我把K'irito再改成Kirito' AND pass='1';呢? ```sql SELECT user FROM table WHERE user='Kirito' AND pass='1';--' AND pass='LinkStart' ``` * ;代表將SQL語句分開 * -\-代表忽視 似乎我成功的把原本輸入的password改成1了呢 也就是說我們有辦法改變他的條件式了 這就是SQL injection的概念 ## UNION Base Injection > UNION 運算子用來將兩個(以上) SQL 查詢的結果合併起來,而由 UNION 查詢中各別 SQL 語句所產生的欄位需要是相同的資料型別及順序。 這是UNION的基本介紹 也就是說UNION可以同時查詢不同的資料表並且組合起來輸出 假設今天有一個語句是長這樣 並且會顯示查詢的結果 ```sql SELECT name, FROM fruits WHERE name='apple' ``` 而name是由使用者輸入的 這時我們便可以構造以下的攻擊字串 ' UNION SELECT password FROM users WHERE name='admin ```sql SELECT name FROM fruits WHERE name='' UNION SELECT password FROM users WHERE name='admin' ``` ## Blind Base Injection 很多時候,對方的網站可能不會將結果完整的呈現 這時候我們只能透過跟對方玩是或不是的遊戲來盲猜資料庫的資訊 而這種攻擊方式又分成Boolean Base以及Time Base ### Boolean Base 是透過構建不同的判斷式來達成 比如說 ```sql SELECT * FROM fruits WHERE name='something' ``` 而我們構建一個字串並在後面加上 `AND substring(version,1,1)=4--` ```sql SELECT * FROM fruits WHERE name='apple' AND substring(version,1,1)=4;--' ``` 我們便可以透過是否回傳結果來不斷猜測 來獲得對方資料庫的詳細資訊 ### Time Base 而有些時候,對方連是或不是的遊戲都不跟你玩 你只能透過使用不同的函式並且透過回傳結果的時間來慢慢獲取對方資料庫的資訊 ## 練習題目跟外部資源 https://ithelp.ithome.com.tw/articles/1024010 講得比我完整太多了 PicoCTF https://play.picoctf.org/practice/challenge/80?category=1&page=2 Irish-Name-Repo 1 https://play.picoctf.org/practice/challenge/59?category=1&page=2 Irish-Name-Repo 2 https://play.picoctf.org/practice/challenge/8?category=1&page=3 Irish-Name-Repo 3 有用到簡單的古典密碼加密(沒吃過也看過它走路的那種) SQLmap https://sqlmap.org/ 當你不會SQL injection的時候 用這東西掃下去就對了