代码审计–变量覆盖 – 作者:雷石安全实验室

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.登录后台

 

图片[12]-代码审计–变量覆盖 – 作者:雷石安全实验室-安全小百科

1594713290.png!small

4.2.3.更新数据库监控

1594713309.png!small

4.2.4.规则管理

 

1594713322.png!small

4.3.审计

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

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

 

图片[16]-代码审计–变量覆盖 – 作者:雷石安全实验室-安全小百科

开始

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

 

图片[22]-代码审计–变量覆盖 – 作者:雷石安全实验室-安全小百科

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

 

 

 

来源:freebuf.com 2020-07-23 11:35:59 by: 雷石安全实验室

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论