前言

变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结。

变量覆盖概述

变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整攻击。那么它是如何引起的?其实,大多数变量覆盖漏洞是函数使用不当导致的。比如extract()函数和parse_str()。还有一个函数是import_request_variables(),它是在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP5.4之后,这个函数被取消了。还有一种是利用$$的方式来注册变量,但是没有验证已有变量,导致被覆盖。

extract()函数使用不当导致变量覆盖

函数结构:

int extract( array &$var_array[, int $extract_type = EXTR_OVERWRITE[, string $prefix = NULL]] )

再看一下PHP手册对这个函数的说明



说的通俗点就是将数组中的键值对注册成变量。extract()函数想要变量覆盖,需要一定的条件。它最多允许三个参数,用表格说明一下这三个参数:



由上图可知,该函数有三种情况会覆盖掉已有变量。下面用一段简单的代码来加深印象。

<?php
$b=2;
$a=array('b'=>'123');
extract($a);
echo $b;
?>

原来$b=2,经过extract()函数对$a处理后,$b被成功覆盖为123。

parse_str()函数使用不当导致变量覆盖

parse_str()函数的作用是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉原有变量。函数说明如下:

void parse_str( string $str[, array &$arr] )

函数有两个参数,第一个是必须的,代表要解析注册成变量的字符串,比如“a=1”经过parse_str()函数后会注册$a并复制为1,第二个参数是一个数组,当第二个参数存在时,注册的变量会放到这个数组里,如果原来有相同的键值,则会覆盖掉它。

用一段简单的代码加深印象:

<?php
$b=2;
parse_str($b=321);
print_r($b);
?>

我们发现$b的值被覆盖为321。

$$变量覆盖

先看引起覆盖的一小段代码:

<?php
$a=1;
foreach (array('_COOKIE','_POST','_GET') as $_request){
foreach ($$_request as $_key =>$_value){
$$_key = addslashes($_value);
}
}
echo $a;
?>

它为什么会导致变量覆盖呢?重点在$$符号,从代码中,我们可以看出$_key为COOKIR、POST、GET中的参数,如果我们提交?a=3,那么$key的值就为3,还有一个$在a的前面,结合起来就是$a=addslashes($_value),所以会覆盖原有a的值。上面的代码我们执行一下,如下图,发现a被覆盖成由GET方式传的8。

变量覆盖防范

变量覆盖最常见的漏洞点是做变量注册时没有验证变量是否存在。所以想要防范,推荐使用原始的变量数组,如$_GET、$_POST等,或者在注册变量前一定要验证变量是否存在。

PHP变量覆盖漏洞小结的更多相关文章

  1. ctf变量覆盖漏洞:

    1.变量覆盖: ①:针对extract函数的变量覆盖漏洞: <?php @error_reporting(E_ALL^E_NOTICE); require('config.php'); if($ ...

  2. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

  3. 变量覆盖漏洞学习及在webshell中的运用

    一.发生条件: 函数使用不当($$.extract().parse_str().import_request_variables()等) 开启全局变量 二.基础了解: 1.$$定义 $$代表可变变量, ...

  4. 7. 由一道ctf学习变量覆盖漏洞

    0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导 ...

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

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

  6. Web安全之变量覆盖漏洞

    通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_reques ...

  7. 代码审计-MetInfo CMS变量覆盖漏洞

    0x01 代码分析 安装好后是这样的 漏洞文件地址\include\common.inc.php 首先是在这个文件发现存在变量覆盖的漏洞 foreach(array('_COOKIE', '_POST ...

  8. CTF——代码审计之变量覆盖漏洞writeup【2】

    题目: 基础: 所需基础知识见变量覆盖漏洞[1]  分析: 现在的$a=’hi’,而下面的函数需满足$a=’jaivy’才可以输出flag,那么需要做的事就是想办法覆盖掉$a原来的值. 那么出现的提示 ...

  9. 2020/2/1 PHP代码审计之变量覆盖漏洞

    0x00 变量覆盖简介 变量覆盖是指变量未被初始化,我们自定义的参数值可以替换程序原有的变量值. 0x01 漏洞危害 通常结合程序的其他漏洞实现完整的攻击,比如文件上传页面,覆盖掉原来白名单的列表,导 ...

随机推荐

  1. Spring Cloud Admin健康检查 邮件、钉钉群通知

    源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin Admin 简介 官方文档:What is Spring ...

  2. Alpha阶段项目复审(小菜鸡联盟)

    Alpha项目复审 小队:小菜鸡联盟 团队名称 项目名称 评价 排名 『S.L.N』 OnTime 优点:团队分工合理明确,每个成员有一定的开发经验,能用到自己较为熟悉的技术进行开发:在开发初期制定了 ...

  3. 第5章 if 语句

    第5章 if 语句 5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': pr ...

  4. [CSP-S2019]格雷码 题解

    CSP-S2 2019 D1T1 考场上第一遍读题的时候感觉不是很一眼……不是很符合D1T1的气质 之前完全没听说过格雷码是什么玩意,还是我太菜了 仔细读题后发现应该是有规律可循的 赛后据说有$O(1 ...

  5. C/C++ MFC

    C++ & MFC(转载)   C++是一种静态数据类型检查的.支持多重编程范式的程序设计语言,支持过程化程序设计.数据抽象.面向对象程序设计.制作图标等泛型程序设计的多种程序设计风格. MF ...

  6. 阿里面试竟如此轻松,2招带你过关斩将拿下offer

    在找工作之前首先是要认清一个问题,虽然这个问题比较俗,但是很现实,就是为什么追求高工资? 这个问题我想不用说大家心里也清楚.大部分人都不是当前城市的本地人,说好听了叫来上班,说的不好听其实叫“外来务工 ...

  7. 社区布道师揭秘消息中间件技术内幕,撰写MQ架构设计与实现原理

    RocketMQ是什么 RocketMQ是由阿里捐赠给Apache的一款分布式.队列模型的开源消息中间件,经历了淘宝双十一的洗礼. RocketMQ的特性 RocketMQ基本概念 Client端 P ...

  8. JDK16关于TCP和UDP的优化

    文章转自belaban.blogspot.com Double your performance: virtual threads (fibers) and JDK 15/16!If you use ...

  9. 关于SpringBoot集成JDBCTemplate的RowMapper问题

    JdbcTemplate 是Spring提供的一套JDBC模板框架,利用AOP 技术来解决直接使用JDBC时大量重复代码的问题.JdbcTemplate虽然没有MyBatis 那么灵活,但是直接使用J ...

  10. Bitmap转ImageSource

    bitmap to bytes Bitmap b = new Bitmap( "test.bmp "); MemoryStream ms = new MemoryStream(); ...