|
函數(shù)1:show_source("filename"); 函數(shù)2:highlight_file ("filename"); <?php $file = $_GET['f']; $file = $file ? $file : __FILE__; highlight_file($file); ?> 函數(shù)3:highlight_string("string"); <?php highlight_string('<?php phpinfo(); ?>'); ?> 執(zhí)行后,在瀏覽器中輸出: <code><font color="#000000"> <font color="#0000BB"><?php phpinfo</font><font color="#007700">(); </font><font color="#0000BB">?></font> </font> </code> 但是這樣執(zhí)行之后,如果程序員不仔細(xì)檢查,會(huì)有很多的漏洞,給一些別有用心的人以可成之機(jī)~ 下面來(lái)看看具體的解決辦法: 代碼大致功能就是通過(guò)URL中提交一個(gè)變量名為f的變量接受需要高亮顯示代碼的php文件路徑,然后程序在調(diào)用highlight_file函數(shù)來(lái)顯示該文件。然后把該文件保存到我的個(gè)人主目錄的public_html目錄下,文件名為test.php。 現(xiàn)在我們使用firefox打開(kāi):~heiyeluren/test.php,返回的是我們 test.php的文件內(nèi)容,現(xiàn)在我們存取passwd文件看看: ~heiyeluren/test.php?f=/etc/passwd 馬上頁(yè)面里就顯示了很多用戶信息: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... 我們?cè)俨榭磒hp的配置文件php.ini的信息: ~heiyeluren/test.php?f=/usr/local/php/lib/php.ini 馬上顯示了: [PHP] ;;;;;;;;;;; ; WARNING ; ;;;;;;;;;;; ; This is the default settings file for new PHP installations. ; By default, PHP installs itself with a configuration suitable for ; development purposes, and *NOT* for production purposes. ; For several security-oriented considerations that should be taken ; before going online with your site, please consult php.ini-recommended ; and ...... 看來(lái)只要權(quán)限允許,很多文件都能夠直接讀取,對(duì)我們系統(tǒng)構(gòu)成了巨大威脅。換句話說(shuō),如果把上面代碼插入到當(dāng)前web系統(tǒng)中其他任意一個(gè)能夠直接訪問(wèn)的php文件中,通過(guò)特殊的變臉進(jìn)行激活,而且一般程序員是不會(huì)那么仔細(xì)的檢查每個(gè)PHP程序文件,那么惡意用戶就能夠隨時(shí)隨地查看我們的系統(tǒng)文件。 [ 系統(tǒng)防范 ] 那么,如果防止,或者說(shuō)拒絕類(lèi)似的問(wèn)題呢,因?yàn)?,同樣的,php的文件存取函數(shù)非常多,比如file、file_get_contents、readfile等函數(shù),我們?nèi)绾畏乐惯@些函數(shù)帶來(lái)的威脅呢, 解決方法一: 如果系統(tǒng)中只是跟數(shù)據(jù)庫(kù)進(jìn)行交互,那么完全可以屏蔽掉這些文件存取函數(shù),象fopen、file、file_get_contents、readfile、opendir等函數(shù),方法就是在php的配置文件php.ini中進(jìn)行禁止,php.ini中有一個(gè)選項(xiàng)叫做disable_functions,我們可以把需要屏蔽的函數(shù)放到里面: disable_functions = highlight_file,fopen,file,file_get_contents,readfile,opendir 那么上面那些函數(shù)就無(wú)法使用了,比如你調(diào)用了highlight_file函數(shù),那么php引擎會(huì)提示你: Warning: highlight_file() has been disabled for security reasons in /home/heiyeluren/public_html/test.php on line 5 當(dāng)然,我們不能一概而殺,只是說(shuō)你可以禁止掉那些基本不怎么使用的函數(shù),比如highlight_file我覺(jué)得就使用的比較少。 解決方法二: 第一種方法太強(qiáng)制性了,函數(shù)禁止后將無(wú)法訪問(wèn)該函數(shù),總是不是那么的適合,對(duì)于一些空間提供商來(lái)講,是不合理的,那么還有一個(gè)解決方法,還是配置我們的php.ini,打開(kāi)php的安全模式: safe_mode = On 當(dāng)然,如果你需要,最好再配置一下open_basedir之類(lèi)的選項(xiàng)來(lái)更好的控制,具體可參考php手冊(cè)。 當(dāng)我們打開(kāi)了php的安全模式后,我們?cè)賮?lái)訪問(wèn)一下/etc/passwd,提交URL: ~heiyeluren/test.php?f=/etc/passwd 那么瀏覽器中馬上就顯示: Warning: highlight_file() [function.highlight-file]: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /home/heiyeluren/public_html/test.php on line 5 解決方法三: 在不損失我們PHP強(qiáng)大功能前提下,那些函數(shù)都能夠正常使用,那防范方法就是設(shè)置我們系統(tǒng)中各個(gè)目錄的各種不同訪問(wèn)權(quán)限,比如我們的/etc/passwd文件。比如默認(rèn)是這個(gè)權(quán)限: [~]# ls -al /usr/local/php/lib/php.ini -rw-r--r-- 1 root root 41489 5 12:40 /usr/local/php/lib/php.ini 我們?cè)O(shè)置設(shè)置一下不是隨便能夠讀的: [~]# chmod 640 /usr/local/php/lib/php.ini [~]# ls -al /usr/local/php/lib/php.ini -rw-r----- 1 root root 1865 Nov 27 01:16 /usr/local/php/lib/php.ini 現(xiàn)在,我們?cè)谠L問(wèn) ~heiyeluren/test.php?f=/usr/local/php/lib/php.ini 看看: Warning: highlight_file(/usr/local/php/lib/php.ini) [function.highlight-file]: failed to open stream: Permission denied in /home/heiyeluren/public_html/test.php on line 5 Warning: highlight_file() [function.highlight-file]: Failed opening '/usr/local/php/lib/php.ini' for highlighting in /home/heiyeluren/public_html/test.php on line 5 警告說(shuō)沒(méi)有權(quán)限讀取/usr/local/php/lib/php.ini這個(gè)文件,順利達(dá)到我們的目的。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|