[英]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.