freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【java审计】inxedu cms 漏洞详细分析
m0s30 2022-07-14 16:29:17 395591
所属地 广东省

一、cms简介:

因酷开源在线网校系统是由北京因酷时代科技有限公司研发并推出的国内首家Java版开源网校源代码建站系统。

本文是inxedu cms 漏洞分析学习的第一篇,将围绕存储型xss漏洞、文件上传漏洞进行分析学习,大纲:

1、环境搭建
2、存储型xss漏洞分析
3、文件上传漏洞分析

二、环境搭建:

1、下载源码(v2.0.6),使用idea导入

1657785890_62cfce228ae47019d30e1.png!small

然后更改配置文件:

1657785962_62cfce6ab723992c360f4.png!small?1657785961842

配置tomcat:

1657785971_62cfce737266245a0fdbe.png!small?1657785970635

1657785982_62cfce7e5510eb11a1bb1.png!small?1657785981434

然后run运行

1657785990_62cfce860514bf541dc7a.png!small?1657785989557

三、漏洞分析

①存储型xss:

先黑盒测试可能存在漏洞的功能点,这里以提问列表为例(有可能管理员在后台能看到提问的内容,可尝试打管理员的cookie)

1、首先来看插入数据库的过程,是否有什么过滤

1657786229_62cfcf750056b8ccdf3ab.png!small?1657786228189

抓包查看请求的路由:/questions/ajax/add

1657786275_62cfcfa33ce2d08e9b8d8.png!small?1657786274651

利用idea快捷键,直接全局搜索路由关键字:

1657786320_62cfcfd00ae8f9730fa5c.png!small?1657786319273

定位到控制器QuestionsController.java:

看到addQuestions()方法,接收的传参的为Questions类,然后判断用户是否登录,所以需要一个普通用户的权限,然后就调用了sevice层中的addQuestions()方法

1657786345_62cfcfe991a379e3effe4.png!small?1657786345110

查看Questions类的属性中有哪些是String类型的,可以尝试在这些属性中插入xss payload

1657786376_62cfd00833928244d1e82.png!small?1657786375293

跟进addQuestions()方法:QuestionsService.java

1657786400_62cfd020f21265ef80789.png!small?1657786400104

查看QuestionsService的实现类:

这个过程也没有对传参进行过滤,所以我们继续跟进dao层,看具体插入数据库的语句操作

1657786421_62cfd0355117032420b57.png!small?1657786420428

dao层实现类:

这里根据insert中的关键字,找到对应mapper进行查看createQuestions

1657786436_62cfd044d896ae3e1810d.png!small?1657786435998

QuestionsMapper.xml:

这里对edu_questions表插入数据

1657786454_62cfd0566c89293b1c41b.png!small?1657786453555

具体字段如下:

1657786467_62cfd063d8bc6cac0cfa6.png!small?1657786467268

演示:

添加问答:

1657786488_62cfd07894de30f612da4.png!small?1657786487721

查看数据库的内容,xss payload已经被成功插入了:

1657786509_62cfd08d50ae21987f0fc.png!small?1657786508476

到此为止,添加问答的过程就分析完成了,对用户的提交的传参是没有进行任何的过滤然后直接调用对应的方法将内容直接插入到数据库中edu_questions表进行存储,那么接下来我们来看一下哪些地方对edu_questions表的内容进行查询且输出展示,如果输出展示的过程也没有进行任何限制,那么一枚存储型xss就产生了

2、然后来看输出展示的过程

在访问前台问答展示列表时,刚刚插入的xss payload被触发了

1657786550_62cfd0b6c263ccd5ce3a6.png!small?1657786550148

全局搜索路由/questions/list:

这里找到了两个路由,分别来自两个不用的控制器,根据名称来看,AdminQuestionsController更能吸引人,应该属于后台控制器,所以直接来看它

1657786570_62cfd0ca08a8ce231412c.png!small?1657786569204

跟进AdminQuestionsController:

getQuestionsList()方法中,首先设置了ModelAndView,待会再看具体的模板路径,然后调用了service层的getQuestionsList()方法进行数据的查询:

1657786597_62cfd0e569ca30bf90149.png!small?1657786596711

跟进getQuestionsList()方法和其实现类:

1657786719_62cfd15f1fc690b9d754c.png!small?1657786718268

跟进dao层实现类:

这里根据关键字,找到对应mapper进行查看

1657786731_62cfd16bd37cc0e3ca943.png!small?1657786731037

QuestionsMapper.xml:

这里对edu_questions表的数据进行查询,具体的sql语句定义如下

1657786747_62cfd17bbaeebd02b9d70.png!small?1657786746975

那么我们回到controller中查询模板的赋值展示过程:

然后添加questionsList(就是从数据库中查询到的内容)到共享域中,在模板中用于输出

1657786762_62cfd18a5ea93b083adab.png!small?1657786761598

questionslist的值:

1657786784_62cfd1a071c72e32eb661.png!small?1657786783556

定位到具体的jsp文件:\view\inxedu\admin\questions\questions_list.jsp

这里使用foreach对questionslist进行遍历,看到一个<td>标签中对title字段进行了输出,最终成功触发了xss payload

1657786801_62cfd1b12dc815d310ae0.png!small?1657786800416

到后台功能中进行查看验证:

后台查看问答列表的功能中成功触发了xss弹窗,所以这个存储型xss不仅能打前台普通用户,还可以打后台管理员

1657786817_62cfd1c1b35355d9e8553.png!small?1657786816982

②文件上传漏洞分析

漏洞点:common/controller/VideoUploadController.java

在gok4()方法中,这里使用的是springmvc的方式进行文件上传,方法中接收了几个传参,fileType参数(允许的文件后缀)、param参数(文件路径),然后以逗号分割为数组赋值为type,然后传入setFileTypeList()方法,这里其实不重要,先略过

接着往后看,这里获取上传文件的后缀名,然后对和传入的fileType参数使用contains()进行比较(判断传入的fileType中是否包含指定的后缀名字符ext),如果包含则返回true,然后使用!取反,所以传入的fileType要包含ext,否则就会return错误

1657786884_62cfd204ee94255677d3b.png!small?1657786884251

然后会进行文件路径的获取,跟进一下getPath()方法,首先定义了filePath参数,然后判断param如果不为null,且去除空格后长度大于0的话就拼接上param作为路径,否则就是项目绝对路径加上filePath,最后使用年月日的命名拼接完整的文件路径,又因为param参数是可控的,所以文件的上传路径可以使用../跨目录进行上传

1657786902_62cfd216958fffad9eef9.png!small?1657786901816

分析完文件路径的命名方式,然后回到上传点,获取完文件路径后,如果不存在会进行目录创建,然后直接使用transferTo()进行上传,所以整个上传过程只是对fileTpye参数进行判断而已,但是fileType是我们可控的,只需要传入的fileType中包含上传文件的后缀名即可,最后还会对文件路径进行回显

1657786918_62cfd226137112233ef42.png!small?1657786917161

上传数据包:

1657786931_62cfd233f111c054f12b0.png!small?1657786931277

连接webshell:

1657786947_62cfd2430d2ae1415a3ea.png!small?1657786946167

本文对漏洞的成因和触发的过程进行详细的分析和跟进,文笔浅显,如有错误欢迎评论区指出。

# Java代码审计 # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 m0s30 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
m0s30 LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 1 关注者
文章目录