2012-10-10 45 views
1

我一直在互聯網上搜索二階SQLi的演示,但我還沒有找到一個。許多網站並沒有對其工作原理給出徹底的解釋。 我需要提供一個簡短的演示,我一直在練習使用Mutillidae。任何人都能帶領我走向正確的方向嗎?哪裏可以獲得有關二次SQL注入的資源和演示?

回答

0

谷歌搜索'二階SQL注入'時會出現一些或多或少關於二階SQL注入的相關解釋,並且具有不同程度的細節(如您所說)。

其基本思想是數據庫存儲用戶的一些文本,稍後將其合併到SQL語句中 - 但是在重用之前文本沒有經過充分的清理。

想象一個允許用戶針對數據庫創建用戶定義查詢的應用程序。一個簡單的例子可能是一個錯誤跟蹤系統。某些用戶定義的查詢屬性可能是簡單的條件,例如「錯誤狀態已關閉」。這可能通過查看存儲查詢定義進行編碼:

CREATE TABLE UserDefinedQuery 
(
    ...user info..., 
    bug_status VARCHAR(20), 
    ...other info... 
); 

SELECT ..., bug_status, ... 
    INTO ..., hv_bug_status, ... 
    FROM UserDefinedQuery 
WHERE bug_status IS NOT NULL 
    AND ...other criteria... 

其中hv_bug_status是主變量(PHP,C,你使用任何語言)控股的錯誤狀態的標準。

如果這個值是= 'closed',然後將得到的SQL可能包含:

SELECT * 
    FROM Bugs 
WHERE status = 'closed' 
    AND ...other criteria... 

現在假設當用戶定義自己的查詢,他們寫道代替:

= 'open' or 1=1 

這意味着產生查詢現在看起來像:

SELECT * 
    FROM Bugs 
WHERE status = 'open' or 1=1 
    AND ...other criteria... 

存在的OR戲劇性地改變了查詢的含義,並將顯示各種其他記錄,這些記錄不是用戶打算查看的記錄。這是錯誤查詢應用程序中的一個錯誤。如果此修改意味着CustomerX可以看到其他客戶CustomerY和CustomerZ報告的不應該看到的錯誤,那麼CustomerX已經設法創建二階SQL注入攻擊。 (如果注入僅僅意味着他們看到的記錄比他們應該看到的要多,包括那些與他們無關的記錄,那麼他們只是創建了一個錯誤的查詢。)顯然,在VARCHAR(20)中,字段,因爲SQL是一種冗長的語言,所以用於注入致命SQL的選項是有限的。但如果條件存儲在更長的字段中,則可能會觸發'little Bobby Tables'

='';DELETE Bugs;-- 

(使用DELETE語句非標準收縮;,在18個字符尖叫聲中)

你如何避免這種情況?不要允許用戶編寫包含在生成的SQL中的原始SQL片段。相應地對待在UserDefinedQuery.Bug_Status值作爲字符串值的空間/逗號分隔的列表,並構建查詢:

SELECT * 
    FROM Bugs 
WHERE status IN ('=', '''open''', 'or', '1=1') 
    AND ...other criteria... 

查詢可能沒有用處,但它並沒有得到其結構由數據改變在UserDefinedQuery表中。

相關問題