网络安全从入门到精通(第九章-2) 变量覆盖漏洞
本文内容:
- 什么是变量覆盖
- 函数解析
1,什么是变量覆盖:
1.变量覆盖:
指的是可以利用我们的传参值替换程序原有的变量值。
举例:
$a = 123;
$a = 124;
echo $a;
运行结果:输出124,这就是变量覆盖。
2.怎么寻找变量覆盖?
导致变量覆盖漏洞的场景有:
特殊符号,如$$使用不当。
estract()函数使用不当[常见]。
parse_str()函数使用不当[常见]。
import_request_variables()使用不当。
开启列全局变量注册。
变量覆盖有的时候可以直接让我们获取Webshell,拿到服务器权限。
2,函数解析:
1.extract()函数:
作用:将数组中的数据变成变量。
举例:
<?php
$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
CTF实例:
<?php
$flag = "flag(12345)";
extract($_GET);
if(isset($gift)){
$conetnt=trim($test);
if($gift==$content){
echo 'flag is'.$flag
}}
解析:
isset是判断$gift是否存在且不能够为空。
trim是将$test值的空格去掉。
$test在extract上边,就可以通过GET传参text=123,将原来的test值覆盖掉。
还需传参gift,让它符合if语句条件。
所以答案:?test=123&gift123
2.parse_str()函数:
作用:将查询字符串解析到变量中。
实例:
<?php
parse_str("name=aaaa&&age=60");
echo $name."<br>";
echo $age;
?>
运行结果:aaaa和60 ,parse_str("name=Bill&age=60") 相当于完成了$name ='aaaa'和$age ='60'
如果在parse_str中可以直接传参的话,也可以覆盖变量。
<?php
$a=$_GET['id']
parse_str("$a");
echo $name."<br>";
echo $age;
?>
3.特殊符号$$:
$$导致的变量覆盖问题在CRF代码审计题目中经常在foreach中出现,如一下示例代码,使用foreach来遍历数组中的值。
然后再将获取数组键名作为变量,数组中的值作为变量的值,因此就产生了变量覆盖漏洞。
请求?name-test会将$name的值覆盖,变为test。
例题:
<?php
$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key=>$_value)
{$$_key=addslashes($_value);}}
echo $a;
?>
解析:
addslashes:一个函数,起到了魔术引号的作用,在每个双引号之前加反斜杠。
foreach遍历数组。
会接受GET参数、POST参数、COOKIE参数,将接收参数依次放入$_request也可以看作:$_request=$_GET+$_POST+6$_COOKIE
$_key=>$_value 这是个数组解析,实际上就是键值分离,$_ket=键名,$_value=键值
正常而言$a = 1是一个定值,但是因为$$_key的缘故,当我传参a=2;那么$$_key=addslashes($_value);就变为了$a = 2 .
举个简单的例子:
$ a = 'b';
$ b = 'zx';
echo $$a;
运行结果:zx
解析:
解释:$$a--->$b-->zx
session_start