无需登录-悟空CRM 存储型XSS
无需登录-悟空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));
}
$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;
上一页
}
}
$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的更多相关文章
- 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF
存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...
- Java Web开发 - 持久型/存储型XSS漏洞
Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...
- 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- DVWA(七):XSS(stored)存储型XSS攻击
存储型XSS : 存储XSS,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在.提交JS攻击代码存储到数据库然后再输出. low: 观察源码: <?php if( isset( ...
- 74CMS 3.0 存储型XSS漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.0源代码编辑使用GBK编 ...
- 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss
转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...
- Coremail邮件系统存储型XSS两个
(1):Coremail邮件系统存储型XSS之一 给受害者发送主题如下的邮件: <svg onload='img=new Image();img.src="//x55.me/geo.p ...
- DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting
上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...
- 【代码审计】QYKCMS_v4.3.2 前台存储型XSS跨站脚本漏洞分析
0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...
随机推荐
- xml 类详解
- 【转载】JSP 获取真实IP地址的代码
JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的. 但是在通过了 Apache,Squid ...
- Candies CodeForces - 991C(二分水题)
就是二分暴力就好了 为什么要记下来 呵呵....emm你说为什么... 行吧 好吧 我一直以为我的二分出问题了 原来不是 依旧很帅 统计的时候求的减了多少次 然后用次数乘了mid 这样做会使那个人获 ...
- IbatisNet连接oracle 报错
提示什么 connect oracle 1.5.0.xxxx 将你本机的oracle 客户端版本重装换成32位即可
- linux内核分析 第八周读书笔记
第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...
- [SDOI2009] HH去散步 (矩阵乘法)
link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #inclu ...
- ASP.NET MVC 3 常用
http://blog.csdn.net/churujianghu/article/details/7297358 1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.confi ...
- git<git rebase 修改以前提交过的内容>
git rebase 使用总结: 使用git rebase 修改以前已经提交的内容 比如要修改之前的commit的 hashcode为:187f869c9d54c9297d6b0b1b4ff47d ...
- Spring Boot的属性加载顺序
伴随着团队的不断壮大,往往不需要开发人员知道测试或者生产环境的全部配置细节,比如数据库密码,帐号信息等.而是希望由运维或者指定的人员去维护配置信息,那么如果要修改某项配置信息,就不得不去修改项 ...
- 前端路由的两种模式: hash 模式和 history 模式
随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...