变量覆盖漏洞

变量覆盖漏洞

变量覆盖指的是用我们自定义的参数值替换程序原有的变量值
推荐阅读代码审计|变量覆盖漏洞

1.exartact函数

exartact()函数的作用是从传入数组中将变量导入当前符号表中,键名是变量名,键值是变量值。

注:符号表是记录符号属性的表,它的每一表项表示一个标识符的属性信息.这些属性信息通常包括种类(常数,变量,数组,标号等),类型(整型,实型,逻辑型,字符型等),给名字分配的存储单元地址等。

该函数有三个参数var_array(必须,规定输入)、extract_type(可选,检查每个键名是否为合法变量)、prefix

该函数出现变量覆盖漏洞通常有两种情况:
(1)二参为EXTR_OVERWRITE,它表示有冲突时覆盖已有变量
(2)只有一参,默认二参为EXTR_OVERWRITE

这道变量覆盖的ctf题中,extract函数是获取post传参后的以数组形式传入符号表,我们post传入pass=0&thepassword_123=0,将thepassword_123变量值赋值为0

2.parse_str函数

该函数作用是解析字符串并且注册成变量,在注册变量之前不会验证变量是否已经存在,直接覆盖
语法:
parse_str(string,array)

1
2
3
4
5
<?php
$b=1;
parse_str('b=2');
print_r(%$b);
?>

输出的b的值变为了2

例:某ctf

1
2
3
4
5
 $id = $_GET['id'];
@parse_str($id);
if ($a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)) {
echo $flag;
PAYLOAD: ?id=a[0]=240610708
3.import_request_variables函数

该函数是把GET,POST,COOKIE的参数注册为变量,用在register_globals被禁止的时候

1
bool import_request_variables ( string $types [, string $prefix ] )

  $type代表要注册的变量,G代表GET,P代表POST,C代表COOKIE,第二个参数为要注册变量的前缀   

1
2
3
4
5
<?php
$a = 1; //原变量值为1
import_request_variables('GP'); //传入参数时注册变量
print_r($a); //输出结果为2
?>
4.$$变量覆盖

$$常常用在foreach函数中
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

//?name=test

//output:string(4) “name” string(4) “test” string(4) “test” test

$name=’thinking’;

foreach ($_GET as $key => $value)

$$key = $value;#$key=name,$$key=$name

var_dump($key);


var_dump($value);

var_dump($$key);

echo $name;#会输出test

?>

foreach函数将get参数存入数组,我们构造payload:index.php?name=meizijiu233,name作为变量存入,$$key=$name=meizijiu233;判断通过

文章目录
  1. 1. 变量覆盖漏洞
    1. 1.0.1. 1.exartact函数
    2. 1.0.2. 2.parse_str函数
    3. 1.0.3. 3.import_request_variables函数
    4. 1.0.4. 4.$$变量覆盖
,