最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 细说变量覆盖那些事

    正文概述 转载于:掘金(合天网安实验室)   2021-03-27   779

    前言

    最近在挖洞和看一些ctf题目中可以看到一些变量覆盖的知识点,之前对这个方面学习的有点不全面,虽然网上有这方面的文章,但是感觉讲的不是很全面,所以就决定写一篇文章来总结这方面的知识。

    本文涉及相关实验:php安全之变量覆盖漏洞 (通过该实验,详细了解PHP中变量覆盖漏洞相关的知识。如:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。)

    漏洞原理

    变量覆盖是指可以用自己的传参值代替程序原有的变量值。

    漏洞寻找

    例如下面的函数或者语法使用不当时就会出现漏洞。

    • $$
    • extract()
    • parse_str()
    • import_request_variables()
    • mb_parse_str
    • register_globals

    漏洞解析

    这里先分析函数,再分析漏洞。

    extract()

    原理

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

    例如

    <?php
    $a = "eeknight";
    $my_array = array("a" => "C","b" => "T", "c" => "F");
    extract($my_array);
    echo "\$a = $a; \$b = $b; \$c = $c";
    ?>
    
    输出:
    $a = C; $b = T; $c = F
    

    攻击手段

    这里先举个例子

    <?php
    $a="echo 'eeknight';";
    echo $a;
    echo "\n";
    eval($a);
    ?>
    输出:
    echo 'eeknight';
    eeknight
    

    在上面双引号包裹了单引号,然后通过eval去利用他,就可以直接输出单引号里的东西了。

    为什么要说这个东西,因为当你单引号里的东西可以被利用,是不是就可以写什么执行什么了。

    怎么利用呢,这时候刚才介绍的extract就发挥作用了。

    把上面的例子简单改一下

    <?php
    $a="echo 'eeknight';";
    extract($_GET);
    eval($a);
    ?>
    

    细说变量覆盖那些事

    $$

    原理

    $$产生的漏洞主要是因为foreach遍历数组的值,然后将获取的数组键名作为变量,数组中的值作为变量的值。

    在这先简单介绍一下foreach$$

    foreach循环只适用于数组,并用于遍历数组中的每个键/值对。

    <?php 
    $colors = array("red","green","blue","yellow"); 
    
    foreach ($colors as $value) {
       echo "$value \n";
    }
    ?>
    输出:red
    	green
    	blue
    	yellow 
    

    $$这里举个栗子

    在PHP中,$var表示一个名为var的普通变量,它存储字符串、整数、浮点等任何值。而$$var是一个引用变量,用于存储$var的值。

    在我看来就是套娃。

    细说变量覆盖那些事

    <?php
    $var = "ee";
    $$var = "eeknight";
    echo $var ;
    echo "\n";
    echo $$var;
    echo "\n";
    echo "$ee";
    ?>
    输出:ee
         eeknight
    	 eeknight
    

    parse_str()

    parse_str()把查询字符串解析到变量中。

    parse_str(string,array)
    string 	必需。规定要解析的字符串。
    array 	可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。
    
    <?php
    parse_str("name=eeknight&age=20");
    echo $name."\n";
    echo $age;
    ?>
    输出:eeknight
    	 20
    

    攻击方式

    通过上面的例子,可以想到,如果parse_str()括号是GET,PSOT等之类的,我们是不是就可以直接执行我们要的函数。

    细说变量覆盖那些事

    mb_parse_str

    mb_parse_str— 解析 GET/POST/COOKIE 数据并设置全局变量

    具体的用法和上面的parse_str()一样。

    这里就不多说明了。

    import_request_variables()

    import_request_variables()函数将 GET/POST/Cookie 变量导入到全局作用域中。

    细说变量覆盖那些事

    <?php
    import_request_variables("gP", "ee_");
    echo $ee_knight;
    ?>
    

    细说变量覆盖那些事

    攻击方式

    只要利用了这个函数,就可以直接对里面的变量进行赋值。

    register_globals

    register_globals的意思就是注册为全局变量

    php.iniregister_globals=On时,传递过来的值会被直接注册为全局变量,当为off时,需要到特定的数组中去得到

    例子

    <?php
    echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";
     
    if ($auth){
       echo "hello!";
    }
    ?>
    

    ON

    细说变量覆盖那些事

    OFF

    细说变量覆盖那些事

    这里ON-->OFF的转换时记得重启一下apache

    一些附加说明

    1. 为什么echo "\$a = $a; \$b = $b; \$c = $c";这里要加上\

      解:这些斜杠的的意思就是,让后面的变量失去意义。那么写的是什么就是什么。

    2. parse_str()

      php.ini文件中的magic_quotes_gpc设置影响该函数的输出。如果已启用,那么在parse_str()解析之前,变量会被 addslashes() 转换。

    3. import_request_variables()

      该函数在最新版本的 PHP 中已经不支持。

      支持的版本:PHP 4 >= 4.1.0, PHP 5 < 5.4.0。

    4. register_globals

      register_globals从php5.3.0起废弃,并从php5.4.0时移除。

    漏洞防御

    1. addslashes()

      addslashes()在每个双引号(")前添加反斜杠。

    2. 使用原始变量,不进行变量注册;

    3. 验证变量存在,如果一定要进行变量注册,可以在注册变量前先判断变量是否存在。


    起源地下载网 » 细说变量覆盖那些事

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元