# Week11 7-5 、 SQL Injection
###### tags: `BE101` `PHP` `2020十一月第二周` `進度筆記` `Lidemy心得`
***
## 駭客的填字遊戲 - SQL Injection
- User 登入網頁時,之前我們有透過 hash 的方式讓密碼被 hash 並存在 server 。
- 之前我們撈 username 的時候 , SQL 上的語法 `sql = sprintf("SELECT * from users where username='%s' and password='%s'", $username)` 是用字串拼接的方式。
- 而用 hash 的形式在 phpMyAdmin 上執行:
```
SELECT * from users where username='aa'#' and password='bbb'
相同於以下這段
SELECT * from users where username='aa'
```
'#' 之後的字都變黃色,代表註解;如果 username 用 '#' 字串傳入,這樣就會成立 query , 而且會以 aa 的身分登入網頁。
- 這樣會有個問題,知道 username 就可以任何人的身分登入。
***
## 不知道 user 身分也可以登入
```
SELECT * from users where username='%s' and password='%s'
如果改用這段
SELECT * from users where username='' or 1=1#
```
1=1 是 true , 會把資料庫所有的 users 都 select 出來。
- 也因此帳號填入 `' or 1=1#` , 而密碼隨便填:
```
username: ' or 1=1#
password:123
整段 query 變成
SELECT * from users where username='' or 1=1# and password='123'
```
這樣也會把所有資料都 select 出來。
- 也因此填入惡意構造的字串,注入到 SQL 後就會變成不同的意思,掌握了 query 。
***
## 新增留言的部分也能注入
```
INSERT INTO comments(nickname, content)
values('%s', '%s')
↓
nickname: a, content: b
↓
INSERT INTO comments(nickname, content)
values('a', 'b')
```
==INSERT INTO 的指令可以同時塞入多個指令。==
- 一個 INSERT INTO 可以塞入多筆資料。
- 這樣可以試著把原本的 query 改成,這樣塞入多筆資料的形式。
- 這樣就能控制 `content` 的 `%s` 例如:
```
content: '), ('admin', 'test')
↓
INSERT INTO comments(nickname, content)
values('%s', ''), ('admin', 'test')
```
Query 就會變成 insert into comments 然後塞入兩個 values 。
- 將這個 `'), ('admin', 'test')` 貼在沒有防止 SQL Injection 的留言板上會新增兩個 comments 。
- 應用字串拼接的方式來拼湊改造,達到想要的入侵目的。
***
## insert into 的內容可被修改
`insert into` 的內容可以是 `select` 的內容,例如:
```
insert into comments(nickname, content)
values('aaa', (select password from users limit1))
```
sub-query 的概念,一個 query 內可以有其他的 query 。
- 這樣就有被偷取密碼的風險,甚至可以更改、選定特定用戶的資料出來。
```
'), ((select username from users where id=40), (select password from users where id=40))#
```
這樣會把 `id=40` 的 user 的帳號和密碼給撈出來。
***
## 預設資料庫
- information schema : INNODB_SYS_TABLE 。
- 如果欄位的取名類似,可以被猜出來,用字串拼接(惡意字串)的方式下去撈出資料。
***
參考資料:
[\[Postx1\] 攻擊行為-SQL 資料隱碼攻擊SQL injection - iT 邦幫忙](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAFegQIARAC&url=https%3A%2F%2Fithelp.ithome.com.tw%2Farticles%2F10189201&usg=AOvVaw0yZ9T4kF3QGlDT_oohsfKm)
[資安滲透攻防筆記-1\. SQL隱碼攻擊(SQL INJECTION ATTACK ...](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAGegQIFBAC&url=https%3A%2F%2Fmedium.com%2F%40gordonfang_85054%2F%25E8%25B3%2587%25E5%25AE%2589%25E6%25BB%25B2%25E9%2580%258F%25E6%2594%25BB%25E9%2598%25B2%25E7%25AD%2586%25E8%25A8%2598-1-c9a6b8ada5fa&usg=AOvVaw3ZLj3TGdtX5xD5sMPeVtif)
[一次看懂SQL Injection 的攻擊原理| by Jayden Lin | 程式猿吃 ...](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAHegQIDhAC&url=https%3A%2F%2Fmedium.com%2F%25E7%25A8%258B%25E5%25BC%258F%25E7%258C%25BF%25E5%2590%2583%25E9%25A6%2599%25E8%2595%2589%2F%25E6%25B7%25BA%25E8%25AB%2587%25E9%25A7%25AD%25E5%25AE%25A2%25E6%2594%25BB%25E6%2593%258A-%25E7%25B6%25B2%25E7%25AB%2599%25E5%25AE%2589%25E5%2585%25A8-%25E4%25B8%2580%25E6%25AC%25A1%25E7%259C%258B%25E6%2587%2582-sql-injection-%25E7%259A%2584%25E6%2594%25BB%25E6%2593%258A%25E5%258E%259F%25E7%2590%2586-b1994fd2392a&usg=AOvVaw2r1xSjang4bH-tPVJoxX0N)
[SQL Injection 範例(登入範例) @ 史丹利愛碎念:: 痞客邦::](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAIegQIDxAC&url=https%3A%2F%2Fnewaurora.pixnet.net%2Fblog%2Fpost%2F166231341-sql-injection-%25E7%25AF%2584%25E4%25BE%258B%2528%25E7%2599%25BB%25E5%2585%25A5%25E7%25AF%2584%25E4%25BE%258B%2529&usg=AOvVaw2XEIGuLALcyCUm2wUXuHbW)
[SQL Injection 常見的駭客攻擊方式 - Puritys Blog](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAJegQIERAC&url=https%3A%2F%2Fwww.puritys.me%2Fdocs-blog%2Farticle-11-SQL-Injection-%25E5%25B8%25B8%25E8%25A6%258B%25E7%259A%2584%25E9%25A7%25AD%25E5%25AE%25A2%25E6%2594%25BB%25E6%2593%258A%25E6%2596%25B9%25E5%25BC%258F.html&usg=AOvVaw1dlrzUiP9-W6EySbzWHaXf)
[何謂資料隱碼(SQL injection)攻擊?程式設計師應如何預防 ...](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAKegQIEhAC&url=https%3A%2F%2Fjob.achi.idv.tw%2F2011%2F09%2F11%2Fwhat-is-a-sql-injection-sql-injection-attacks-program-designers-should-be-how-to-prevent-it%2F&usg=AOvVaw0beac0TEPZCRq8hkciAXf4)
[18-5 資料隱碼(SQL Injection)](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjALegQIEBAC&url=http%3A%2F%2Fmirlab.org%2Fjang%2Fbooks%2Fasp%2FsqlInjection.asp%3Ftitle%3D18-5%2520%25B8%25EA%25AE%25C6%25C1%25F4%25BDX%25A1%255DSQL%2520Injection%25A1%255E&usg=AOvVaw1iYqtIXUOGYuR4sJYovRI6)
[SQL 注入- 術語表| MDN](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjn1Z35vrPtAhUSiZQKHb46BFYQFjAMegQIExAC&url=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-TW%2Fdocs%2FGlossary%2FSQL_Injection&usg=AOvVaw25wwRnk2h4Gu8qd-JybECM)
***
# Week11 7-6 、 預防 SQL Injection
###### tags: `BE101` `PHP` `2020十一月第二周` `進度筆記` `Lidemy心得`
***