【CTF】变量覆盖函数

前言:记录一下变量覆盖函数的学习

什么是变量覆盖

变量覆盖基本都来自于各种函数(parse_str()
、extract()、import_request_variables()等)对用户输入取值时的问题,当用户对已经存在的变量再次通过
各种函数赋值时,将会触发变量覆盖,修改之前定义的值,这类问题需要严格定义用户可以输入的部分,或值避免使用存在此类问题的函数。

parse_str() 函数

原型:parse_str(string,array)

定义和用法:parse_str() 函数把查询字符串解析到变量中。 如果未设置 array
参数,由该函数设置的变量将覆盖已存在的同名变量。 php.ini文件中的
magic_quotes_gpc设置影响该函数的输出。如果已启用,那么在 parse_str()解析之前,变量会被
addslashes()转换。

例子: <?php parse_str("name=Peter&age=43"); echo $name."
"; //Peter echo $age; //43 ?>

extract()函数

原型:extract(array,extract_rules,prefix),其中第一个参数为指定的数组,第二个为创建变量的规则,第三个为需要增加的前缀。
1.array 必需。规定要使用的数组。
2.extract_rules 可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。 可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。 EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。 EXTR_PREFIX_ALL -给所有变量名加上前缀 prefix。 EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS- 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
3.prefix 可选。如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix
是必需的。该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。

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

例子:

<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, "dup");
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>
//$a = Original; $b = Dog; $c = Horse; $dup_a = Cat   这里冲突后为冲突的变量加了前缀dup和下划线。

这个变量覆盖漏洞其实就是来源于EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。

当没有指定规则的时候就会发生变量覆盖。

<?php
$flag="ook!";
extract($_GET);  
echo $flag;
if($key==$flag)
{
    echo $flag;
}
else
{
    echo'Oh.no';
}
?>

由于首先为flag赋值,后extract了GET的值,所以会将已经存在的进行覆盖。

import_request_variables()函数

原型:bool import_request_variables ( string $types [, string $prefix ] )返回bool型结果。
$types:指定需要导入的变量,可以用字母 G、P 和 C 分别表示 GET、POST 和 Cookie,这些字母不区分大小写,所以你可以使用 g 、 p 和 c 的任何组合。POST 包含了通过 POST 方法上传的文件信息。注意这些字母的顺序,当使用 gp 时,POST 变量将使用相同的名字覆盖 GET 变量。任何 GPC 以外的字母都将被忽略。
$prefix: 变量名的前缀,置于所有被导入到全局作用域的变量之前。所以如果你有个名为 userid 的 GET 变量,同时提供了 pref_ 作为前缀,那么你将获得一个名为 $pref_userid 的全局变量。虽然 prefix 参数是可选的,但如果不指定前缀,或者指定一个空字符串作为前缀,你将获得一个 E_NOTICE 级别的错误。

定义和用法:
import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中。该函数在最新版本的 PHP 中已经不支持。
import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变量,那么此函数就很有用。
版本要求:PHP 4 >= 4.1.0, PHP 5 < 5.4.0

例子:

<?php
// 此处将导入 GET 和 POST 变量
$a= "abc";
import_request_variables("gP");  //不使用前缀将会覆盖。
echo $a;
?>

传入?a=1111将会把已定义的a值覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦 & 醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值