前言

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

变量覆盖概述

变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整攻击。那么它是如何引起的?其实,大多数变量覆盖漏洞是函数使用不当导致的。比如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等,或者在注册变量前一定要验证变量是否存在。

最新文章

  1. 基于webapi的移动互联架构
  2. Python学习路程-常用设计模式学习
  3. Memcache所有方法及参数详解
  4. MySQL数据库数据类型之集合类型SET测试总结
  5. ORACLE CONTROL FILE 笔记
  6. 【转】开发者教程:如何将Android应用发布到Google Play(Android Market)官方市场
  7. 【面试虐菜】—— Oracle知识整理《收获,不止Oracle》
  8. PDFium-PDF开源之旅(1)-初探代码下载编译
  9. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计
  10. 基于visual Studio2013解决面试题之1109全排列
  11. python学习笔记之五:抽象
  12. 201521123044 《Java程序设计》第11周学习总结
  13. Linux快速搭建FTP服务器
  14. Java-IO之FilterInputStream和FilterOuptStream
  15. mysql数据类型优化
  16. 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)
  17. Gym 100247I Meteor Flow(优先队列)
  18. js实现字体闪烁
  19. Unique Binary Search Trees leetcode java
  20. 报错--&quot;npm audit fix&quot; or &quot;npm audit&quot;

热门文章

  1. 如何选择一台适合Java开发的电脑
  2. eclipse git如何切换分支,拉取代码,合并代码,解决冲突等
  3. Python开发的入门教程(五)-set
  4. java23种设计模式—— 一、设计模式介绍
  5. 2020重新出发,MySql基础,MySql字符集
  6. activemq的搭建
  7. 手写Promise看着一篇就足够了
  8. android开发之java代码中如何获取到当前时间。详情代码带注释。
  9. 移动开发中如何整合HTML 5和原生代码
  10. Lua索引、伪索引、引用