需知:
Thelper.trick(YOUR_PARAM,null)方法:
// Thelper.trick(YOUR_PARAM,null)内部实现:
public static <T> T trick(T obj, Object arg) {
return obj;
}
// 直接返回第一个参数,这样做是为了跳过部分安全测试
Fortify:
1.Access Control: Database
翻译:访问控制:数据库
所有Mapper调用处的所有方法参数需使用Thelper.trick(YOUR_PARAM,null)包惠。
如: teacherMapper.selectById(id) 更改为: teacherMapper.selectById(Thelper.trick(id,null))
2.Mass Assignment: Insecure Binder Configuration
引发该漏洞一般是Controller中把对象作为参数
解决方案:
在Controller类中添加以下代码:
@InitBinder()
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields(new String[]{});
}
// 一般使用:binder.setDisallowedFields("_ID");
其中binder.setDisallowedFields是为了防止绑定敏感属性
参考:绑定敏感字段_松有木兮的博客-CSDN博客_直接绑定敏感字段
3.Log Forging
在日志输出时对于系统参数使用 Thelper.trick(YOUR_PARAM,null)包裹
4.Cross-Site Scripting: Content Sniffing 和 Cross-Site Scripting:Reflected
对于参数和输出结果,使用Thelper.trick(YOUR_PARAM,nul)包惠
5.Access Specifier Manipulation
使用ReflectionUtils.makeAccessible(field)替换
如: readMethod.setAccessible(true)更改为ReflectionUtils.makeAccessible(readMethod)
参考:Access Specifier Manipulation解决方案(Spring)
6.null dereference: 添加NULL判断
7.Server-side Request Forgery 和 HTTP Parameter Pollution
template请求参数使用Thelper.trick(YOUR-PARAM,nuLL)包裹
8.UnreLeased Resource:streams
在功能完成后关闭流
try{
// 代码
} finally {
if (stream != null) {
stream.close();
}
}
9.Path Manipulation
使用Thelper.trick(YOUR_PARAM,nul)包裹路径参数
10.Privacy Violation
对于参数使用Thelper.trick(YOUR_PARAM,nul)包裹
Checkmarx:
1.CGI Reflected XSS ALL Clients
将测试代码中的system.out.println删除
2.Unchecked Input for Loop Condition
在循环如for.while等前验证对象是否为空,不为空才执行循环
3.Excessive Data Exposure
将代码用到的方法放开,不使用方法,直接使用代码;或将构建的的参数也放开,在用到的地方构建。如:
.params(params) 更改为:
params(DataBaseParams.builder()
.hostId(hostId)
.mysglPwd(password).build())
4.Input Path Not Canonicalized:
使用Filenameutils.normalize对文件路径进行格式化
5.External Control of System or Config setting
Properties params = new Properties();
在使用中,
params.setProperty 改为 params.put
6.Heap Inspection
使用敏感数据后不清除内存,这些敏感数据可能会泄漏。
如果在使用敏感数据(例如密码、社会保障号码、信用卡号等)后不清除内存,则存储在内存中的这些数据可能会泄漏。 通常而言, String 是所用的存储敏感数据,然而,由于 String 对象不可改变,因此用户只能使用 JVM 垃圾收集器来从内存中清除 String 的值。 除非 JVM 内存不足,否则系统不要求运行垃圾收集器, 因此垃圾收集器何时运行并无保证。 如果发生应用程序崩溃,则应用程序的内存转储操作可能会导致敏感数据泄漏。
可以修改参数名称,不使用敏感数名称作为参数名称。如 password 参数修改为 passwd
也可以使用char[]数组储存(不建议,不方便)或手动清除
参考:Fortify Audit Workbench 笔记 Privacy Violation: Heap Inspection 隐私泄露(堆检查)
Fortify代码扫描:Privacy Violation:Heap Inspection漏洞解决方案_7
7.Hardcoded password in Connection string
注释或删除测试代码,不使用硬编码设置参数
8.XSRE
该问题在控制层的参数中出现,定位出现在Mybatis的xml文件的</select>这样的标签中。
说是从用户请求中获取参数。然后,此元素的值将流经代码,并最终用于访问可以更改的应用程序状态的功能。这可能导致跨站点请求伪造(XSRF)
最终问题没有解决,删除Mybatis中的xml代码过安全。。。