声明:本公众号大部分文章来黑白之间安全团队成员的实战经验以及学习积累,文章内公布的漏洞或者脚本都来自互联网,未经授权,严禁转载。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本团队无关。

前言

友点 CMS V9.1 后台登录绕过 GetShell ,攻击者可无需任意权限即可登录后台并 getshell

漏洞影响

youdiancms <=9.1

漏洞细节

漏洞流程

  • 验证码可设置session
  • session(AdminGroupID==1) 超级管理员
  • 后台模板修改代码执行

任意 session 获取

站在前人的肩膀上,看到 App/Lib/Action/BaseAction.class.php ,217 行 verifyCode 函数

function verifyCode(){$length = $_GET['length'];        //长度$mode = $_GET['mode'];          //模式$type = $_GET['type'];              //图像类型$width = $_GET['width'];           //宽度$height = $_GET['height'];        //高度$verifyName = $_GET['verify'];  //验证码session名称import("ORG.Util.Image");Image::buildImageVerify($length, $mode, $type, $width, $height, $verifyName);
}

这是一个生成验证码的函数,可以看到,这些参数都是可控的,进入

Image::buildImageVerify($length, $mode, $type, $width, $height, $verifyName);
static function buildImageVerify($length=4, $mode=1, $type='png', $width=48, $height=22, $verifyName='verify') {import('ORG.Util.StringEx');$randval = StringEx::randString($length, $mode);$_SESSION[$verifyName] = md5($randval);...

看到这句

$_SESSION[$verifyName] = md5($randval);

$verifyName 是可控的,也就是说我们可以控制 $_SESSION 的键,后面的 md5 值暂时不考虑

接下来我们找可以利用的地方,我们看到管理员登陆的地方 App/Lib/Action/AdminBaseAction.class.php

function _initialize(){$mName = strtolower(ACTION_NAME);$NoCheckAction = array('login', 'verify','checklogin','showcode','logout'); //免登录验证模块if( !$this->isLogin() && !in_array($mName, $NoCheckAction)){ //没有登录,将返回登录页面$this->redirect("Public/login");}if( !$this->checkPurview() ){ //没有登录,将返回网站首页$this->redirect("Public/welcome");}

这是初始化的位置,需要注意两个地方

$this->isLogin()
$this->checkPurview()

想要得到登陆的状态,就需要绕过这两个方法,先来看 $this->isLogin()

function isLogin(){$b = session("?AdminID") && session("?AdminName");return $b;
}

这里很简单,只要存在 AdminID 和 AdminName 这两个session就可以,我们之前找到的地方就可以赋值

再来看 $this->checkPurview()

function checkPurview(){$gid = session('AdminGroupID');if( $gid == 1 ) return true;  //超级管理员拥有所有权限

这里首先要有一个 session AdminGroupID,这个容易满足,也可以直接赋值,但是只能获得普通的登陆权限,想要获得超级管理员的权限,就需要 $gid == 1 ,看似没有办法完成,但是注意到这里是弱比较,而之前赋值的时候,是用的 md5 值,我们只需要得到一个 md5,满足第一个字符是 1 ,第二个字符不是数字,就可以完成

回到一开始的漏洞位置,我们看看如何生成 md5 值

import('ORG.Util.StringEx');
$randval = StringEx::randString($length, $mode);
$_SESSION[$verifyName] = md5($randval);

我们看到这里应该是生成的随机字符串,传入的 $length$mode 是我们可控的,进入该函数

App/Core/Extend/Library/ORG/Util/StringEx.class.php 的 128 行

static public function randString($len=6,$type='',$addChars='') {$str ='';switch($type) {case 0:$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.$addChars;break;case 1:$chars= str_repeat('0123456789',3);break;case 2:$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;break;case 3:$chars='abcdefghijklmnopqrstuvwxyz'.$addChars;break;case 4:$chars = "们以我到...".$addChars;break;default :// 默认去掉了容易混淆的字符oOLl和数字01,要添加请使用addChars参数$chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;break;}if($len>10 ) {//位数过长重复字符串一定次数$chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5);}if($type!=4) {$chars   =   str_shuffle($chars);$str     =   substr($chars,0,$len);}else{// 中文随机字for($i=0;$i<$len;$i++){$str.= self::msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1,'utf-8',false);}}return $str;
}

可以看到,这里是利用 $type 选择相应的字符串,然后用 $len 控制长度,最后生成字符串

满足条件的 md5 值,1 - 100 以内就有 3个 ,为了减少爆破的次数,我们就直接选择数字以及长度设置成两位

后台getshell

后台 getshell 可以利用修改模板

App/Lib/Action/Admin/TemplateAction.class.php 的 68 行 saveModify 方法

function saveModify(){header("Content-Type:text/html; charset=utf-8");$ThemeName = C('HOME_DEFAULT_THEME');$_POST['FileName'] = YdInput::checkFileName( $_POST['FileName'] );$FullFileName = TMPL_PATH.'Home/'.$ThemeName.'/'.ltrim($_POST['FileName'],'/');if( !$this->isValidTplFile($FullFileName)){$this->ajaxReturn(null, '无效模板文件!' , 0);}//实体解码$FileContent = htmlspecialchars_decode($_POST['FileContent']); if (get_magic_quotes_gpc()) {$FileContent = stripslashes($FileContent);}     $b = file_put_contents($FullFileName, $FileContent);

首先获取文件名,然后将 post 上来的 content 写入模板文件,过程较为简单

Exp

https://github.com/N0puple/poc-set/tree/main/YouDian%20CMS%20Auth%20Bypass%20and%20RCE

总结

测试版本为 9.0,很多文章中写的利用短标签绕过过滤来getshell,这里没有必要,就没有去用,应该是 9.1 才有的过滤,这个前面的绕过漏洞是很有意思的,后面的后台 getshell 写的有点草率,尤其是exp中,直接覆盖了整个模板文件,真实的渗透测试中还是不要这么干,毕竟会影响到正常的业务了。

参考

  • https://forum.butian.net/share/132

欢迎大家关注公众号

友点 CMS V9.1 后台登录绕过 GetShell相关推荐

  1. 帝国cms忘记网站后台登录网址怎么找回?

    帝国cms后台登录网址是网站登录的界面,如果没有网址就像你回家找不到大门一个道理.那么如果忘记了后台登录网址,怎么重置找回? 帝国cms后台登录默认网址,以e/admin为结尾 http://qins ...

  2. 苹果cms如何修改后台登录背景图

    相信很多人都忽略了苹果cms的后台登陆背景图可以更换的,不仅可以更换成自己上传的背景图片,还有很多漂亮的背景图供我们选择.具体设置看教程吧! 1,系统后台--应用--应用市场---点击启用 2,点击配 ...

  3. 帝国cms模板仿后台登录界面

    介绍: 黑夜模式下的后台登录界面. 网盘下载地址: http://kekewl.net/EUZykCto8nt0 图片:

  4. 帝国cms模板仿后台登录界面源码

    黑夜模式下的后台登录界面. 下载地址: http://www.bytepan.com/noFSqgqFkA0

  5. php绕过管理员登录,EspCMS后台登录绕过漏洞再利用

    之前4月13日在360的漏洞平台提交过一次,当时给出了能计算出db_pscode的利用工具.db_pscode是安装的时候随机生成的一个字符串常量,保存在配置文件里.4月22日,官方发布了新版本,改进 ...

  6. %3cphp和%3c php_phpcmsv9后台登录绕过

    #! /usr/bin/env python import urllib2,re #code by 花开.若相惜 #PaxMac Team url=raw_input('input your atta ...

  7. ecmsadmin.php空白,帝国CMS 后台登录空白 处理方法一则

    在使用帝国cms时,后台登录后突然变为空白页,没有任何错误提示,且没有错误日志.本文介绍其处理方法之一. 经过 晚上11时左右,在调整帝国后台编辑器时,突然发现后台完全空白.重新登录时,完全空白.这个 ...

  8. phpcms v9 index.php,Phpcms V9后台登录地址修改方法

    在介绍了怎么修改Phpcms V9内容编辑器之后,今天CMSYOU在此继续分享Phpcms V9后台登录地址的修改方法. 在备份程序文件的前提下,下面一步一步来,教会你如何修改phpcms v9默认后 ...

  9. 织梦如何更改默认的后台登录账号和密码(亲测可用)

    我们在使用织梦进行网站搭建的时候,通常会忽略设置管理员账号和密码,造成网站设置成默认的账号和密码:admin,这样肯定会留下安全隐患.那么织梦如何更改默认的后台登录账号和密码呢? 第一步.更改织梦cm ...

最新文章

  1. Android 图片缓存之内存缓存技术LruCache,软引用
  2. Qt中TCP服务端编程
  3. 网页中如何使用一些特殊字体
  4. Gitbook+码云创建自己的文档
  5. 学习中碰到的一些优化工具包和库
  6. 解决appium-inspector连接后在Appium中报错:No route found for /sessions
  7. android系统广播 定向广播,Android之定向广播
  8. android 65536 简书,app编译打包时的65536问题
  9. 同学,你要的SpringBoot多图片上传回显功能已经实现了,赶紧收藏吃灰~
  10. vue脚手架项目中引入jquery
  11. PMP考生注意!PMP考试必备资料有这些!
  12. 关于word使用之三线表制作
  13. 计算机在档案管理中的作用,计算机在档案管理中的运用
  14. WSAStartup(0x0101, wsaData); (WSADATA wsaData;)
  15. SAS盘和SATA盘的区别
  16. Midjourney 文本转图片接口请求参数
  17. C语言爱心代码大全集—会Ctrl+C就可以表白了
  18. 2018年就要过去了
  19. 1.1. 内容创作不再是少数“业内人”的工作,而是多数“普通人”的生活。
  20. C语言:实现勾股定理的运算

热门文章

  1. Codeforces Round #811 (Div. 3)
  2. 数理逻辑4 -- 公理化集合论16
  3. 电子产品销售分析练习项目
  4. 在x64上构建智能家居(home assistant) (三) 功能介绍 addons,hacs安装
  5. Java-双亲委派机制
  6. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo
  7. 二分网络上的电影推荐
  8. 苹果ipad 9.7寸1代2代,改装便携显示器铝外壳,欢迎DIY朋友们,满血复活,废物利用!
  9. metaball公式_parametric.是什么意思
  10. 用C语言编写一个申请内存的程序