项目地址:
https://github.com/jishenghua/jshERP/releases/tag/2.3所需工具:
IntelliJ IDEA
小皮面板(phpstudy)
Navicat
JDK 1.8
MySQL 5.7.26
Maven 3.9.1环境搭建:
使用小皮面板创建并开启数据库,然后使用Navicat打开并连接数据库,然后直接右键选择运行SQL文件,选择JSH_ERP-v2.3\JSH_ERP-v2.3\docs\jsh_erp.sql,点击确认运行即可

然后打开IDEA,修改配置信息src/main/resources/application.properties,可能需要修改数据库的配置信息

完成修改之后,确保IDEA的环境是JDK 1.8,并且存在Maven环境,然后先clean再install。

等待下载完成后,选择ErpApplication.java 启动项目即可

漏洞挖掘
0x01 新增用户默认密码
JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\constants\BusinessConstants.java项目在源代码文件中存在一个常量声明,定义了一个用于存储用户默认密码的常量
public static final String USER_DEFAULT_PASSWORD = "123456";
0x02 Swagger 未授权访问漏洞
JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\config\Swagger2Config.java项目在源代码中写明了Springfox Swagger的配置,用于自动生成 RESTful API 文档

并且在LogCostFilter.java源码中,对/v2/api-docs路径进行加白策略。
JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\filter\LogCostFilter.java
根据以上的代码审计我们就能构造paload了
http://127.0.0.1:33333//v2/api-docs
在filter文件中的LogConstFilter文件,该文件主要是允许静态资源和特定API直接访问,无需登录。
JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\filter\LogCostFilter.java
从源码分析过滤器不拦截文件路径是
.css .js .jpg .png .gif .ico不拦截的路径是
/user/login /user/registerUser /v2/api-docs那我们根据源码逻辑就能进行payload构造了,大概有两种方法进行过滤,一种是静态资源则直接放行
http://127.0.0.1:33333/user/getAllList;.js
另一种就是遇到特定的url不鉴权直接放行
http://127.0.0.1:33333/v2/api-docs/../../user/getAllList

存储型XSS攻击成功

0x05 MD5硬编码加密登录密码 登录的时候使用硬编码加密,并且没有登录限制问题,我们可以使用MD5加密进行爆破操作。 JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\service\user\UserService.java

0x06 垂直越权 这里以用户删除传参deleteUser为例。 \JSH_ERP-v2.3\JSH_ERP-v2.3\src\main\java\com\jsh\erp\service\user\UserService.java

Ctrl+B跟踪方法batDeleteUser,这个方法的主要逻辑就是先记录日志,然后ID参数处理,最后执行批量删除,没有进行身份权限校验。

然后你会发现基本上所有进行ids传参的地方都没加入身份校验。然后再通过跟踪其他的数据获取方法发现,基本全都没有进行权限校验,只要变更cookie全都能进行越权操作。 0x07 SQL注入 看一下pom.xml文件中发现该框架使用的是Mybits的数据库 JSH_ERP-v2.3\JSH_ERP-v2.3\pom.xml

全局搜索{,(因为mybatis中#{是会经过预编译再执行的,而{则不会,很有可能存在漏洞),发现了大量使用

发现很多参数都进行拼接传参

进行追踪selectByConditionLog

发现传入了不少参数

然后我们继续跟踪selectByConditionLog,不断的ctrl+B进行方法追踪

继续追踪select

继续追踪getLogList

跟到了功能层,你多跟踪几个${,你就会发现最后都会到这个位置,那这个方法是什么逻辑呢?请求路径/{apiName}/list,{apiName}是动态路径变量,接下来就很简单了,找我们跟踪传参的list的路径看看如何传参的。

看一下传参的参数是不是和我们追踪的这个方法的参数是不是一样的

进行url解码

传参是这样的,然后回到IDEA的命令行上看一下具体的语句是怎么写的。

然后我们就可以开始试SQL注入了 /log/list?search=%7b%22operation%22%3a%22%22%2c%22userId%22%3a%22%22%2c%22clientIp%22%3a%22%22%2c%22status%22%3a%22%22%2c%22beginTime%22%3a%22%22%2c%22endTime%22%3a%22%22%2c%22content%22%3a%22test%27+AND+SLEEP(5)--%22%7d¤tPage=1&pageSize=10 可以进行延时注入

有很多sql注入的地方不止这一个点,其他的思路大概也是这样的 0x07 Fastjson反序列化 从pom.xml文件中看依赖,fastjson版本为1.2.55,该版本存在反序列漏洞

我们可以百度一下,看一看Fastjson反序列化过程中调用的方法,JSON.parseObject、JSON.parse、JSON.parseArray。我们全局搜索一下这几个方法,我们能看到有不少。

我们随便点进去一个,看看是否可控,这里以MaterialController.java文件中的 JSONObject obj=JSON.parseObject(search);为例。

这里看一下search是否是可控的,我们在上面做sql注入的时候看到过这个参数,证明是可控的。找到具体的位置 /material/getMaterialEnableSerialNumberList?search=%7B%22name%22%3A%22%22%2C%22model%22%3A%22%22%7D¤tPage=1&pageSize=10


之后我们只要构造search的参数就行 {"@type":"java.net.Inet4Address","val":xxx.dnslog.cn"}

