在。magic_quotes_gpc选项是PHP中的一个重要安全设置,当该选项为ON,也就是打开的时候,所有从Get、Post、Cookie传递过来的数据中的“'”“、"”“、\”,以及NULL等元字符都会被自动的加上“\”实现转义。这个选项使得SQL注入、插入代码以及XSS中引入字符串或者改变程序流程变得困难。但是在PHP5中,一些特殊变量的存在使得在某些情况下,还是会被恶意用户引入元字符到数据库以及程序中。
PHP中的变量除了来源于$_GET、$_POST、$_Cookie的提交之外,还来源于$_SERVER、$_ENV、$_SESSION等,其中$_ENV和$_SESSION我们不能很方便地控制和自由提交,所以只剩下一个$_SERVER变量了。而$_SERVER变量包括的内容除了来自服务器本身外,还有很大一部分来源于用户提交的HTTP请求,比如下面的代码。
如上的变量在PHP5.0以下是受magic_quotes_gpc选项影响的,当magic_quotes_gpc选项为ON时,该数组中的元字符等内容就会做转义处理;为OFF时,用户的提交就会不做任何处理,直接送到数组中。现在的大部分稍安全一点的程序都已经注意到$_GET、$_POST以及$_Cookie的危险性。以下的内容摘自Discuz!的变量初始化时的代码。
很好,已经注意到来自$_GET、$_POST、$_FILES以及$_Cookie的变量的安全性,但是$_SERVER变量呢?尽管在magic_quotes_gpc为ON的情况下,这些变量可能受到保护。但是很明显,忽视$_SERVER的结果就是安全隐患的增加,你就可以去寻找程序取得$_SERVER的地方,很可能就是脆弱点了!
所以,我们要注意任何的从客户端输入的变量,
因为所有的输入都是有害的。
PH
PBB这方面做得很好,
如图1所示,
在PHPBB的common.php中的第100~161
行,把所有的输入,不管是$_GET、$_POST、$_SERVER等变量都做了过滤处理。
现在,防止SQL注入,大家普遍使用的方式是用
addslashes()函数和intval()函数,下面我就简单介绍一下这两个函数。
addslashes()的函数原形是string addslashes(stringstr),返回字符串,该字符串为了数据库查询语句等的需要,而在某些字符前加上了反斜杠。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL字符)。
一个使用addslashes()的例子是当你要往数据库中输入数据时。例如,将名字O'reilly插入到数据库中,这就需要对其进行转义。大多数据库使用“\”作为转义符:O\'reilly,这样就可以将数据放入数据库中,而不会插入额外的“\”。当PHP指令magic_quotes_sybase被设置成ON时,意味着插入“'” 时将使用“'\”进行转义。
默认情况下,PHP 指令magic_quotes_gpc为ON,它主要是对所有的Get、Post和Cookie数据自动运行addslashes()。不要对已经被magic_quotes_gpc转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时,我们可以使用函数get_magic_quotes_gpc()进行检测。
intval()的函数原形为int intval(mixed var, int[base]);,可将变量转成整数类型。可省略的参数base是转换的基底,默认值为10。转换的变量var可以为数组或类之外的任何类型的变量。
以上就是我们详细记录的基础知识了,下面我们结合一个漏洞程序来详细地讲解$_SERVER[]注入漏洞。
图1
详细分析$_SERVER注入
今天的程序主角是MyBulletinBoard,也就是MyBB,一套基于PHP+MySQL搭建的功能强大高效的开源论
坛系统。在国外使用的比较多,在Google搜索大概有150多万个网站采用这套程序。如图2所示是其界面,