在PHP中全面阻止SQL注入式攻擊之二

2021-04-17 08:33:08 字數 2008 閱讀 5473

一、 注入式攻擊的型別

如果你的指令碼正在執行乙個select指令,那麼,攻擊者可以強迫顯示乙個**中的每一行記錄-通過把乙個例如"1=1"這樣的條件注入到where子句中,如下所示(其中,注入部分以粗體顯示):

select * from wines where variety = 'lagrein' or 1=1;'

正如我們在前面所討論的,這本身可能是很有用的資訊,因為它揭示了該**的一般結構(這是一條普通的記錄所不能實現的),以及潛在地顯示包含機密資訊的記錄。

一條更新指令潛在地具有更直接的威脅。通過把其它屬性放到set子句中,一名攻擊者可以修改當前被更新的記錄中的任何字段,例如下面的例子(其中,注入部分以粗體顯示):

update wines set type='red','vintage'='9999' where variety = 'lagrein'

通過把乙個例如1=1這樣的恆真條件新增到一條更新指令的where子句中,這種修改範圍可以擴充套件到每一條記錄,例如下面的例子(其中,注入部分以粗體顯示):

update wines set type='red','vintage'='9999 where variety = 'lagrein' or 1=1;'

最危險的指令可能是delete-這是不難想像的。其注入技術與我們已經看到的相同-通過修改where子句來擴充套件受影響的記錄的範圍,例如下面的例子(其中,注入部分以粗體顯示):

delete from wines where variety = 'lagrein' or 1=1;'

二、 多個查詢注入

多個查詢注入將會加劇乙個攻擊者可能引起的潛在的損壞-通過允許多條破壞性指令包括在乙個查詢中。在使用mysql資料庫時,攻擊者通過把乙個出乎意料之外的終止符插入到查詢中即可很容易實現這一點-此時乙個注入的引號(單引號或雙引號)標記期望變數的結尾;然後使用乙個分號終止該指令。現在,乙個另外的攻擊指令可能被新增到現在終止的原始指令的結尾。最終的破壞性查詢可能看起來如下所示:

select * from wines where variety = 'lagrein';

grant all on *.* to 'badguy@%' identified by 'gotcha';'

這個注入將建立乙個新的使用者badguy並賦予其網路特權(在所有的**上具有所有的特權);其中,還有乙個"不祥"的口令被加入到這個簡單的select語句中。如果你遵循我們在以前文章中的建議-嚴格限制該過程使用者的特權,那麼,這應該無法工作,因為web伺服器守護程式不再擁有你撤回的grant特權。但是從理論上講,這樣的乙個攻擊可能給予badguy自由權力來實現他對你的資料庫的任何操作。

至於這樣的乙個多查詢是否會被mysql伺服器處理,結論並不唯一。這其中的一些原因可能是由於不同版本的mysql所致,但是大多數情況卻是由於多查詢存在的方式所致。mysql的監視程式完全允許這樣的乙個查詢。常用的mysql gui-phpmyadmin,在最終查詢之前會複製出以前所有的內容,並且僅僅這樣做。

但是,大多數的在乙個注入上下文中的多查詢都是由php的mysql擴充套件負責管理的。幸好,預設情況下,它是不允許在乙個查詢中執行多個指令的;試圖執行兩個指令(例如上面所示的注入)將會簡單地導致失敗-不設定任何錯誤,並且沒有生成任何輸出資訊。在這種情況下,儘管php也只是"規規矩矩"地實現其預設行為,但是確實能夠保護你免於大多數簡單的注入式攻擊。

php5中的新的mysqli擴充套件(參考http://php.net/mysqli),就象mysql一樣,內在地也不支援多個查詢,不過卻提供了乙個mysqli_multi_query()函式以支援你實現多查詢-如果你確實想這樣做的話。

然而,對於sqlite-與php5繫結到一起的可嵌入的sql資料庫引擎(參考http://sqlite.org/和http://php.net/sqlite)情況更為可怕,由於其易於使用而吸引了大量使用者的關注。在有些情況下,sqlite預設地允許這樣的多指令查詢,因為該資料庫可以優化批查詢,特別是非常有效的批insert語句處理。然而,如果查詢的結果為你的指令碼所使用的話(例如在使用乙個select語句檢索記錄的情況下),sqlite_query()函式卻不會允許執行多個查詢。

在PHP中全面阻止SQL注入式攻擊

在本系列文章中,我們將全面 如何在php開發環境中全面阻止sql注入式攻擊,並給出乙個具體的開發示例。一 引言 php是一種力量強大但相當容易學習的伺服器端指令碼語言,即使是經驗不多的程式設計師也能夠使用它來建立複雜的動態的web站點。然而,它在實現網際網路服務的秘密和安全方面卻常常存在許多困難。在...

在PHP中全面阻止SQL注入式攻擊之一

在本系列文章中,我們將全面 如何在php開發環境中全面阻止sql注入式攻擊,並給出乙個具體的開發示例。一 引言 php是一種力量強大但相當容易學習的伺服器端指令碼語言,即使是經驗不多的程式設計師也能夠使用它來建立複雜的動態的web站點。然而,它在實現網際網路服務的秘密和安全方面卻常常存在許多困難。在...

在PHP中全面阻止SQL注入式攻擊之三

一 建立乙個安全抽象層 我們並不建議你手工地把前面介紹的技術應用於每乙個使用者輸入的例項中,而是強烈推薦你為此建立乙個抽象層。乙個簡單的抽象是把你的校驗方案加入到乙個函式中,並且針對使用者輸入的每一項呼叫這個函式。當然,我們還可以建立一種更複雜的更高一級的抽象 把乙個安全的查詢封裝到乙個類中,從而應...