[英]PHP magic_quotes_gpc vulnerability
我被分配到我公司的一個遺留Web應用程序,經過一兩天的探索,我發現了一個類似於以下內容的SQL注入向量:
mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");
我試圖對此執行SQL注入測試,但由於PHP的magic_quotes_gpc
模塊已打開,它失敗了。
我知道magic_quotes_gpc
很臟 ,但是我們有數百個 - 如果不是數千個 - 與上面的代碼類似的代碼行。 我們根本無法承擔關閉magic_quotes_gpc
,因為這會讓像這樣的代碼大開。
我想知道上面的代碼是如何“可利用”的,以及我們是否應該立即修復它,或者包括修復它與我們的其他重構任務的任務。
從magic_quotes_gpc
轉移網站的常用方法是添加包裝函數:
function m($s) {
if (get_magic_quotes_gpc())
$s= stripslashes($s);
return mysql_real_escape_string($s);
}
mysql_query("SELECT * FROM foo WHERE bar='".m($_GET['baz'])."'");
這將解決addslashes
無法addslashes
字符集的問題,這可能導致它在某些情況下容易受到攻擊,並且通常會使代碼繼續像以前一樣“工作”。
但是從長遠來看,依賴於輸入轉義是不可持續的,因為它會將斜杠乘以您沒有插入數據庫的輸入字符串,並且無法轉義您從其他來源插入數據庫的字符串。 這是magic_quotes_gpc
錯誤的真正原因:它將輸出階段編碼應用於輸入階段。
因此,添加包裝器函數,然后慢慢更新所有SQL插值以使用它。 當你得到它們時,你可以關掉魔法引號。
只要魔術引號打開,並且你沒有使用一些特殊的字符編碼,它可以通過它來解決問題,你應該沒問題 - 可以這么說。 問題是,無論出於什么原因,魔術引號都不活躍(服務器更改,配置更改),您將需要修復很多漏洞。
我會在開頭添加一行,以確保啟用magic_quotes,如果它們在服務器配置中被禁用。 那么你或多或少會安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.