目录
理论部分:
变量覆盖:将原来变量的值给覆盖掉
一般造成变量覆盖的写法有
- $$
- extract()
- parse_str()
- import_request_variables()
$$:
$表示一个变量的声明如$a='1'就是将1的值赋予1 也就是a的值是1 则$$可以理解为双重赋予如下面代码段 $$a可以表示为$($a)$a的值为1 $($a)值就为$1为2 所以$$a='2'
<?php
$a='1';
$1='2';
echo $$a;
?>
<?php
$a='1';
$$a='2';
echo $1;
?>
extract():
extract() 函数从数组array中将变量导入到当前的符号表。我们将1赋值于$a再创建数组将键值 "Apple"、"Banana" 和 "Cheey" 赋值给变量 $a、$b 和 $c此时运行结果为$a = Apple; $b = Banana; $c = Cherry
语法:extract(array,extract_rules,prefix)
<?php
$a = "1";
$shuzu = array("a" => "Apple","b" => "Banana", "c" => "Cherry");
extract($shuzu);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
parse_str():
parse_str() 函数把查询字符串解析到变量中。我们把1和2分别解析至a和b中,此时输出变量a和变量b的结果就会是ab也就是12
语法: parse_str(string,array)
<?php
parse_str("a=1&b=2");
echo $a;
echo $b;
?>
import_request_variables():
import_request_variables()函数可以有选择地注册全局变量集合。你可以使用该函数导入 $_GET、$_POST和$_COOKIE的值,还可以为每个导入的变量添加前缀(prefix)。
//导入POST提交的变量值,前缀为post_
import_request_variable("p", "post_"); //导入GET和POST提交的变量值,前缀为gp_,GET优先于POST import_request_variable("gp", "gp_"); //导入Cookie和GET的变量值,Cookie变量值优先于GET import_request_variable("cg", "cg_");
实战分析:
题目分析:第7行检测表单是否存在post传参,如果不是会将flag值覆盖掉,11-14行间的代码会将$flag的值给覆盖掉,所以只能利用第一个循环(foreach)先将 flag 赋给_200,然后利用输出(die)($_200)将原flag值打印出来。使用get传参将flag赋值于_200构造_200=flag,在使用post传参flag=得到flag
FLAG:flag(hunan_hetian)
<?php
include “flag.php”;
$_403 = “Access Denied”;
$_200 = “Welcome Admin”;
if ($_SERVER["REQUEST_METHOD"] != “POST”)
{
die(“BugsBunnyCTF is here :p…”);
}
if ( !isset($_POST["flag"]) )
{
die($_403);
}
foreach ($_GET as $key => $value)
{
$$key = $$value;
}
foreach ($_POST as $key => $value)
{
$$key = $value;
}
if ( $_POST["flag"] !== $flag )
{
die($_403);
}
echo “This is your flag : “. $flag . “\n”;
die($_200);
?>
题目来源:PHP变量覆盖例题
本文介绍了CTF比赛中常见的PHP变量覆盖技术,包括$$、extract()、parse_str()和import_request_variables()的用法,并通过实战分析解释了如何利用这些技术来获取flag。在一道题目中,通过合理利用变量覆盖,可以防止flag被覆盖,并成功获取原始flag的值。
4668

被折叠的 条评论
为什么被折叠?



