免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 115300111
打印 上一主题 下一主题

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

论坛徽章:
0
31 [报告]
发表于 2007-06-17 19:20 |只看该作者
惊人发现: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呢?

=========================================
[quote]
If register_globals  is enabled, then the global variables and the $_SESSION entries will automatically reference the same values which were registered in the prior session instance. However, if the variable is registered by $_SESSION  then the global variable is available since the next request.

如果启用了 register_globals,则全局变量和 $_SESSION 中的条目自动指向之前注册的同一个会话实例。不过如果变量是用 $_SESSION 注册的,则全局变量自下一个请求起才可用


虽然 PHP 是有些缺乏一致性,不是很遵从「最少例外原则」,但是关于 LZ 的这个问题,手册却是讲了的……
不管是中文版还是英文版。

http://au.php.net/manual/en/ref.session.php
http://au.php.net/manual/zh/ref.session.php
=========================================

都知道:当配置 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 的网站
将被随便登录。

=========================================
根据 PHP 的 register_globals 原则,这个事情是根本不可能发生的(而不是“还好没有发生”)。因为 PHP 的 register_globals 是在程序开始执行之前就已经完成了。
=========================================


还有两个常用的函数 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 与处理定义的数组
用的是不一样的方法。

=========================================
上面几个测试取决于,在 $_SESSION['id'] 从没被赋值的情况下:

echo $_SESSION['id'];

是否会在 php 的 session 中创建一个名为 id 的变量。答案是不会的。就如在 $foo 没有定义之前,你不管怎么用它,它也还是不会被自己定义。(isset($foo) 总是 FALSE)

所以,可以推断,LZ 进行的测试是错误的。

臆断一下,错误在于:$_SESSION['id'] 之前被定义过

如果↑猜对了,LZ 可以揣摩一下为什么会出现如此结果。
=========================================


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

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

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

=========================================================================

结论:

LZ 这个帖子并没有现实意义(因为已经几乎没人用 register_globals 了),也没有理论意义(PHP 虽然没有正式的语言定义,但是就这个例子来说并没有违反手册 - PHP 手册即是 PHP 约定俗成的语言定义)。

它的意义在于:说明了 PHP 手册的重要……也侧面说明了 PHP 为了成为一门容易入门的语言而十分混乱的状况。

论坛徽章:
0
32 [报告]
发表于 2007-06-18 11:22 |只看该作者
原帖由 小胡他爹 于 2007-6-17 08:24 发表
还不锁啊。楼主无聊至极,到处发=_=! 不觉得丢人吗

到处发怎么就丢人了呢?
你说话能不能自己先想想为什么?

有什么丢人呢?
我谈技术有什么不对的,
人家发广告的都活得有滋有味,逍遥自在,
我在这里谈技术有何不可?

论坛徽章:
0
33 [报告]
发表于 2007-06-18 11:30 |只看该作者
...

[ 本帖最后由 115300111 于 2007-6-18 11:31 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2007-06-18 12:18 |只看该作者
无话可说了,

你家买了防盗门 你自己出门 门都不锁,回来还怪防盗门无用。

~~~~~~~~~~~~~~~~~~

你干嘛不把电线外皮剥了然后拿手里玩 ,电死了再去怪人家电线不安全。

~~~~~~~~~~
~~~~~~~~
~~~~~~~
~~~~~~
偶的神啊~~~~~

论坛徽章:
0
35 [报告]
发表于 2007-06-18 14:06 |只看该作者
只承认dz902这样的人是高手,真真想问题的人。

像小胡他爹这样的人...我觉得...是不是太极端了?

论坛徽章:
0
36 [报告]
发表于 2007-06-18 15:26 |只看该作者
你看看,说不到两句就扯人家是什么样什么样的人了,

就你自己觉得说你有错吗。

不讨论了。浪费时间。

大标题党~

论坛徽章:
0
37 [报告]
发表于 2007-06-18 19:04 |只看该作者
无聊帖,自给看看手册吧.

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

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

论坛徽章:
0
40 [报告]
发表于 2007-06-19 20:23 |只看该作者
竟然被楼上两位看出来了~=_=!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP