PHP编程中的常见漏洞和代码实例(4)

上面的代码假定如果"$session_auth"被赋值的话,就是从session,而不是从用户输入来赋值的,如果攻击者通过表单输入来赋值的话,他就可以获得对站点的访问权。注意攻击者必须在session注册该变量之前使用这种攻击方法,一旦变量被放进了session,就会覆盖任何表单输入。

Session数据一般是保存在文件中(位置是可配置的,一般是"/tmp"),文件名一般是类似"sess_<session id>"的形式,这个文件包含变量名称,变量类型,变量值和一些其它的数据。在多主机系统中,因为文件是以运行Web服务器的用户身份(一般是 nobody)保存的,因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问,甚至可以检查session文件中的敏感信息。

Session机制也为攻击者把自己的输入保存在远程系统的文件中提供了另一个方便。对于上面的例子来说,攻击者需要在远程系统放置一个包含PHP代码的文件,如果不能利用文件上载做到的话,他通常会利用session为一个变量按照自己的意愿赋一个值,然后猜测session文件的位置,而他知道文件名是"php<session id>",所以只需猜测目录,而目录一般就是"/tmp"。

另外,攻击者可以任意指定"session id"(例如"hello"),然后用这个"session id"创建一个session文件(例如"/tmp/sess_hello"),但是"session id"只能是字母和数字组合。

如何通过数据类型进行攻击?

PHP 具有比较松散的数据类型,变量的类型依赖于它们所处的上下文环境。例如:"$hello"开始是字符串变量,值为"",但是在求值时,就变成了整形变量"0",这有时可能会导致一些意想不到的结果。如果"$hello"的值为"000"还是为"0"是不同的,empty()返回的结果也不会为真。

PHP中的数组是关联数组,也就是说,数组的索引是字符串型的。这意味着"$hello["000"]"和"$hello[0]"也是不同的。

开发程序的时候应该仔细地考虑上面的问题,例如,我们不应该在一个地方测试某个变量是否为"0",而在另外的地方使用empty()来验证。

如何通过容易出错的函数进行攻击?下面是一份比较详细的容易出错的函数列表:

复制代码 代码如下:


1. <PHP代码执行>  
2. require():读取指定文件的内容并且作为PHP代码解释  
3. include():同上  
4. eval():把给定的字符串作为PHP代码执行  
5. preg_replace():当与"/e"开关一起使用时,替换字符串将被解释为PHP代码  
6.  
7.   <命令执行>  
8. exec():执行指定的命令,返回执行结果的最后一行  
9. passthru():执行指定命令,返回所有结果到客户浏览器  
10. ``:执行指定命令,返回所有结果到一个数组  
11. system():同passthru(),但是不处理二进制数据  
12. popen():执行指定的命令,把输入或输出连接到PHP文件描述符  
13.  
14. <文件泄露>  
15. fopen():打开文件,并对应一个PHP文件描述符  
16. readfile():读取文件的内容,然后输出到客户浏览器  
17. file():把整个文件内容读到一个数组中  

如何增强PHP的安全性?

我们在上面介绍的所有攻击对于缺省安装的PHP4都可以很好的实现,但是PHP的配置非常灵活,通过配置一些PHP选项,我们完全可能抵抗其中的一些攻击。下面我们按照实现的难度对一些配置进行了分类:

复制代码 代码如下:


*低难度
**中低难度
***中高难度
****高难度


如果你使用了PHP提供的所有选项的话,那么你的PHP将是很安全的,即使是第三方的代码也是如此,因为其中很多功能已经不能使用。

**** 设置"register_globals"为"off"

这个选项会禁止PHP为用户输入创建全局变量,也就是说,如果用户提交表单变量"hello",PHP不会创建"$ hello",而只会创建"HTTP_GET/POST_VARS['hello']"。这是PHP中一个极其重要的选项,关闭这个选项,会给编程带来很大的不便。

*** 设置"safe_mode"为"on"

打开这个选项,会增加如下限制:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a321fa8ea3f6664993d734109e24a0e9.html