我在寫一些單元測試,以確保我的代碼在各種字符集下不容易受到SQL注入的攻擊。 big5
,cp932
,gb2312
,gbk
和sjis
如何使用Shift-JIS和CP932創建SQL注入攻擊?
這是因爲如果你的逃避者配置不正確,就會看到:
據this answer,您可以通過使用以下字符集的一個注入\xbf\x27
創建漏洞0x27
並嘗試將其轉義爲\xbf\x5c\x27
。但是,\xbf\x5c
實際上是其中一個字符在這些字符集中,因此報價(0x27
)未經轉義。
然而,正如我通過測試發現的,這並非完全正確。它適用於big5
,gb2312
和gbk
但既不0xbf27
或0xbf5c
在sjis
和cp932
有效字符。
兩個
mb_strpos("abc\xbf\x27def","'",0,'sjis')
和
mb_strpos("abc\xbf\x27def","'",0,'cp932')
返回4
。即,PHP不會將\xbf\x27
看作單個字符。這爲big5
,gb2312
和gbk
返回false
。
而且,這樣的:
mb_strlen("\xbf\x5c",'sjis')
返回2
(它返回1
爲gbk
)。
所以,問題是:是否有另一個字符序列,使sjis
和cp932
容易受到SQL注入,或者是他們居然不弱勢在所有?或者是說謊的PHP,我完全錯誤了,MySQL會完全不同的解釋?
我見過這個SQL注入與[Node.JS](http://meta.security.stackexchange.com/a/2243/25859)同時參與CTF。 [理論在那裏(第34頁)](https://www.ipa.go.jp/files/000017321.pdf)關於它如何工作,但我似乎無法複製它在PHP中。更多關於我嘗試[在php聊天室中](http://chat.stackoverflow.com/transcript/message/29401516#29401516)。對於任何能提供具體方式/設置的人來說,我將在這個問題上給予獎勵。 – HamZa 2016-03-17 15:12:27
測試你的代碼總是很好的。但是,如果您確實希望使您的應用程序更安全地針對SQL注入,則可能希望在網關中使用預準備語句,並分別向數據庫發送sql和數據。 mysqli和pdo都支持這種處理問題的方法。 當您使用不同的數據重複執行相同的語句時,使用預準備語句還可以顯着提高速度。 http://stackoverflow.com/questions/8263371/how-can-prepared-statements-protect-from-sql-injection-attacks – Max 2016-03-23 18:29:06
防止SQL注入攻擊的唯一方法是使用參數化查詢而不是字符串連接並且更換。沒有任何轉義量可以解決這個問題。編寫參數化查詢代碼比使用字符串操作要容易得多。這個'mb_strpos'調用的存在意味着代碼容易受到注入攻擊。 – 2016-03-24 13:39:32