该漏洞CNVD-ID: CNVD-2019-10126
漏洞提交CNVD后,待CNVD公示才发出本文。
测试环境:
程序版本:v7.0.14
Windows + firefox + burpsuite + apache2 + PHP5.6.27(phpStudy集成环境)
iCMS官网:https://www.icmsdev.com/
一、漏洞分析
1、新用户注册时,输入注册邮箱,系统会自动查找数据库看是否已经注册。拦截检查的HTTP包。
BurpSuite里替换URI为:
/public/api.php?app=user&do=check&name=1&value=1&callback=confirm(document.cookie)&script=1
iCMS有第三方阿里云的全局过滤插件,过滤了alert等关键字和html标签。这里使用confirm替代alert可以绕过。
2、进入/app/user/user.app.php模块的function API_check()函数,该函数最后会调用/iPHP/core/iUI.class.php模块中的function json()函数。在json()函数中,
G
E
T
获
取
c
a
l
l
b
a
c
k
参
数
,
使
用
h
t
m
l
s
p
e
c
i
a
l
c
h
a
r
s
过
滤
,
但
这
不
影
响
传
入
的
p
a
y
l
o
a
d
。
_GET获取callback参数,使用htmlspecialchars过滤,但这不影响传入的payload。
GET获取callback参数,使用htmlspecialchars过滤,但这不影响传入的payload。_GET[‘script’]为真时输出script标签包含的数据,payload插入里边。
但这里是一个反弹型XSS,后边还需转换成存储型XSS。
二、转换成存储型XSS漏洞
前台注册一个用户,发表一篇文章,将包含payload的URL插入里边。
发表文章前需要在后台添加一个文章栏目,这是任何一个使用该CMS的用户会需要做的事情。
添加栏目后需要刷新一下才能在前台显示栏目。
前台用户发表一篇文章。
在文章正文文字里添加超链接,或者插入一张图片插入超链接也可以。
该CMS用户发表文章后需要管理员后台审核。Payload隐藏在超链接里边,一般是不会被发现的。
最后,该漏洞成为了一个存储型XSS漏洞;任何查看该文章并点的访客都会触发该漏洞。