兩個可能洩漏系統資訊的 PHP 漏洞
阿恆
系統保安網站 Hacker Webzine 最近有一篇文章,介紹兩個可能洩漏伺服器系統資訊的 PHP 漏洞,第一個有關伺服器變量的處理方法,第二個則有關 PHPSESSID 對話標識在用戶端被修改,嚴格來說這兩個不是 PHP 語言的毛病,只要編程人員小心謹慎,一切問題都可以避免。
伺服器變量 $_SERVER 儲存著很多從伺服器送來的變量,很多人不會對這些變量的值進行檢查和「消毒」,因為很多人都以為 $_SERVER 是不可以修改的,事實上 $_SERVER 是可以修改的,尤其是它包含很多從用戶端送來的值,在使用前若不加以檢查消毒,很容易成為注入攻擊的絕佳渠道。有人會說:我的程式對 $_SERVER[“QUERY_STRING”] 執行最嚴謹的檢查,在送到數據庫和輸出前都會轉換成逸出字串(escape string),還會出問題嗎?有可能,除非你的程式連 $_SERVER[“REQUEST_URI”]、$_SERVER[“PATH_INFO”] 等也做逸出轉換。
一個已經被無數次提及,但歷久常新的忠告:不要信任任何從外面得到的數據,即使是伺服器和數據庫的也不例外。順帶一提,phpBB 最最新版本已經修補了這個漏洞。
至於 PHPSESSID 的問題幾乎從未有人提出過,Hacker Webzine 可能是最早提出這個漏洞的網站。資深的 PHP 的開發人員一定不會對 PHPSESSID 陌生,它是 PHP 語言提供的對話標識(session id),只要程式中使用了 PHP 的對話服務,Cookie 中便會附有 PHPSESSID 這個變量來識別用戶,有沒有想過若果在 URL 中把 PHPSESSID 修改成其他值有甚麼後果?伺服器找不到你送去的對話標識,於是產生一大堆錯誤訊息,把很多伺服器的內部資料暴露出來。