CTF学习笔记:php(变量覆盖)

本文介绍了CTF比赛中常见的PHP变量覆盖技术,包括$$、extract()、parse_str()和import_request_variables()的用法,并通过实战分析解释了如何利用这些技术来获取flag。在一道题目中,通过合理利用变量覆盖,可以防止flag被覆盖,并成功获取原始flag的值。

目录

理论部分:

$$:

extract():

parse_str():

import_request_variables():

 实战分析:


理论部分:

变量覆盖:将原来变量的值给覆盖掉

一般造成变量覆盖的写法有

  • $$
  • 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变量覆盖例题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值