Inxedu系统代码审计
项目简介
因酷开源网校系统是由北京因酷时代科技有限公司以下简称(因酷教育软件)研发并推出的国内首家Java版开源网校源代码建站系统,并免费提供给非商业用途用户使用,是用户体验最好、运营功能最全、性价比最高的在线教育软件。
该项目是SSM框架
项目部署:
1.配置数据库(这里我弄的时候存在一个问题:由于Linux系统对大小写敏感,所以如果在类Unix系统上部署环境,代码中数据库中数据表的大小写会影响,建议将代码中数据表的名字都统一修改为小写)
2.配置tomcat
前台账户密码:
111111
后台账户密码:
admin
111111
-
web.xml
:程序启动时tomcat会首先加载web.xml中的配置 。通过web.xml完成DispathcheServlet的声明,并将我们的请求转发到springmvc中。我们可以首先查看web.xml中是否配置了全局过滤器。判断是否能够bypass。 -
applicationContext.xml
是spring核心配置文件,这里会加载一些其他的配置文件。 -
sping-mvc.xml
文件中主要的工作是:启动注解、扫描controller包注解;静态资源映射;视图解析(defaultViewResolver);文件上传(multipartResolver);返回消息json配置。
pom.xml
审计一套系统,可以先看看pom.xml中加载了那些组件 ,如果这些组件中本身存在漏洞,就可以直接利用这些漏洞。
思路
- 以文件上传为例,先黑盒寻找并测试文件上传功能点,抓包得到对应路由等信息,从而定位到功能实现的具体代码(代码溯源),正向然后审计其是否存在漏洞。
- 通过关键字搜索关于上传功能的代码,查看是否存在漏洞,如果存在则反向追踪代码,找到路由
关于 1 day也是类似的思路,通过网上爆出的路由或者payload(或者通过看comment)来在代码中整体搜索定位漏洞点,然后逆向追踪
前台文件上传
这里正向追踪:先黑盒寻找上传文件的接口/功能点 —>burp抓包找到接口地址—>然后去代码中寻找(全局搜索/controller层找)
登录学员账号,寻找上传点,发现头像上传功能,测试:
看到请求地址为:
去代码中搜索image/jok4
,没搜到:
没搜到原因有几种:
-
搜索时候注意:比如
image/gok4
这种两个路径可能是拼接起来的(比如controller的类有一个路径+方法上也有路径),所以可以分开去搜image
,gok4
-
这个项目中,这个路径是引入的自己打包的第三方jar包中代码中的,IDEA的搜索是无法搜索jar包里面关键字的(实际审计中,可以使用工具进行扫描有无关键字)。实际上这个项目是将处理文件上传的代码封装到了一个 Jar 包然后引用的,一般情况下如果碰到搜不到的情况,就去 pom.xml 里看看有没有声明依赖的 Jar 包
note:找到代码中接口后(如果看不懂是干啥的,可以结合数据包判断是干啥的功能)
我们定位到了代码位置:
然后继续正向往下分析代码,依次看controller层–>service层–>dao层—>mapper文件
可以定位到gok4
方法:
|
|
跟进getSuffix
中,发现其代码中除了获取文件后缀其他没什么过滤:
|
|
再结合之前抓包的url:http://127.0.0.1:8080/image/gok4?¶m=temp&fileType=jpg,gif,png,jpeg
将已知的信息串联起来,总结这段代码的判断逻辑为:文件后缀包含 jpg,gif,png,jpeg,且不为 jsp 即进行下一步上传操作。
可以看到param和fileType为代码中我们可控的
我们的思路:
- 上传一个不是jsp的且可以解析的,比如jspx,即
http://127.0.0.1:8080/image/gok4?¶m=temp&fileType=jpg,gif,png,jpeg,jspx
- 利用windows的特性,比如
::$DATA
,即http://127.0.0.1:8080/image/gok4?¶m=temp&fileType=jpg,gif,png,jpeg,jsp$$DATA
我们使用冰蝎自带的jsp测试:
成功上传:
后台文件上传
逆向追踪:先通过"在文件中查找"来搜索文件上传功能的关键字(搜索时候后缀限制为.java
),然后反向回溯功能点
文件上传关键字:
|
|
我们搜索FileUpload
,
位置com/inxedu/os/common/controller/VideoUploadController.java
看起来是一个视频上传的功能:
可以直接上传jsp
我们回溯功能点在哪里(好了,它在controller里面,不用回溯了)
可知该上传接口为:/video/uploadvideo
构造:
方法1: 找到该接口在系统中对应的位置
方法2:自己构造文件上传的表单(接口改为该接口即可)(简便)
构造表单:
|
|
抓包修改
我这里测试一直失败报服务器错误,可能是环境搭建的问题,先不管了
note:解决IDEA下debug断点进不去:
https://blog.csdn.net/xujie102360/article/details/81476774
https://blog.csdn.net/searlas/article/details/80826777
SQL注入
已知系统使用的是mybatis,mybatis最常见的注入就是错误使用${}
导致,
所以我们直接搜索${
,看看哪些是通过${}
取值并且没有过滤的
找到了一处,我们逆向追踪调用逻辑,寻找是否含有过滤并且参数我们是否可控。
daoImpl:
dao:
ctrl+单击,来到ServiceImpl:
参数为ids
,由形参articleIds
而来
也没有进行过滤
service:
往上走去找controller:传递的参数为artidArr
,也确实没有过滤
deleteArticle
方法在这里被调用:参数为前端传来的articelId
,我们可控:
可知接口为:/admin/article/delete
打开系统登录后台。找到文章管理部分,选择删除,抓包
直接将数据包放到sqlmap中跑:
可以看到这套系统中还有多处存在SQL注入漏洞:
XSS
待完成
越权漏洞
待完成