ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

CTF-WEB:PHP 变量

2020-08-19 02:01:25  阅读:484  来源: 互联网

标签:WEB 变量 覆盖 flag CTF GLOBALS 数组 PHP extract


目录

变量和变量覆盖

可变变量

一个可变变量 “$$” 获取了一个普通变量的值后,用这个值作为这个可变变量的变量名。一个美元符号表示提取变量中的值,而 2 个连续的美元符号表示用某个变量的内容作为变量名,再来访问该变量。例如以下代码:

<?php
$a = "b";
$b = "c";
$c = "a";

echo $a;      //输出 b
echo $$a;      //输出 c
echo $$$a;      //输出 a
?>

超全局变量

PHP 的 $ GLOBALS 是一个超全局变量,它引用全局作用域中可用的全部变量。变量时一个包含了全部变量的全局组合数组,变量的名字就是数组的键。有时候当 flag 隐藏在某个变量中时,可以考虑从 GLOBALS 中得到。

变量覆盖

extract() 函数从数组中将变量导入到当前的符号表。使用数组键名作为变量名,使用数组键值作为变量值,针对数组中的每个元素将在当前符号表中创建对应的一个变量。extract() 函数也可以将 GET 传入的数据进行转换,例如:

<?php
$a = false;
extract($_GET);
if($flag)
{
      echo "flag{}"
}
?>

此时变量 a 已经被定义了,但是在 extract() 函数转换 GET 方法传入的数据时,传入的 a 在转换时就会把原来的变量覆盖掉。

例题:变量 1

打开网页,可以直接看到源码。

flag In the variable !  <?php

error_reporting(0);    // 关闭php错误显示
include "flag1.php";    // 引入 flag1.php 文件代码
highlight_file(__file__);
if(isset($_GET['args'])){    // 通过get方式传递 args变量才能执行if里面的代码
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){    // 匹配任意大小写字母和 0 到 9 以及下划线组成
        die("args error!");
    }
    eval("var_dump($$args);");      //var_dump() 函数用于输出变量的相关信息
}
?>

因为这里有个 preg_match() 函数,它会通过正则表达式匹配字符串,因此不能使用其他的漏洞。根据提示 flag 藏在一个变量之中,观察到代码中有“$$”的可变变量用法。

也就是说,此时不需要去猜测 flag 藏在那个变量中,因为知道了变量名,有了“$$”也不能直接访问。现在需要知道保存 flag 的变量是哪个变量的值,因为 var_dump() 函数可以输出变量,如果变量是个数组也可以,例如:

<?php
$args = array(1, 2, 3);
var_dump($args);
?>

则数组 args 中的内容都可以被输出来,因此该函数也能把 “$GLOBALS” 中的内容都输出来。因此我们只需要把 GLOBALS 传递过去就行,构造 payload:

http://123.206.87.240:8004/index1.php?args=GLOBALS

例题:extract 变量覆盖

源码如下,flag 变量已经被定义了,如果用 GET 传入的变量中存在一个名叫 shiyan 的字符串,则将 flag 变量的值赋给 content 变量,如果变量 shiyan 和变量 content 的值相同就输出 flag 的值。

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    {
          echo'flag{xxx}';
    }
    else
    {
          echo'Oh.no';
    }
}
?>

此时 flag 变量被赋值成什么值我们不得而知,所以现在的想法是把 flag 变量覆盖掉。由于 extract() 函数可以将所有 GET 方法传入的数据全部换成变量,因此可以在传入 shiyan 变量时也传入一个 flag 变量。构造 payload 提交到指定网页,提交获得 flag。

?shiyan=&flag=

标签:WEB,变量,覆盖,flag,CTF,GLOBALS,数组,PHP,extract
来源: https://www.cnblogs.com/linfangnan/p/13521819.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有