HacKerQWQ的博客空间

变量覆盖漏洞

Word count: 643Reading time: 2 min
2020/10/14 Share

引子

先看一段php代码

1
2
3
4
5
6
<?php
$a = "aa";
$aa = "111111";
echo "aa变量的值为".$aa;
$$a = $_GET['name'];
echo "aa变量的值为".$aa;

通过url传入name变量为555之后结果:

解析:这里由于$$a=$($a)=$aa,因此赋值时将name的值赋值给了$aa,造成了变量覆盖漏洞

register_globals(全局变量覆盖)

register_globals是php.ini中的一个选项,从PHP 5.3.0起不推荐使用。在PHP 5.4.0中移除该选项
该变量的作用是将传入的变量注册为全局变量,但是注册过的变量不会被覆盖

1
2
3
4
<?php
if (isset($a)){
echo "a的值是:".$a;
}


这里之前没有给$a赋值,但是开启了register_globals选项之后,通过URL传值$a却有了值。
但是当a本身有值再赋值的话就会失败

1
2
3
4
5
<?php
$a="flag~";
if (isset($a)){
echo "a的值是:".$a;
}

extract()

extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
extract(array,extract_rules,perfix)

下面看php代码

1
2
3
4
5
6
7
8
9
10
11
<?php

$auth = '0';
extract($_GET);

if($auth==1){
echo "private!";
}else{
echo "public!";
}
?>


如果想要确保不会覆盖已有的变量可以使用EXTR_SKIP参数

遍历初始化变量

一些以变量释放方式执行的代码可能会导致已有变量被覆盖

1
2
3
4
5
6
7
8
9
10
<?php
$chs = '';
if($_POST && $charset != 'utf-8'){
$chs = new Chinese('UTF-8', $charset);
foreach($_POST as $key => $value){
$$key = $chs->Convert($value);
}
unset($chs);
}
?>

如果此时提交参数名为chs,那么就可以改变$chs的值,变量遍历初始化漏洞其实就是引子里面的错误用法

import_request_variables变量覆盖

import_request_variables函数可以在register_globals关闭的时候把GET/POST/COOKIE变量导入全局作用域当中

  • bool import_request_variables ( string types [, string prefix])
    用法:
    1
    2
    3
    <?php
    import_request_variables("gpc");
    ?>

parse_str()变量覆盖

parse_str()用于把查询字符串解析到变量中:

1
2
3
4
5
<?php
parse_str("name=Bill&age=60");
echo $name."<br>";
echo $age;
?>
1
2
3
4
//var.php?var=new  
$var='init';
parse_str($_SERVER['QUERY_STRING']);
print $var;

$_SERVER[‘QUERY_STRING’]用法:

与parse_str()类似的还有mb_parse_str()

参考链接

https://mp.weixin.qq.com/s?__biz=MzUyMTA0MjQ4NA==&mid=2247488519&idx=1&sn=73146e7bcca47118e2f3b2727d98c6ca&chksm=f9e07b5cce97f24a46e2f79f0b7d64794a4d60a88c0453788953ce39d54fe81356b66e05ef70&scene=21#wechat_redirect

CATALOG
  1. 1. 引子
  2. 2. register_globals(全局变量覆盖)
  3. 3. extract()
  4. 4. 遍历初始化变量
  5. 5. import_request_variables变量覆盖
  6. 6. parse_str()变量覆盖
  7. 7. 参考链接