喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【村长请吃饭啊】 ---北京诚聘--- 【你还在犹豫吗?】

上一主题 下一主题
 54  4/6  <  1  2  3  4  5  6  > 
     
标题: [原创] 惊人发现:PHP所有版本 SESSION 漏洞  
  本主题由 unspace 于 2007-9-4 10:30 PM 加入精华 
 
bkkkd
高级会员
Rank: 4
老会员


UID 29854
精华 0
积分 614
帖子 630
金钱 614 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2004-7-5
状态 离线
支持管理员写一个关于php源代码的文章,好让我们容易是些看懂php的源代码
2007-6-15 01:13 PM#31
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
boom123
注册会员
Rank: 2



UID 75982
精华 0
积分 68
帖子 66
金钱 68 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-5
状态 离线
[推荐阅读] 运营一个面向学生使用的网站,可是学生用的都是教育网,网速很慢。如何解决该问题?
确实应该加亮
这是一个很多PHPer都犯的毛病:很多东西都是一知半解
很多人都忽略了最最权威的手册,建议大家都细读一遍手册,你会发现还有很多你理解错误或者不知道的东西
2007-6-15 02:09 PM#32
查看资料  发短消息  顶部
 
MMEasy
中级会员
Rank: 3Rank: 3
初级会员



UID 41947
精华 0
积分 216
帖子 130
金钱 216 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-10-30
来自 吉林
状态 离线
[推荐阅读] 为什么连10K都不到,就敢称“高薪招聘”
你的php什么版本的 ??



My Blog
Sungel CMS
2007-6-15 02:26 PM#33
查看资料  发短消息  QQ  顶部
 
115300111
新手上路
Rank: 1
一般会员



UID 67296
精华 1
积分 20
帖子 201
金钱 0 喜悦币
威望 20
人脉 0
阅读权限 10
注册 2005-12-19
状态 离线
[推荐阅读] soho招php程序员一名(苏州)


QUOTE:
原帖由 sadly 于 2007-6-15 11:11 AM 发表
楼主这个问题提的很好, 说明你注意到了细节, 但是这不应该说是漏洞.

讲源码的话, 大概有人头晕. 看以下两段代码,

程序A

<?php
session_start();
$_SESSION='yes';
$isadmin='no';
echo $_SESSIO ...
村长大人,你举的例子,

只是解决这漏洞的方法,

说到底它还是个漏洞。




http://www.mayday.net.cn/
http://www.thisky.com/
2007-6-15 06:41 PM#34
查看资料  访问主页  发短消息  顶部
 
熟人
中级会员
Rank: 3Rank: 3



UID 92185
精华 0
积分 332
帖子 476
金钱 332 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2007-4-29
状态 离线
[推荐阅读] 居然有人这样!
回复 #34 115300111 的帖子

看来是php开发人员和楼主对session解释的差异造成这个帖子

我再抽时间研究一下那几个函数吧 很久没有看c的代码了 还没看太明白




性格:馋 懒 奸 猾 坏
兴趣:吃 喝 嫖 赌 抽
职业:坑 蒙 拐 骗 偷
2007-6-15 06:53 PM#35
查看资料  发短消息  顶部
 
sadly (sadly)
管理员
Rank: 9Rank: 9Rank: 9
管理员


UID 1
精华 4
积分 1999
帖子 2010
金钱 1533 喜悦币
威望 40
人脉 426
阅读权限 200
注册 1970-1-1
来自 北京 三元桥
状态 离线
[推荐阅读] 北京联动在线通讯科技有限公司(www.com.tv)
以下所说的不是严谨的对PHP解析器执行过程的分析,仅为原理性解释


程序A

<?php
session_start
();
$_SESSION['isadmin']='yes';
$isadmin='no';
echo 
$_SESSION['isadmin'];
?>
程序B

<?php
session_start
();
session_register("isadmin");
$_SESSION['isadmin']='yes';
$isadmin='no';
echo 
$_SESSION['isadmin'];
?>
说明:
---------------------------------------
程序A 第一次执行

1 打开sess_****的文件, 把所有变量拆出来,丢到 $_SESSION 里
2 register_globals = On ? 建立普通变量和$_SESSION的同名数组元素里的映射(注:  Passing by Reference)

请注意:因为之前没有用过$_SESSION['isadmin']这个元素,则sess_****里并没有isadmin存在,所以
session_start()后并没有$_SESSION['isadmin']这个元素被建立,
也没有$isadmin和$_SESSION['isadmin']的映射关系被建立,

在执行后续的$_SESSION['isadmin']='yes';时,$_SESSION['isadmin']和$isadmin是完全独立的两个变量。


3 程序结束,解析器最后做了一件很重要的事情将$_SESSION里所有的元素存入sess_****文件
($_SESSION['isadmin']的终值为yes,你可以打开sess_****看看)


程序A 第二次执行
1 原理同上, 但是请注意:由于isadmin现在存在于sess_****文件,所以
$_SESSION['isadmin'] 被解析为上次执行的最后一个值yes,同时$isadmin被建立为它的映射,
此时无论使用二者中哪个名字访问, 操作的都是同一个内存地址。

2 程序结束,$_SESSION['isadmin'] 终值 = $isadmin = no

以后每次执行的结果都会和第二次一样。

---------------------------------------
程序B 第一次执行

1 在执行session_start()后,完全一样的执行了程序A第一次执行的1,2两个操作
2 但 session_register('isadmin'); 指示解析器,建立$_SESSION['isadmin']变量
并根据 register_globals= On  建立$isadmin和$_SESSION['isadmin']的映射关系,

因此
3 程序结束时 $_SESSION['isadmin']的终值为no

它每次执行结果都一样,只是session_register的操作其实在
第二次以后就没有什么必要了。

---------------------------------------
不妨想一想以下程序的结果,然后解释一下为什么

程序C

<?php
session_start
();
session_unregister("isadmin");
$_SESSION['isadmin']='yes';
$isadmin='no';
echo 
$_SESSION['isadmin'];
?>
---------------------------------------
还可以看看以下程序,再想想为什么 ( 注意这里反映了另外一个重要问题)
(浏览 test.php?isadmin=hello)

程序test.php

<?
$_GET
['isadmin']='yes';
$isadmin='no‘;
echo $_GET['
isadmin'];
?>




以PHP在中国的繁荣发展为己任
QQ:824008 MSN:sadly@phpx.com
2007-6-15 10:00 PM#36
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  顶部
 
future0906
新手上路
Rank: 1



UID 90086
精华 0
积分 20
帖子 16
金钱 20 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-3-26
状态 离线
[推荐阅读] 大家来吃肉啦
虽然这个漏洞手册上早有介绍,但我还是今天才真正研究了一下。呵呵,这个帖子也可以顶置一下,改一改标题,让新手们看看,了解PHP的陷阱。

这个问题重点在于register_global的变量是pass by reference
2007-6-16 08:38 AM#37
查看资料  发短消息  顶部
 
spaceman
乞丐




UID 90737
精华 0
积分 -7
帖子 14
金钱 -7 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2007-4-5
状态 离线
[推荐阅读] Incorrect string value: 错误
悄悄学习一下!~~~
2007-6-16 10:43 AM#38
查看资料  访问主页  发短消息  QQ  顶部
 
小陈!
注册会员
Rank: 2


UID 79616
精华 0
积分 137
帖子 145
金钱 137 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-9-5
状态 离线
[推荐阅读] 来帮小弟看看这段类结构函数哪错了
哗............ 漏洞真大....



菜鸟乐园群:35271274
2007-6-17 10:24 AM#39
查看资料  Blog  发短消息  顶部
 
akstrom (akstrom)
金牌会员
Rank: 6Rank: 6
村口大榕树上的知了


UID 24856
精华 0
积分 1059
帖子 1066
金钱 941 喜悦币
威望 0
人脉 118
阅读权限 70
注册 2003-11-27
来自 广州
状态 离线
[推荐阅读] 【招聘】PHP图书兼职作者


QUOTE:
原帖由 sadly 于 2007-6-15 10:00 PM 发表
以下所说的不是严谨的对PHP解析器执行过程的分析,仅为原理性解释


程序A

<?php
session_start();
$_SESSION='yes';
$isadmin='no';
echo $_SESSION;
?>



程序B

<?php
session_st ...
老大分析的好详细,其实,修改下
<?php
session_start();
$_SESSION['isadmin']='yes';
sleep(15);
$isadmin='no';
sleep(15);
echo $_SESSION['isadmin'];
?>
这样,你程序执行在第一个15妙内看看sess_****的东西,可以看到里面是空的,什么都没有的。第二个15妙后,也是什么都没有,等程序完全执行完以后,才有内容。
虽然说用了session_start()可以不用session_register注册新的变量,但其实这个只是条件,而不是他已经帮你注册了一个新的变量,就像老大说的,没有关联到,没有映射过去。我想,这个应该不能说是php的漏洞,而应该是php编程的技巧跟经验吧




电子商务系统

后台/admin
用户名密码一样admin

',“╭⌒╮⌒╮╮
  ╱◥██◣,.
︱田︱田田| '',,',.
╬╬╬╬╬╬╬╬╬╬╬╬
2007-6-17 01:21 PM#40
查看资料  访问主页  Blog  发短消息  顶部
 54  4/6  <  1  2  3  4  5  6  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.029486 second(s), 7 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP