安全-EmpireCMS 小于等于7.5版本后台XSS漏洞复现
Posted 小狐狸FM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全-EmpireCMS 小于等于7.5版本后台XSS漏洞复现相关的知识,希望对你有一定的参考价值。
文章目录
前言
安装配置的步骤略过,文章仅学习交流,请勿用于非法用途
此漏洞需要有后台的权限才可利用
一、环境
环境 | 版本 |
---|---|
操作系统 | win 10 |
php | 5.2.17 |
mysql | 5.7.26 |
ftp | 0.9.60 |
apache | 2.4.39 |
EmpireCMS | 7.2 |
网站根路径,
upload
的名称被我改为了empire
二、漏洞复现
开启服务
管理员登录
成功登录之后,
index.php
会有一个参数作为key
,参数名字和参数的值都是随机的
参数格式:ehash_XXXX
然后构造
payload
进行xss注入,后面使用一个&
符号接登录时候的参数
http://127.0.0.1/empire/e/admin/openpage/AdminPage.php?mainfile=javascript:alert(/xss/)&ehash_Z63h=3m6ls0xGLuKPr6KQrsnL
成功弹窗
如果没有使用参数,可能会报错
三、源码审计
[1]. 漏洞点
使用
Seay
进行审计,查看/e/admin/openpage/AdminPage.php
文件
存在漏洞点的是$mainfile
参数
在第
20
行接收了来自用户的GET
型参数mainfile
并使用一个函数hRePostStr
将获取的参数mainfile
处理,赋值给一个变量$mainfile
[2]. hRepPostStr函数
hRepPostStr
不是内置函数,需要在代码中查询,可以使用phpstorm
快速定位函数
hRepPostStr
函数位于/e/class/connect.php
内
hRepPostStr
内调用的三个函数也是自定义的hRepPostStr
的算法思路如下:
判断传入的$ecms
是否为1
,为1
就调用ehtmlspecialchars
对$val
处理
CkPostStrChar
判断是否需要结束php程序
AddAddsData
用于添加转义符\\
[3]. ehtmlspecialchars函数
ehtmlspecialchars
函数的功能是调用htmlspecialchars
内置函数对$val
进行HTML
实体编码
此时传入htmlspecialchars
内置函数的$flags
值是ENT_COMPAT
,只会转换双引号
如果此时$val
存在单引号且调用$val
是使用的单引号,就可以实现单引号的闭合- PHP: htmlspecialchars - Manual
[4]. CkPostStrChar函数
CkPostStrChar
函数使用了substr
函数截取了$val
末尾,判断是否为\\
\\\\
中的第一个\\
表示转义符,符合时就结束php
程序- PHP: 转义序列(反斜线)- Manual
[5]. AddAddsData函数
AddAddsData
函数中先判断了一下MAGIC_QUOTES_GPC
变量值是否为false
为false
时就进入if
语句,调用addslashes
函数对$data
转义- PHP: addslashes - Manual
[6]. MAGIC_QUOTES_GPC变量
MAGIC_QUOTES_GPC
被定义在第6
行,通过get_magic_quotes_gpc
函数获取当前magic_quotes_gpc
的配置选项
magic_quotes_gpc
在php.ini
中值为on
或off
,而get_magic_quotes_gpc()
和MAGIC_QUOTES_GPC
的值为true
或false
- PHP: get_magic_quotes_gpc - Manual
[7]. 变量判空
使用
empty
对变量判空,如果我们没有对$mainfile
传参,则他的值就会变为main.php
[8]. 变量调用
在
83
行处,将传入的$mainfile
使用<?=变量?>
进行了输出
<?=变量?>
相当于<?php echo 变量;?>
[9]. 绕过分析
mainfile=javascript:alert(233)
里面没有单引号、双引号、反斜线和NULL,所以不会被addslashes()
和htmlspecialchars()
函数转义htmlspecialchars()
的flags
选项设置成了ENT_COMPAT
会转换双引号,不转换单引号
但是最终调用mainfile
变量时前后都是使用双引号括起来的,所以使用单引号同样无法闭合绕过
四、修复
- 将EmpireCMS的版本升级到最新
- 先对
mainfile
传入的参数进行全小写,然后过滤javascript
xss失败
以上是关于安全-EmpireCMS 小于等于7.5版本后台XSS漏洞复现的主要内容,如果未能解决你的问题,请参考以下文章
CNVD-2018-19126 EmpireCMS后台任意代码执行可GetShell
帝国CMS(EmpireCMS) v7.5后台getshell分析(CVE-2018-18086)
安全-emlog 小于等于5.1.2版本 博客系统后台权限提升漏洞复现(i春秋)