我發現代碼中的某個地方沒有正確地轉義字符串。我一直在試圖看看它是否可以利用(不要擔心,我最終會逃避它或使用準備好的語句,這只是一個學習體驗)。存儲過程中的SQL注入?
這是使用mysqli->query()
函數;
查詢是在PHP中生成的,像這樣:
$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";
通過輸入$_UnescapedString
爲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
?
我想知道'%DROP TABLE%'部分是否可以用來過早關閉'CONCAT',然後運行'DROP'命令?我在網上查看後使用的帳戶具有完全訪問權限,我相信這是因爲'mysqli-> query()'只出於安全原因而允許單個查詢。 – MatthewMcGovern 2013-05-09 11:02:27
根據我的經驗,沒有通過可能過早關閉'CONCAT'的參數輸入。 – 2013-05-09 11:07:07