x微前台绕过鉴权执行sql分析
文章由作者授权转载:首发于奇安信攻防社区
https://forum.butian.net/share/1892
/formmodel/mobile/mec/servlet/MECAdminAction.java /formmodel/mobile/manager/MobileUserInit.java /mobile/plugin/ecology/service/AuthService.java
继续回到/formmodel/mobile/manage...
0x00 如何搜索
搜这个“public\Wclass\W\w{0,}Action”。根据这样的搜索随机漏洞,有时候会出意料之外的洞,比如这次的任意sql执行
0x01 简单说明
对登录的账号进行判断是否为admin/sysadmin账号,获取Action参数进行判断是否为getDatasBySql参数,然后直接调用getDatasBySql方法
geDatasBySql的方法是获取了http实例并获取http的sql和datasource的参数,并对这个datasource参数进行判断,当sql语句执行成功后就直接将bool参数赋值为ture,然后进行判断如果不为true的话就直接跳出回显空,否则就继续将sql返回的数据进行json数组的转换输出回显。
这时候思路应该很明了了,全局搜索这个类的路径“com.weaver.formmodel.mobile.mec.servlet.MECAdminAction”,但是这没前端代码只有js文件里面匹配到了,而且还是插件的js,但是默认是存在的,所以这个漏洞是存在的,可以构造http://127.0.0.1/mobilemode/Action.jsp?invoker=com.weaver.formmodel.mobile.mec.servlet.MECAdminAction&action=getDatasBySQL&datasource=&sql=select%20\*%20from%20SystemSet来进行访问。
0x02 流程
/formmodel/mobile/mec/servlet/MECAdminAction.java 在37行对登录的用户进行了判断是否 admin sysadmin的权限
/formmodel/mobile/manager/MobileUserInit.java 首先进行假设, 22行通过http请求获取sessionkey参数
/mobile/plugin/ecology/service/AuthService.java
在这个方法里是进行了查询userid的操作,也就是账号权限
继续回到/formmodel/mobile/manager/MobileUserInit.java 这里的①是空的 还不知道是什么直接跳过进行②步 第②步是通过http请求获取Mobilemode_UserKey参数的值并且去空格 并在第③步进行了userid的查询
/mobile/plugin/ecology/service/HrmResourceService.java 就是这里,根据id查询是否为管理员的权限
继续回到formmodel/mobile/manager/MobileUserInit.java 这里的第②就是关键点所在了,是读取了这个str的值是否等于1就进到判断里面进行管理员赋值
再次回到最初的/formmodel/mobile/mec/servlet/MECAdminAction.java 然后一直往下执行sql语句
/formmodel/mobile/mec/servlet/MECAdminAction.java#getDatasBySQL()
/conn/RecordSet.java#executeSql()
中间代码太长就不说了,有兴趣可以自己研究研究
/formmodel/mobile/mec/servlet/MECAdminAction.java#getDatasBySQL()
/conn/RecordSet.java#executeSql()
中间代码太长就不说了,有兴趣可以自己研究研究
0x03 可用利用链/调用方式
如何访问当前方法
寻找getAction 访问方式 url参数
getAction()怎么来的 这里可以自行搜索全局的"getAction"
在这里找到了一处调用的地方
最终利用:
http://127.0.0.1/mobilemode/Action.jsp?invoker=com.weaver.formmodel.mobile.mec.servlet.MECAdminAction&action=getDatasBySQL&datasource=&sql=select%20*%20from%20HrmResourceManager&noLogin=1
0x04 回顾鉴权解密
在前面的"formmodel/mobile/manager/MobileUserInit.java"地方说过 str不知道是什么
/formmodel/mobile/manager/MobileUserInit.java#getUser() 这里的userkey是url参数控制的,也就是用户可控的,那么能不能进行一个伪造key呢?
/formmodel/mobile/security/EDUtil.java#decrypt
/formmodel/mobile/MobileModeConfig.java#getSecurityKey 去寻找到他的类,并且跟进之后发现配置文件所在的地方
也就是这个文件的key值,所谓的硬偏码
/formmodel/mobile/security/EDFactory.java
回到/formmodel/mobile/security/EDUtil.java
回到/formmodel/mobile/manager/MobileUserInit.java继续重复的操作
官方补丁:
https://www.weaver.com.cn/cs/securityDownload.html?src=cn
相关文章
- 10个人9个答错,另外1个只对一半:数据库的锁,到底锁的是什么?
- (一)Mysql基础
- (二)Mysql基本操作
- (三)SQL语言基础
- (五)SQL运算符
- 数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践
- Oracle连接工具PLSQL登录时提示初始化失败,无法锁定OCI.dll错误解决
- SQL 入门篇之什么是别名?
- SQL ALTER TABLE 语句
- SQL AND & OR 运算符
- SQL BETWEEN 操作符
- MYSQL 不同的表格式,导致不同的存储空间消耗和性能差异 横向评测
- POSTGRESQL AUTO_EXPLAIN 记录慢语句的执行计划
- 一个好的数据库产品,除了本身好,细节请麻烦也注意一下
- POSTGRESQL COPY 命令导入数据,你还另一个更快的方案!
- MYSQL 8 UNDO 表空间 你了解多少
- Postgresql 如何降低 wal 占用磁盘空间,降低磁盘存储成本
- POSTGRESQL VS MYSQL 到底那个数据库 RDS 技术含量高 ?
- 经济前景不明下 2022 数据库预期与分析
- POSTGRESQL 跳动在PG内存中的锁 - spin lock