PHP变量覆盖学习

概述

自定义的参数值替换原有变量值的情况称为变量覆盖漏洞

$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等

$$ 导致的变量覆盖

$$这种写法称为可变变量

image-20191113144232213

<?php
$a = 'b';
echo $a;
echo '<hr>';
$b = 'betao.cn';
echo $$a; // 首先$a = b; 然后$$a = $b; 因为$b='betao.cn',所以这里输出'betao.cn'
?>

使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞

image-20191113145056443

<?php
$a = '123'; // 定义变量$a,值为123
echo $a; // 输出值
foreach ($_GET as $key => $value) {
    ${$key} = $value; // 这里就是漏洞产生的原因,重新定义了变量$a的值
    // $_GET传入参数a,使$key = a; 那么${$key} = $a; 然后重新定义值,修改了原有的值
}
echo '<hr>';
echo $a; // 这里就被改变了
?>

extract()函数使用不当

https://www.runoob.com/php/func-array-extract.html

函数从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值

image-20191113145722544

从以上说明我们可以看到第一个参数是必须的,会不会导致变量覆盖漏洞由第二个参数决定,该函数有三种情况会覆盖已有变量

image-20191113150125531

<?php
$a = '123'; // 定义变量$a的值为123
$b = array('a' => 'betao.cn'); // 定义数组
extract($b); // 数组键名作为变量名,数组键值作为变量值
echo $a; // 输出betao.cn
?>

漏洞复现

<?php
extract($_GET); // GET变量覆盖
if(isset($bdctf)) //判断变量bdctf是否存在
{
$content=trim(file_get_contents($flag)); //file_get_contents—将整个文件读入一个字符串
//trim—去除字符串首尾处的空白字符(或者其他字符)
if($bdctf==$content) // 这里需要使得$bdctf==$content
{ echo'{betao.cn}'; }
else
{ echo'这不是蓝盾的密码啊'; }
}
?>

代码分析:需要存在$bdctf变量,$bdctf==$content,所以我们定义?bdctf=&flag=拿到flag

其中,因为content读取的是$flag的值(数据流)

image-20191113151446634

parse_str()函数

https://www.w3school.com.cn/php/func_string_parse_str.asp

image-20191113151644506

<?php
$a = 'aaa';
echo $a;
echo '<hr>';
parse_str("a=betao.cn"); //经过parse_str()函数,重新赋值变量$a='betao.cn';
echo $a;
?>

image-20191113152059386

import_request_variables()函数

https://www.php.net/manual/zh/function.import-request-variables.php

image-20191113152356893

  • 将 GET/POST/Cookie 变量导入到全局作用域中,
  • types 参数指定需要导入的变量, G代表GET,P代表POST,C代表COOKIE

image-20191113152651562

值得注意的是:import_request_variables()函数函数只能用在 PHP4.1 ~ PHP5.4之间,额外以上三种函数,使用时请格外注意,否则非常容易出现变量覆盖漏洞

漏洞防范

extract()函数防御

将extract.php中extract()函数第二个参数修改为extr_skip:

image-20191113153208920

parse_str()函数防御

parse_str()函数的防范,只能我们自己添加判断语句 ,例如:

image-20191113153317624

import_request_variables()函数防御

在PHP5.5之后已被官方删除

本文链接:

https://www.betao.cn/archives/phpfg.html
1 + 5 =
快来做第一个评论的人吧~