一,什么是变量覆盖
变量覆盖指的是可以用我们的传参值替换程序原有的变量值
二,变量覆盖如何发现及利用方式
经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。
变量覆盖漏洞有的时候可以直接让我们获取Webshell,拿到服务器的权限
$$就是将之前定义的变量的值重新定义新的变量
$a=b
$b=c
$$a=c
extract()函数的作用:将数组中的变量导入到当前的符号表
给一个实例:
"Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
运行结果:$a = Cat; $b = Dog; $c = Horse
简单理解来就是把数组中的键赋值成变量,值赋值给变量
这里简单说下php中的数据类型
php中支持8种原始类型,4中标量类型(布尔型boolean,整型integer,浮点型float,字符串型string),2中复合类型(数组array,对象object),2种特殊类型(资源resource,null)
布尔型boolean:最简单的类型,只有两个值,真(true)和假(false)。
整型integer:整型数据类型只能包含整数,这些数据类型可以是正数和负数。
浮点型float:浮点数据类型用于存储数字,和整型不同的是只能存储有小数位的。例如1.0 1.2
字符串型string:字符串类型就是常见的字符类型组合即计算机所有能表示的一些字符集合。字符串由数字,字母,和符号组成,每个字符占用一个字节。定义字符串的方式有单引号' , 双引号",定界符<<<三种方式
字符串型这里说下转义字符和输出
\n 换行LF
\r 回车CR
\t 水平制表符HT
\\ \ 反斜杠
\$ $ 美元符
\' ' 单引号
\" “ 双引号
\[0-7]{1,3} 正则匹配一个八进制符号表示的字符 \567
\x[0-9A-Fa-f]{1,2} 正则匹配一个用十六进制表示的字符 \x00
如果对非转义字符使用了\ 那么也会有\和字符一起输出
数组array:一组类型相同的变量的集合,它把一系列数据组织起来,形成一个可操控的整体。
定义数组的语法格式如下:
$array = array("a","b","c");
$array[key]='a';
$array = array("a" => "Cat","b" => "Dog", "c" => "Horse");、
数组中有键(下标)和键值 如第三例a为键 Cat为值 第二例 键名为key 值为a
如果没有指明键则从0开始计数的整数 第一例则是键为0 值为a
'asp','b'=>'jsp','c'=>'php' );
echo '
';
var_dump($array1);
echo '
';
print_r($array1);
echo '
';
print_r($array2);
$array3 = array( '1'=>"编",'2'=>"程",'3'=>"词",'4'=>"典");
echo '
';
print_r($array3);
$array[1]="编";
$array[2]="程";
$array[3]="词";
$array[4]="典";
echo '
';
print_r($array);
echo '
';
echo $array[1];
echo $array[2];
echo $array[3];
echo $array[4];
?>
运行结果
数组类型分为两种:一种是数字索引数组(下标为数字的数组从数字0开始依次递增)另一种是关联数组(下标为字符串的数组,可以使用字符串键来访问存储在数组中的值)
关联数组样例
$array4 = array("first"=>1,"second"=>2,"third"=>3,"four"=>4);
echo $array4["third"];
echo '
';
$array4["four"]=8;
echo $array4["four"];
输出是3 8
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
这里简单说下数组分两种键为数字的为数字索引数组,键为字符串的是关联数组。
在这个定义的my_array的关联数组键名为a 键值为Cat 输出可以用print_r($my_array[a]);echo($my_array[a]);
输出的结果都是Cat
parse_str()把传入的字符串放入变量数组中去
parse_str("name=”stem“&&age=25");
echo $name.'
';
echo $age;
简单来说就是做了
$name=”stem“&&$age=25
import_request_variables()函数作用是将 GET/POST/Cookie 变量导入到全局作用域中在当前文件可全局调用进行传参。
foreach as
$_value)
{$$_key=addslashes($_value);}}
echo $a;
?>
这里也是一个简单的foreach as 遍历数组将数组的字符串放入$_request中去再重新遍历键值分离 $$_request成了$_COOKIE $_POST $_GET 超全局变量接受传参那么这里就成了$_key=>$_value 如果我们传参a=123456
$$_key=addslashes($_value);
这句就是吧$_key重新使用了$$来赋值转义给$_value 就成了$a=123456
输出的$a也就是123456了。
这里就造成了简单的变量覆盖漏洞。