什么是变量覆盖
变量覆盖,指的是可以用我们的传参值替换程序原有的变量值。
变量覆盖漏洞大多数由函数和特殊符号使用不当导致。
介绍几个函数和写法
-
$$
$$写法为可变变量,类似于套娃,有点像二重积分的写法,一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
eg:https://www.php.net/manual/zh/language.variables.variable.php
-
extract()
从数组中将变量导入到当前的符号表
eg:https://www.runoob.com/php/func-array-extract.html
"Cat","b" => "Dog", "c" => "Horse"); extract($my_array); echo "\$a = $a; \$b = $b; \$c = $c"; ?> #输出:$a = Cat; $b = Dog; $c = Horse;
-
parse_str()
parse_str() 函数把查询字符串解析到变量中.
注意:parse_str()不会验证当前变量是否存在,所以直接覆盖掉已有变量。如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
eg:https://www.runoob.com/php/func-string-parse-str.html
"; echo $age; ?> #name=Peter&age=43变成了$name和$age #输出: # Peter # 43
-
import_request_variables()
import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中。
当register_globals被禁止,又想用到一些全局变量,那么此函数就很有用。
版本要求:该函数在最新版本的 PHP 中已经不支持。PHP 4 >= 4.1.0, PHP 5 < 5.4.0
变量覆盖案例
$$导致变量覆盖常与foreach中出现,通过遍历列表将获取到的数组键名作为变量,列表键值分离。
<?php
$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key=>$_value)
{$$_key=addslashes($_value);}}
echo $a;
?>
当传参a=2;那么$$_key=addslashes($_value);就变为了$a = 2 。
靶场练习
知识需求
- Session: 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
- Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
- Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
1.靶场为DuomiCMS,所以我们通过找到源代码来发现变量覆盖漏洞
2.在duomiphp/common.php找到可能存在变量覆盖的地方
3.admin/login.php里调用了duomiphp/common.php和check.admin.php文件
4.check.admin.php中有可以设置session的操作
5.session对于管理员大多数情况下是固定的,我们通过构造session传参
当groupid=1时,为管理员权限
6.选一个能够执行session的文件传参
7.选择interface/comment.php,构造关键session参数
8.进入后台拿到flag