簡體   English   中英

在存儲過程中進行SQL注入?

[英]SQL Injection within a stored procedure?

我在代碼中的某個地方發現了無法正確轉義字符串的地方。 我一直在嘗試查看它是否可利用(不用擔心,無論如何我最終都會轉義它或使用准備好的語句,這只是為了學習)。

這是使用mysqli->query()函數;

查詢是用PHP生成的,如下所示:

$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";

通過輸入$_UnescapedString作為test'); DROP TABLE SomeTable; -- test'); DROP TABLE SomeTable; -- test'); DROP TABLE SomeTable; --我得到了查詢:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

該查詢已成功運行,但似乎沒有運行第二個查詢。 我通過在第二個查詢中放入無效的SQL進行了測試,沒有出現錯誤。 我認為這意味着mysqli足夠聰明,只能執行一個查詢?

現在我的問題是,我可以以某種方式將SQL注入存儲過程本身嗎? 步驟如下:

BEGIN
   SELECT COUNT(*) AS SomeCount
   FROM DataTable
   WHERE DataTable.SomeID = _SomeID
   AND DataTable.SomeValue LIKE CONCAT('%',_UnescapedString,'%');
END

我已經嘗試了各種SQL,例如test','%')--來查看查詢是否會正常進行,但是它只會更改存儲過程調用,即:

CALL some_proc(1, 'test', '%')--');

無論如何,將DROP TABLE命令放入_UnescapedString

免責聲明,我使用的是SQL Server,而不是mySQL,但是假設關於存儲過程中參數的行為是相同的,並且還假定_UnescapedString是輸入參數,因此將DROP TABLE放在參數中看起來像這樣:

SELECT COUNT(*) AS SomeValue
FROM DataTable
WHERE DataTable.SomeID = _SomeID
AND DataTable.SomeValue LIKE '%DROP TABLE%');

關於查詢:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

也許由於正在運行的用戶帳戶沒有足夠的權限執行DDL語句,所以DROP TABLE命令沒有執行?

限制用於從Web服務器訪問數據庫的用戶帳戶的權限是一種限制SQL注入攻擊可能造成的損害的方法。 但是,這不會阻止他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM