php 漏洞 session register_globals 登录 安全

先看这一段简单的代码

  1. <?php  
  2. session_start();  
  3. $_SESSION['isadmin']='yes';  
  4. $isadmin='no';  
  5. echo $_SESSION['isadmin'];  
  6. ?>  

当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呢?
测试代码

  1. <?php  
  2. //xxx.php  
  3. session_start();  
  4. echo $_SESSION['id'];  
  5. ?>  

通过 xxx.php?id=123 访问,没任何输出,
还好,不然不知道将有多少
采用 SESSION 做登录的
而PHP配置 register_globals 为 On 的网站
将被随便登录。

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

  1. <?php  
  2. //xxx.php  
  3.   
  4. import_request_variables('G');  
  5. echo $id;  
  6. ?>  

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

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

那么试试import_request_variables() 与 extract()创建的变量会不会影响SESSION呢?
测试代码

  1. <?php  
  2. //xxx.php  
  3. session_start();  
  4.   
  5. import_request_variables('G');  
  6. echo $_SESSION['id'];  
  7. ?>  

当通过xxx.php?id=123访问程序,
没有输出,再用extract($_GET)代替import_request_variables('G')测试,
还是没输出,这一点又很奇怪了,因为测试

  1. <?php  
  2. session_start();  
  3. $arr=array('id'=>123);  
  4. extract($arr);  
  5. echo $_SESSION['id'];  
  6. ?>  

register_globals 为 On 时
会输出 123

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

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

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

作者:Cos.X

关键词: 脚本渗透 , 漏洞 , php

上一篇: 搞定apache文件名解析缺陷漏洞
下一篇: Linkin Park

相关文章
访客评论
#1
回复 7j 2007-06-20, 16:57:08
我靠....AMXKU我攒美你.....我搞了好久没有搞明白的东西,看了这个我明白了..嗯嗯..我快成牛人了...娃哈哈..
#2
回复 专业路过 2007-06-21, 01:45:45
呵,牛人,牛人是好事还是?
#3
回复 amxku 2007-06-21, 16:18:54
引用 7j 说过的话:
我靠....AMXKU我攒美你.....我搞了好久没有搞明白的东西,看了这个我明白了..嗯嗯..我快成牛人了...娃哈哈..



......
#4
回复 kj021320 2007-07-02, 21:18:47
当register_globals = On 的时候~ 连文件的变量也可以通过 url来更改呢!-_-
#5
回复 流量为王 2007-07-03, 00:02:00
关键还是要自己做好过滤吧,如果吧开发环境换到register_globals = On,并且打开所有的错误报告,即E_ALL,虽然不能保证没漏洞,但是我想在安全方面会好许多。

能不能做个链接?
#6
回复 lib3rt3 2007-07-25, 20:44:30
http://www.linxp.cn/show-23-1.html
发表评论

评论内容 (必填):