一、漏洞简介

变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞。通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成的危害可能是无法估量的。例如购买商品的支付系统若存在变量覆盖漏洞,就可能存在0元支付下单的情况。

二、漏洞产生的原因

变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:

  • extract()
  • parse_str()
  • import_request_variables()
  • $$(可变变量)
  • register_globals=On (PHP5.4之后正式移除此功能)

三、漏洞挖掘

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

extract()函数覆盖变量需要一定条件,它的官方说明为“从数组中将变量导入到当前的符号表”,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值。extract()函数的结构如下:

extract(array,extract_rules,prefix)

参数

描述

array

必需。规定要使用的数组。

extract_rules

可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。

prefix

可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。

前缀和数组键名之间会自动加上一个下划线。

从以上说明我们可以看到第一个参数是必须的,会不会导致变量覆盖漏洞由第二个参数决定,该函数有三种情况会覆盖已有变量,分别如下:

第一种:当第二个参数为EXTR_OVERWRITE 时,它表示如果有冲突,则覆盖已有的变量。

第二种:当只传入第一个参数,这时候默认为EXTR_OVERWRITE模式。

第三种:当第二个参数为EXTR_IF_EXISTS 时,它表示仅在当前表中已有同名变量时,覆盖它们的值,其他的都不注册新变量。

下面我们用代码来说明,测试代码如下:

点击添加图片描述(最多60个字)编辑

测试结果如下:

点击添加图片描述(最多60个字)编辑

原本变量$a的值为1,经过extract()函数对变量$b处理后,变量$a的值被成功覆盖为了3.

2. parse_str()函数使用不当导致的覆盖

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

parse_str(string,array)

参数

描述

string

必需。规定要解析的字符串

array

可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。

从以上说明我们可以看到第一个参数是必须的,它代表要解析注册成变量的字符串,形式为“a=1”,经过parse_str()函数之后会注册变量$a并且赋值为1。

测试代码如下:

点击添加图片描述(最多60个字)编辑

测试结果如下,变量$a原有的值1被覆盖成了5.

点击添加图片描述(最多60个字)编辑

3. import_request_variables()所导致的变量覆盖

import_request_variables()函数作用是把GET、POST、COOKIE的参数注册成变量,该函数只能用在PHP4.1 ~ PHP5.4之间。

import_request_variables()函数的结构如下:

import_request_variables ( string $types , string $prefix )

其中$type代表要注册的变量,当$type为GPC的时候,则会注册GET、POST、COOKIE参数为变量。

测试代码如下:

点击添加图片描述(最多60个字)

测试结果如下,变量$a原有的值1被覆盖成了6.

点击添加图片描述(最多60个字)编辑

4. 由$$变量赋值引发的覆盖

$$是一种可变变量的写法,它可以使一个普通变量的值作为可变变量的名字,这种类型常常会使用遍历的方式来释放变量的代码,最常见的就是foreach的遍历,示例代码如下:

点击添加图片描述(最多60个字)编辑

从代码中我们可以看出$_key为COOKIE、POST、GET中的参数,$key的值为a而还有一个$在a的前面,结合起来则是$a=addslashes($_value);所以这样会覆盖已有的变量$a的值。在浏览器输入http://127.0.0.1/test.php?a=666,结果如下,可以看到已经成功把变量$a的值由2覆盖成了666。

点击添加图片描述(最多60个字)编辑

5.全局变量的覆盖

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

点击添加图片描述(最多60个字)编辑

当register_globals为OFF时,我们无法将未初始化的变量进行注册,如下图所示:

点击添加图片描述(最多60个字)编辑

当register_global=ON时,可以看到已经成功注册了一个未初始化的变量,如下图所示:

点击添加图片描述(最多60个字)编辑

还有一种情况,通过$GLOBALS获取的变量在使用不当时也会导致变量覆盖,同样漏洞触发的前提是register_globals为ON,如下图所示,已成功通过注入GLOBALS[a]来改变$a的值:

点击添加图片描述(最多60个字)编辑

tips:从PHP 4.2.0 版开始配置文件中PHP指令register_globals的默认值从on改为off了,自PHP 5.3.0起废弃并将自PHP 5.4.0起移除。

四、漏洞防范

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

①使用原始变量

建议不注册变量,直接用原生的$_GET、$_POST等数组变量进行操作,如果考虑程序可读性等原因,需要注册个别变量,可以直接在代码中定义变量,然后再把请求中的值赋值给他们。

②验证变量存在

如果一定要使用前面几种方式注册变量,为了解决变量覆盖的问题,可以再注册变量前先判断变量是否存在。如使用extract( )函数则可以配置第二个参数为EXTR_SKIP。使用php parse_str函数注册变量前需要先自行通过代码判断变量是否存在。最重要的一点,自行申明的变量一定要初始化,不然即使注册变量代码在执行流程最前面也能覆盖掉这些未初始化的变量。

csrf漏洞防御方案_变量覆盖漏洞利用及防御方案相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 短文件名漏洞如何修复_短文件名漏洞修复

    短文件名漏洞其实在13年时还是很令人耳熟能详的,不过随着所在公司的编码语言转型,目前使用ASP.NET的新项目基本上没有了,而更多的是对原来的采用ASP.NET语言开发的项目进行维护或打个补丁. 事出 ...

  9. web漏洞扫描器原理_知名Web漏洞扫描器Acunetix Web Vulnarability Scanner

    Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞.它包含有收费和免费两种版本,A ...

最新文章

  1. redmine 插件开发非官方指南
  2. 管理表空间和数据文件——使用OMF方式管理表空间
  3. mysql有没有批量游标_MySQL使用游标批量处理进行表操作_MySQL
  4. Web布局连载——两栏固定布局(五)
  5. C语言中__attribute__ ((at())绝对定位的应用
  6. spring预加载与懒加载_通过Spring将继承树加载到List中
  7. Linux 阵列卡驱动安装
  8. 力扣-面试题 02.06. 回文链表
  9. 企业在信息化建设上乘之选:软件快速开发框架
  10. SPSS 工作空间不足的解决办法
  11. 证件照排版软件_不会用PS做证件照?Word也能排版打印1寸照,一键轻松搞定
  12. 信息系统项目管理师考试心得
  13. 5960 差分约束系统
  14. 现在最火爆的盲盒交友小程序源码
  15. 正态分布概率密度函数的推导
  16. 【报告分享】2020年天猫零食市场分析报告-魔镜(附下载)
  17. python 通过tif文件生成经度和纬度的二维矩阵
  18. linux下磁盘坏道修复
  19. Java对图片进行添加水印操作
  20. stm32H743can配置

热门文章

  1. Windows 下 Anaconda3 的安装配置
  2. 安装rime中文输入法
  3. 5.1.1 什么是I/O设备?有几类I/O设备?
  4. FreeRTOS 之 在Cortex-M中应用时的中断优先级设置
  5. shell / 获取当前工作目录的方法
  6. Cpp 对象模型探索 / placement new 实现原理
  7. php计算时间差js,JavaScript如何计算时间差(引入外部字体文件)?
  8. idea 升级到2020后 无法启动_启动崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能...
  9. 微信小程序PHP文件建在哪里,微信小程序解析H5文件方法
  10. am.java_6.3.1 从am说起