我的一位安全顧問就我的一個客戶的網站提出了一個安全問題:
使用Burp Suite Community Edition,使用以下引數字串運行 POST 請求:
search=Search&city=Johannesburg&city=Madrid
PHP 將 POST 陣列填充到:
Array
(
[search] => Search
[city] => Madrid
)
很明顯它會發生,但我想知道我解決這個潛在問題的嘗試是否有任何缺點,除了我能想到的事情,我將在下面提到。這是我嘗試的代碼(PHP,CodeIgniter 3):
$raw_input = explode('&', $this->input->raw_input_stream);
if (!empty($raw_input)) {
$new_post = [];
foreach ($raw_input as $key => $value) {
$param = explode('=', $value);
if (!isset($new_post[$param[0]])) {
$new_post[$param[0]] = $param[1];
}
}
if (!empty($new_post)) {
$_POST = $new_post;
}
}
這導致我的輸出如下,這是我想要實作的表面價值:
Array
(
[search] => Search
[city] => Johannesburg
)
現在 - 我可以看到一些關注點:
- 我知道我仍然需要在 POST 上進行 XSS 清理和所有這些不錯的安全操作。[我只是根據需要在其他地方這樣做——我希望盡早運行這部分代碼,以確保它針對每個頁面/請求運行]
- 我將不得不為 GET 以及可能所有其他 HTTP 動詞執行此操作。[哪個?他們都是?]
- 如果黑客設法在有效引數之前注入重復引數怎么辦?[那可能嗎?]
- 為什么我要為可能已經存在的東西重新發明輪子?[因為我不知道在哪里可以找到合適的解決方案,或者它會是什么樣子。]
任何建議將不勝感激。
uj5u.com熱心網友回復:
您描述的問題是名稱引數污染。這是一個小錯誤,是 Web 服務器的一個特性。例如,如果您的過濾器層在屬性的第一次出現時檢查訪問權限userid,但業務邏輯采用屬性的最后一次出現,則它可能會產生安全隱患。你會得到一個可能被利用的不一致。
如果您容易受到這種型別的攻擊 - 對我來說,這是一個強有力的證據,表明您在代碼中做錯了什么,例如您獲取訊息正文并從 POST 請求中手動提取屬性,然后您以兩種不同的方式進行操作代碼的不同部分。
如果你不做任何非常愚蠢的事情,這種攻擊不會傷害系統,也不需要任何緩解代碼。
除非你真的必須修復這樣的東西,在這種情況下我會說 - 在請求到達 Web 服務器之前使用 WAF 來清除請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417740.html
標籤:
