2013-05-09 53 views
1

我發現代碼中的某個地方沒有正確地轉義字符串。我一直在試圖看看它是否可以利用(不要擔心,我最終會逃避它或使用準備好的語句,這只是一個學習體驗)。存儲過程中的SQL注入?

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

查詢是在PHP中生成的,像這樣:

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

通過輸入$_UnescapedStringtest'); 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

回答

1

聲明,我使用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; -- ') 

也許DROP TABLE命令沒有執行,由於用戶帳戶在其下運行有PE不足執行DDL語句的權限?

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

+0

我想知道'%DROP TABLE%'部分是否可以用來過早關閉'CONCAT',然後運行'DROP'命令?我在網上查看後使用的帳戶具有完全訪問權限,我相信這是因爲'mysqli-> query()'只出於安全原因而允許單個查詢。 – MatthewMcGovern 2013-05-09 11:02:27

+0

根據我的經驗,沒有通過可能過早關閉'CONCAT'的參數輸入。 – 2013-05-09 11:07:07