茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1673386 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00331.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

PHP特區 : [轉貼]php $_SERVER['PHP_SELF']漏洞

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]php $_SERVER['PHP_SELF']漏洞

Php $ SERVER "PHP SELF" 漏洞

出自Guoshuang Wiki

REQUEST_URI 返回的是包括後面數據串的地址,如 index.php?str=1234PHP_SELF 是 index.php


$_SERVER[』PHP_SELF』]在開發的時候常會用到,一般用來引用當前網頁地址,並且它是系統自動生成的全局變量,也會有什麼問題麼?讓我們先看看下面的代碼吧:


<form action=」<?php echo $_SERVER[』PHP_SELF』]; ?>」><input type=」submit」 name=」submit」 value=」submit」 /></form>

  這段代碼非常簡單,我們想用$_SERVER[』PHP_SELF』]來讓網頁提交時提交到它自己,假設代碼文件名為test.php,在執行的時候就一定會得到我們期望的地址麼?首先試試地址http://…/test.php,結果當然是沒有問題的啦,別著急,你再訪問一下 http://…/test.php/a=1,將會得到如下客戶端代碼:

<form action=」/fwolf/temp/test.php/a=1〞><input type=」submit」 name=」submit」 value=」submit」 /></form>

顯然,這已經超出了我們的期望,web服務器居然沒有產生諸如404之類的錯誤,頁面正常執行了,並且在生成的html代碼中居然有用戶可以輸入的部分,恐怖的地方就在這裡。別小看那個「a=1」,如果把它換成一段js代碼,就顯得更危險了,比如這麼調用:

  
http://…/test.php/%22%3E%3Cscript%3Ealert(』xss』)%3C/script%3E%3Cfoo

是不是看到了js的alert函數執行的效果?檢查一下生成的html源代碼找找原因吧。

通過這種嵌入js代碼的方式,攻擊者能夠獲得512~4k的代碼空間,甚至還可以連接外部網站的js代碼或者通過image調用來偽裝js代碼的方式,那樣js代碼的長度就不受限制了,然後通過js,他們可以輕鬆的獲取用戶的cookie,或者更改當前頁面的任何內容,比如更改表單提交的目的地,更改顯示的內容(比如給一個鏈接地址增加一個onclick=…的屬性,這樣用戶點擊的時候就會執行攻擊者指定的代碼,甚至連接到並非此鏈接地址本身的網站),甚至作出一個ajax效果來也不一定,總之,不要忽視js的威力。

  那麼,再來看看這個漏洞產生的原理,首先test.php/….這種調用是web服務器允許的,很多cms系統,比如我以前用過的plog,好像也是採用這種方式,在服務器不支持rewrite的情況下實現諸如 http://… /index.php/archive/999這樣的固定網址的(我以前還以為是對404錯誤頁下的手),所以帶「/」的地址無法從web服務器上禁止。然後再看看php中對$_SERVER[』PHP_SELF』]的識別,他就是一個包含當前網址值的全局變量,天知道用戶會輸入什麼樣的網站,在上面的例子中是惡意的,可是在wikipedia這樣的網站上,卻又是可以正常使用這種方式的地址的。所以,最終的結論要落在開發人員身上了,沒有很好的處理與用戶交互的數據。

  從安全角度來講,在開發應用尤其是web應用的時候,所有用戶提交的數據都是不安全的,這是基本原則,所以我們才不厭其煩的又是客戶端驗證又是服務端驗證。從上面說的這個安全漏洞來講,不安全的內容中又要增加「網址」一條了。要解決$_SERVER[』PHP_SELF』]的安全隱患,主要有以下2種方式:

  1、htmlentities


  用htmlentities($_SERVER[』PHP_SELF』])來替代簡單的$_SERVER[』PHP_SELF』],這樣即使網址中包含惡意代碼,也會被「轉換」為用於顯示的html代碼,而不是被直接嵌入html代碼中執行,簡單一點說,就是「<」會變成「<」,變成無害的了。

  2、REQUEST_URI

  用$_SERVER[』REQUEST_URI』]來替代$_SERVER[』PHP_SELF』],在phpinfo()中可以看到這兩個變量的區別:

_SERVER[」REQUEST_URI」] /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(』xss』)%3C/script%3E%3Cfoo_SERVER[」PHP_SELF」] /fwolf/temp/test.php/」>

  $_SERVER[』REQUEST_URI』]會原封不動的反映網址本身,網址中如果有%3C,那麼你得到的也將會是%3C,而$ _SERVER[』PHP_SELF』]會對網址進行一次urldecode操作,網址中的%3C將會變成字符「<」,所以就產生了漏洞。需要注意的是,在很多情況下,瀏覽器會對用戶輸入要提交給web服務器的內容進行encode,然後服務器端程序會自動進行decode,得到相應的原指,在我們進行post或者get操作的時候都是這樣。

  另外還有兩點需要指出,第一是這種寫法雖然沒有直接用到$_SERVER[』PHP_SELF』],但實際效果卻是一樣的,只是發生的時間錯後到了用戶提交之後的下一個頁面,所以,form的action還是不要留空的好。第二點,除了PHP_SELF之外,其他的$_SERVER變量也許也會有類似的漏洞,比如SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他們之前一定要先作htmlentities之類的轉換。

原文出處:
http://wiki.guoshuang.com/Php_$_SERVER_%22PHP_SELF%22_%E6%BC%8F%E6%B4%9E"
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|