免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 13639 | 回复: 45
打印 上一主题 下一主题

惊人发现:PHP所有版本 SESSION 漏洞 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-13 17:57 |只看该作者 |正序浏览
惊人发现: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 登录安全漏洞。

[ 本帖最后由 115300111 于 2007-6-14 19:12 编辑 ]

论坛徽章:
0
46 [报告]
发表于 2007-07-26 11:59 |只看该作者
我无言

论坛徽章:
0
45 [报告]
发表于 2007-07-25 14:18 |只看该作者
原帖由 juey 于 2007-6-28 16:41 发表
有一点比较重要的 好像你们都没有讨论
就是你是否重新开了浏览器?   SESSION 是服务器端的技术  一般当你没有关浏览器的时候 你的SESSION都是存在与服务器上  所以 你改了php.ini后   重新开窗口测试的 还是在 ...


肯定是重开了,具体为什么会出现这种状况我在这个帖子里详细分析了
http://bbs.chinaunix.net/viewthread.php?tid=966911

简要概括就是session空的时候$_SESSION['isadmin']和$isadmin是没有关联的
一旦$_SESSION['isadmin']设了值,$isadmin和$_SESSION['isadmin']通过&指向一个变量,不论改变哪个值都会影响另一个,这似乎符合常理也能提高效率,但是是否有安全问题,难说,我觉得至少有时候会出现意想不到的结果

唉,在php界找个能交流的人的确很难,喜欢钻研的人更少

论坛徽章:
0
44 [报告]
发表于 2007-07-24 22:35 |只看该作者
这个问题有点老生常谈吧?
就比如现在vista都出来了,你还专门写篇文章批判DOS不能一边玩游戏一边听歌。

我倒是遇到过一个很怪的情况,
环境是2003下跑php,虽然教村上一直罗嗦win下面的php不具备产品质量,但既然php.net每次有新版的推出都有相应的win版,至少说明还是比较重视,因为win下面跑PHP的机器也不在少数 扯远了HOHO,说具体问题吧,就是以前公司一台这样机器,结果因为session文件问题导致win崩溃,开始只是感觉服务器越来越慢,后来一检查,我的个妈呀,c:\windows\temp下面有无数个文件,我第一感觉就是SESSION文件的大量堆积。无论用什么办法也无法清空这个目录,在DOS下面也无法删除这个目录的内容。后来想到一个办法,先把temp改个名字暂时先用着。但是什么原因导致session垃圾收集机制失效,一直是个谜底。

论坛徽章:
0
43 [报告]
发表于 2007-06-29 17:22 |只看该作者
LZ 第一天用PHP阿 .....

论坛徽章:
0
42 [报告]
发表于 2007-06-29 16:59 |只看该作者
可能 PHP 中最具争议的变化就是从 PHP &raquo; 4.2.0 版开始配置文件中 register_globals 的默认值从 on 改为 off 了。对此选项的依赖是如此普遍以至于很多人根本不知道它的存在而以为 PHP 本来就是这么工作的。本节会解释用这个指令如何写出不安全的代码,但要知道这个指令本身没有不安全的地方,误用才会。

                                                                                      ---PHP手册

论坛徽章:
0
41 [报告]
发表于 2007-06-28 16:41 |只看该作者

有个关键的地方

有一点比较重要的 好像你们都没有讨论
就是你是否重新开了浏览器?   SESSION 是服务器端的技术  一般当你没有关浏览器的时候 你的SESSION都是存在与服务器上  所以 你改了php.ini后   重新开窗口测试的 还是在现有的窗口刷新 ?  或者 把服务器端也重启下看看  如果还是这样  那肯定就是漏洞了

论坛徽章:
0
40 [报告]
发表于 2007-06-19 20:23 |只看该作者
竟然被楼上两位看出来了~=_=!

论坛徽章:
0
39 [报告]
发表于 2007-06-19 17:14 |只看该作者
好象还真是c2h5oh

论坛徽章:
0
38 [报告]
发表于 2007-06-19 16:59 |只看该作者
小胡他爹的头像是酒精吧
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP