变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。

   经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数,import_request_variables()使用不当,开启了全局变量注册等。

 0×01 全局变量覆盖

  register_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。

代码示例1:

<?php
//?id=1
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";
echo '$_GET["id"] :'.$_GET['id']."<br/>";
echo '$id :'.$id;
?>

当register_globals=Off的时候,下一个程序接收的时候应该用$_GET['id']来接受传递过来的值;

当register_globals=On的时候,下一个程序可以直接使用$id来接受值,也可以用$_GET['id']来接受传递过来的值。

tips:如果上面的代码中,已经对变量$id赋了初始值,比如$id=0,那么即使在URL中有/test.php?id=1,也不会将变量覆盖,id值为0

代码示例2:

<?php
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";
if (ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
print $a."<br/>";
print $_GET[b];
?> 

在register_globals=ON时,

提交/test.php?a=1&b=2 , 变量$a未初始化,$_GET[b]=2

提交/test.php??GLOBALS[a]=1&b=2,$a=1,$_GET[b]=2

tips: 从 PHP » 4.2.0 版开始配置文件中 PHP 指令 register_globals 的默认值从 on 改为 off 了,自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。源自              http://php.net/manual/zh/security.globals.php

0×02 $$导致的变量覆盖问题

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

<?php
foreach (array('_COOKIE','_POST','_GET') as $_request)
{foreach ($$_request as $_key=>$_value)  {$$_key=  $_value;}
}
$id = isset($id) ? $id : 2;
if($id == 1) { echo "flag{xxxxxxxxxx}"; die(); } echo $id; ?>

0×03 extract()变量覆盖

  extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。源自:http://www.w3school.com.cn/php/func_array_extract.asp

代码示例1:

将键值 "Cat"、"Dog" 和 "Horse" 赋值给变量 $a、$b 和 $c:

<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
//运行结果:$a = Cat; $b = Dog; $c = Horse

代码示例2:

<?php
$id=1;
extract($_GET);
echo $id;
?>
//提交:?id=123
//结果: 123

tips: 在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖  extract($_GET,EXTR_SKIP);

0×04 parse_str()变量覆盖

  parse_str() 函数把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。

  用法参考: http://www.w3school.com.cn/php/func_string_parse_str.asp

代码示例一:

<?php
parse_str("a=1");
echo $a."<br/>";      //$a=1
parse_str("b=1&c=2",$myArray);
print_r($myArray);   //Array ( [c] => 1 [b] => 2 )
?>

tips:parse_str()类似的函数还有mb_parse_str(),用法基本一致。

 0×05 import_request_variables变量覆盖

  import_request_variables 函数可以在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中。

<?php
import_request_variables("g", "get_");
echo $get_id;
?>
//提交:?id=111
//结构:111

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

参考链接:

代码审计|变量覆盖漏洞    http://www.freebuf.com/column/150731.html

[web安全] 变量覆盖漏洞  http://blog.csdn.net/hitwangpeng/article/details/45972099

PHP代码审计笔记--变量覆盖漏洞相关推荐

  1. [BJDCTF2020]Mark loves cat(.git源码泄露与代码审计之变量覆盖漏洞)

    知识点: php中$$用来定义可变变量 解题: python GitHack.py http://e6e2adea-991f-4ae7-b4ea-0f82d49d8f8c.node3.buuoj.cn ...

  2. php代码审计命令执行,PHP代码审计笔记--命令执行漏洞

    命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: $target=$_REQUEST['ip']; $cmd = sh ...

  3. csrf漏洞防御方案_变量覆盖漏洞利用及防御方案

    一.漏洞简介 变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞.通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成 ...

  4. php之变量覆盖漏洞讲解

    1.变量没有初始化的问题(1): wooyun连接1:[link href="WooYun: PHPCMS V9 member表内容随意修改漏洞"]tenzy[/link] $up ...

  5. Discuz! $_DCACHE数组变量覆盖漏洞

    Discuz! $_DCACHE数组变量覆盖漏洞 author: ryat_at_[url]www.wolvez.org[/url] team:[url]http://www.80vul.com[/u ...

  6. php之变量覆盖漏洞讲解,PHP中的变量覆盖漏洞代码深入解析

    2.CTF中extract()导致的变量覆盖 我们大致分析是要求我们GET传参进去值会经过extract()函数下来会有两个if 第一个if判断 ceshi这个变量是否存在 存在则继续执行if里面的 ...

  7. 记一次无意间发现某学校图书检索系统的变量覆盖漏洞

    这是汇文OPAC很早就存在的一个严重漏洞 补充漏洞信息参考来源https://www.seebug.org/vuldb/ssvid-90722 1. 利用存在该漏洞参数的链接,访问存在漏洞文件,并覆盖 ...

  8. 齐博CMS变量覆盖漏洞exp

     漏洞的具体分析在 http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.AooULy&id=13,下面公布一下我写的漏洞利用以及ex ...

  9. 一、WillPHPv2代码审计-[变量覆盖]-[文件包含]-[任意文件读取漏洞]-[pearcmd裸文件包含]

    时间戳--2021.12.12 0x01 [HXBCTF 2021]easywill_WriteUp: 一.PHPSTORM框架调试 第一步:登录buuctf,打开[HXBCTF 2021]easyw ...

最新文章

  1. 编程之美-连连看游戏设计方法整理
  2. ajax里拼接标签属性规则,vue 标签属性数据绑定和拼接的实现方法
  3. “multiprocessing\spawn.py”, line 105, in spawn_main错误与解决方法
  4. antd的 input有下拉_解决antd 下拉框 input [defaultValue] 的值的问题
  5. asp.net 无法访问已关闭的资源集
  6. kepware odata 接口访问地址
  7. linux系统 ghost,Linux下用GHOST来做系统备份
  8. 浅谈论文查重检测过程中的常见问题
  9. WinRAR压缩软件安装步骤
  10. 闲鱼商品选投实时性优化
  11. 2017国庆 济南清北学堂 8天乐
  12. SEOer在网站优化中,如何快速的写出原创的文章?
  13. 小程序获取节点绑定数据data-index的方法
  14. 日语二级能力考试204个语法(中文详解)
  15. DM达梦数据库的修改数据库和修改系统命令
  16. [译]coo_matrix
  17. MySql 拼接查询 CONCAT
  18. BGA封装FPGA器件同36对差分线的FMC连接器进行布局布线
  19. MySQL存储过程--菜鸟教程
  20. 力扣1024活动 根据你手中的卡片判断能否合成1024 Java程序

热门文章

  1. Android 入职感想
  2. 应用(指定)进程创建的时候创建Application
  3. 解决安装XMind出现Invalid Configuration Location The configuration area at ‘C:\Users\Administrator\Applicat
  4. 分布式文件系统—HDFS—核心设计
  5. 分布式文件系统—HDFS—IDEA的Hadoop可视化插件BigDataTools
  6. SharePoint Framework 企业向导(九)
  7. Majority Element II
  8. 2014年acm亚洲区域赛·鞍山站
  9. [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.6 一维粘性热传导流体动力学方程组...
  10. (转)rtmp协议简单解析以及用其发送h264的flv文件