Zrlog 1.9.1.0027版本存储型 XSS 漏洞
slug
series-status
status
summary
date
series
type
password
icon
tags
category
Zrlog 1.9.1.0027版本存储型 XSS 漏洞
Tags: Zrlog, 存储型XSS
环境搭建
Zrlog 环境搭建
本模块转载自51CTO博客作者 jiaoshou0416 的文章:docker 搭建zrlog 博客 原文链接:
部署前说明:
之前我们直接在虚拟上搭建过zrlog,原理很简单,就是在tomcat上安装zrlog应用,当然博客要存储,就需要数据库。 这次我们数据库和tomcat都采用docker形式部署,zrlog直接提前构建进tomcat 容器里,docker mysql 启动后,再进容器用脚本创建zrlog 数据库和用户。
环境配置:
- win10 主机
- vmware版本 12.0.1 build-3160714
- 虚拟机系统 CentOS Linux release 7.4.1708 (Core
- 虚拟ip: 192.168.179.131
- docker版本 Docker version 20.10.2, build 2291f61
一. docker 部署mysql
- 拉取镜像
- docker 启动mysql
- 备注: MYSQL_ROOT_PASSWORD=123456 给mysql root 用户设置了初始密码
- 创建zrlog数据库,并给zrlog用户授权。 将create_mysql_user.sh 脚本拷贝到容器中执行
- create_mysql_user.sh 脚本内容如下:
二. docker 部署tomcat_with_zrlog
- 准备tomcat_with_zrlog Dockerfile
- Dockerfile 如下:
- zrlog 下载地址:
- 提前准备好server.xml文件,改文件更改了访问端口,添加了通过域名访问的host的配置


- 启动
- [root@lvlinux131 script]# cat start_tomcat.sh
- 备注:
- pipework br0 tomcat_zrlog 192.168.179.140/24@192.168.179.2 是给容器里 添加桥接网络的ip,192.168.179.140 与虚机是同一个子网
- docker 配置桥接网络及安装 pipwork 见博客 https://blog.51cto.com/12606610/2147696
三. 安装zrlog
- win10 浏览器访问:
- 更改数据库服务器IP为虚拟机ip 192.168.179.131,更改数据库用户名为zrlog,密码为lvlinux,该信息来自数据库授权脚本create_mysql_user.sh
- 填写管理员密码和网站标题,点击下一步完成安装
- 配置域名访问,本机配置dns

- windos 配置hosts
- 192.168.179.140 www.zrlog.cn

- 拷贝zrlog项目到域名解析的目录
- 浏览器用域名访问:www.zrlog.cn
源码分析
<aside>
🔬 由于本次的环境搭建较为繁琐,且仅为XSS漏洞,因此直接进入源码分析
</aside>
前言:在 localhost:8080/z/admin/website 路径下发现了存储型XSS漏洞
反编译
- 首先将下载的源码war包放入JD-GUI进行反编译
<aside>
📂 JD-GUI下载地址:https://github.com/java-decompiler/jd-gui
</aside>

步进分析
- 观察web.xml文件,查看数据流向

- 可以看到其中主要为com.zrlog.web.config.ZrLogConfig负责访问控制的部分

- 进入该类的源码进行分析

- 在这部分可以看到其中的路由配置主要由AdminRoutes类完成

- 进入AdminRoutes中

- 不难看出,前言中提到的请求路径“/admin/website”,对应的是WebSiteController控制类,因此,进入该控制类进行分析

- 可以看到,这里针对传进来的update的数据首先会存储到一个临时的Map集合中,然后调用功能updateByKV方法进行更新到数据库中,为了检查updateByKV方法是否针对输入的内容进行了合理的校验,我们进入到WebSite类中进行检查

- 可以看到,该函数未对传入的数据进行任何的校验、扰乱、编码就借助SQL语句写入了数据库中。
<aside>
📂 至此,可以看出该系统并未对用户的输入进行防御,接下来开始针对输出的数据是否进行了过滤进行审计。
</aside>
- 假设这里,我们通过value值写入了XSS代码

- 那么根据这个select函数可以看出程序在Dao层并未对查询到的数据进行过滤

- 利用JD-GUI的全局检索功能搜索该方法名

- 发现一个控制层调用了该方法,进入该控制器中进行审计

- 可以看到,针对输出的jsonStr并未进行任何的过滤直接进行了输出,在fullTemplateSetting方法中也只是对该部分进行了格式化的处理

- 最后我们尝试回到这个/admin/blank的前端页面中查看前端是否对输出的数据进行了过滤,也是我们最后的希望


- 但是很可惜,该部分也未对输出的数据进行任何的过滤,直接拼接到了页面的源码上,导致了存储型XSS漏洞的出现
Loading...