如何對php程序中的常見漏洞進行攻擊

來源:Chinaasp
之所以翻譯這篇文章,是因為目前關於cgi(現在已經不多人在用瞭)安全性的文章都是拿Perl作為例子,而專門介紹ASP,php(做為現在的主流開發語言)或者jsp(SUN企業級應用的首選)安全性的文章則很少。Shaun Clowes的這篇文章比較全面地介紹瞭php(做為現在的主流開發語言)的安全問題

由於原文比較長,而且有相當一部分是介紹文章的背景或php(做為現在的主流開發語言)的基礎知識,沒有涉及到php(做為現在的主流開發語言)安全方面的內容,因此我沒有翻譯。如果你想瞭解這方面的知識,請參考原文。

文章主要從全局變量,遠程文件,文件上載,庫文件,Session文件,數據類型和容易出錯的函數這幾個方面分析瞭php(做為現在的主流開發語言)的安全性,並且對如何增強php(做為現在的主流開發語言)的安全性提出瞭一些有用的建議。

好瞭,廢話少說,我們言歸正傳!

[全局變量]
php(做為現在的主流開發語言)中的變量不需要事先聲明,它們會在第一次使用時自動創建,它們的類型也不需要指定,它們會根據上下文環境自動確定。從程序員的角度來看,這無疑是一種極其方便的處理方法。很顯然,這也是快速開發語言的一個很有用的特點。一旦一個變量被創建瞭,就可以在程序中的任何地方使用。這個特點導致的結果就是程序員很少初始化變量,畢竟,當它們第一次創建時,他們是空的。

很顯然,基於php(做為現在的主流開發語言)的應用程序的主函數一般都是接受用戶的輸入(主要是表單變量,上載文件和Cookie等),然後對輸入數據進行處理,然後把結果返回到客戶端瀏覽器。為瞭使php(做為現在的主流開發語言)代碼訪問用戶的輸入盡可能容易,實際上php(做為現在的主流開發語言)是把這些輸入數據看作全局變量來處理的。

例如:

<FORM METHOD=”GET” ACTION=”test.php(做為現在的主流開發語言)“>
<INPUT TYPE=”TEXT” NAME=”hello”>
<INPUT TYPE=”SUBMIT”>
</FORM>

很顯然,這會顯示一個文本框和提交按鈕。當用戶點擊提交按鈕時,“test.php(做為現在的主流開發語言)”會處理用戶的輸入,當“test.php(做為現在的主流開發語言)”運行時,“$hello”會包含用戶在文本框輸入的數據。從這裡我們應該看出,攻擊者可以按照自己的意願創建任意的全局變量。如果攻擊者不是通過表單輸入來調用“test.php(做為現在的主流開發語言)”,而是直接在瀏覽器地址欄輸入https://server/test.php(做為現在的主流開發語言)?hello=hi&set…?敲矗?恢故恰?/a>$hello”被創建,“$setup”也被創建瞭。

譯者註:這兩種方法也就是我們通常說的“POST”和“GET”方法。
下面的用戶認證代碼暴露瞭php(做為現在的主流開發語言)的全局變量所導致的安全問題:

<?php(做為現在的主流開發語言)
if ($pass == “hello”)
$auth = 1;

if ($auth == 1)
echo “some important information”;
?>

上面的代碼首先檢查用戶的密碼是否為“hello”,如果匹配的話,設置“$auth”為“1”,即通過認證。之後如果“$suth”為“1”的話,就會顯示一些重要信息。

表面看起來是正確的,而且我們中有相當一部分人是這樣做的,但是這段代碼犯瞭想當然的錯誤,它假定“$auth”在沒有設置值的時候是空的,卻沒有想到攻擊者可以創建任何全局變量並賦值,通過類似“https://server/test.php(做為現在的主流開發語言)?auth=1”的方…且丫?現す?摹?/a>

因此,為瞭提高php(做為現在的主流開發語言)程序的安全性,我們不能相信任何沒有明確定義的變量。如果程序中的變量很多的話,這可是一項非常艱巨的任務。

一種常用的保護方式就是檢查數組HTTP_GET[]或POST_VARS[]中的變量,這依賴於我們的提交方式(GET或POST)。當php(做為現在的主流開發語言)配置為打開“track_vars”選項的話(這是缺省值),用戶提交的變量就可以在全局變量和上面提到的數組中獲得。

但是值得說明的是,php(做為現在的主流開發語言)有四個不同的數組變量用來處理用戶的輸入。HTTP_GET_VARS數組用來處理GET方式提交的變量,HTTP_POST_VARS數組用於處理POST方式提交的變量,HTTP_COOKIE_VARS數組用於處理作為cookie頭提交的變量,而對於HTTP_POST_FILES數組(比較新的php(做為現在的主流開發語言)才提供),則完全是用戶用來提交變量的一種可選方式。用戶的一個請求可以很容易的把變量存在這四個數組中,因此一個安全的php(做為現在的主流開發語言)程序應該檢查這四個數組。

[遠程文件]
php(做為現在的主流開發語言)是一種具有豐富特性的語言,提供瞭大量的函數,使編程者實現某個功能很容易。但是從安全的角度來看,功能越多,要保證它的安全性就越難,遠程文件就是說明這個問題的一個很好的例子:

You May Also Like