發新話題 Report thanks

惊人发现:PHP所有版本SESSION 漏洞

惊人发现:PHP所有版本SESSION 漏洞
作者:115300111 发布日期:2007-6-13  查看数:2573 出自:http://www.phpx.com
惊人发现:PHP所有版本SESSION 漏洞

关键字:php 漏洞session register_globals 登录安全

先看这一段简单的代码
<?php
session_start();

$_SESSION['isadmin']='yes';

$isadmin='no';

echo $_SESSION['isadmin'];

?>
当php.ini里配置register_globals =Off 时,
没任何问题,
输出yes

但是
当php.ini里配置register_globals =On 的时候,
第一次运行输出yes
而刷新一下,则显示的是no

显然这是不正常的,
这是个很奇怪的问题,
如果说是$isadmin='no';改变了SESSION,
那么为什么第一次会显示yes呢?

都知道:当配置register_globals =On 的时候,
通过xxx.php?id=123访问时,程序会自动创建变量id
那么自动创建的变量会不会改变SESSION呢?
测试代码
<?php
//xxx.php
session_start();
echo $_SESSION['id'];
?>
通过xxx.php?id=123访问,没任何输出,
还好,不然不知道将有多少
采用SESSION 做登录的
而PHP配置register_globals 为On 的网站
将被随便登录。

还有两个常用的函数import_request_variables()和extract()
import_request_variables --将GET/POST/Cookie 变量导入到全局作用域中
extract --从数组中将变量导入到当前的符号表
<?php
//xxx.php

import_request_variables('G');
echo $id;

?>
当通过xxx.php?id=123访问的时候,
就算register_globals 设为Off
也是会输出123

extract($_GET)与import_request_variables('G')功能相似

那么试试import_request_variables()与extract()创建的变量会不会影响SESSION呢?
测试代码
<?php
//xxx.php
session_start();

import_request_variables('G');

echo $_SESSION['id'];
?>
当通过xxx.php?id=123访问程序,
没有输出,再用extract($_GET)代替import_request_variables('G')测试,
还是没输出,这一点又很奇怪了,因为测试
<?php
session_start();
$arr=array('id'=>123);
extract($arr);
echo $_SESSION['id'];
?>
register_globals 为On 时
会输出123

看来同样是数组,
extract 处理$_GET 与处理定义的数组
用的是不一样的方法。

结论:
register_globals 为On 的时候,
用import_request_variables('G')和extract($_GET)创建的变量是不会改变SESSION的。

总结:漏洞只存在于PHP配置register_globals =On的时候,定义的变量会改变同名的SESSION。

转载请保留
作者:Cos.X
日期:2007年6月13日
ps.结果让我挺失望的,以为会发现一个惊人的PHP SESSION 登录安全漏洞。

From:http://www.phpx.com/viewarticle.php?id=135262
如果您喜歡這篇文章,請按「讚」或分享給您的朋友,以示鼓勵。

TOP

thanks