1.已解密的登录请求

推理: AppScan 识别了不是通过 SSL 发送的登录请求。
测试请求和响应:

1.1.1 产生的原因

登录接口,前端传入的密码参数没有经过md5的加密就直接传给了后端

1.1.2 解决方法

前端代码传参的时候做md5加密处理

2.会话标识未更新

推理: 测试结果似乎指示存在脆弱性,因为“原始请求”和“响应”中的会话标识相同。这些标志应该已在响
应中更新。
测试请求和响应:

2.1.2 产生原因

会话标识未更新漏洞,在用户进入登录页面,但还未登录时,就已经产生了一个session,用户输入信息,登录以后,session的id不会改变,也就是说没有建立新session,原来的session也没有被销毁), 可能会窃取或操纵客户会话和cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。
 
2.1.3 解决方法
如果用的是shiro框架,使用 shiro自己提供的api方法 SecurityUtils.getSubject().logout(); 在登录验证时生成新的session

3.“Content-Security-Policy”,“X-Content-Type-Options”,“X-Content-Type-Options”头缺失或不安全

推理: AppScan 检测到 Content-Security-Policy 响应头缺失或具有不安全策略,这可能会更大程度地暴露于各种跨站点注入攻击之下
 

推理: AppScan 检测到“X-Content-Type-Options”响应头缺失或具有不安全值,这可能会更大程度地暴露
于偷渡式下载攻击之下
 

推理: AppScan 检测到 X-XSS-Protection 响应头缺失或具有不安全值,这可能会造成跨站点脚本编制攻击

3.1.1 产生原因

nginx.conf配置里没有添加对应的请求头

3.1.2 解决方法

nginx.conf里配置缺失的请求头

4.垂直越权

4.1.1 漏洞分析

登录测试账号test并分析下列JS代码:js/app.eb5ecba8.js
可获取若干隐藏配置菜单:

发现通过访问上述对应menuAction即可实现越权:
 
4.1.2.风险分析
攻击者可基于低权限账户获取高权限账户的模块权限。
 
4.1.3.风险等级
 
4.1.4.安全建议
对相关menuAction对应的接口完善鉴权。
 
4.1.4.问题复现
1)浏览器打开F12,找到vue.js中配置的一些项目接口的路由
2)登录低权限test账号,然后在地址栏中直接访问vue.js中的某个路由地址,例如:http://221.***.**.50:58000/#/earlyReport 前提条件是该接口的是test用户不具有访问权限的一个模块中的接口
3)结果是在浏览器能够直接访问接口所在的页面,并能访问数据
 
4.1.5.什么是垂直越权
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞 ,简单来说就是低权限用户能访问高权限用户,就是垂直越权
 
4.1.6.解决方法
采用AOP,切每个接口,对每个接口做权限校验;自定义一个注解,加在需要控制权限的接口方法上,并且设置这个接口的权限角色。然后通过AOP,切点就是这个自定义注解的方法,前置通知把方法拦截后,先拿到当前登录用户的角色,再拿到自定义注解中该方法的权限角色,根据这些判断当前登录用户有没有权限调用这个接口。如果有权限请求正常继续往下走,如果没有权限抛出异常,代码如下:
 
自定义注解类:
 1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 public @interface SecurityAuth {
4
5 /**
6 * 拥有权限的角色名
7 * @retuen
8 */
9 String roleName();
10 }
AOP切点类:
 1 @Aspect
2 @Component
3 public class SecurityAspect {
4
5 @Autowired
6 private SysRoleUserService sysRoleUserService;
7
8 /**
9 * 自定义注解切点
10 */
11 @Pointcut("@annotation(com.broadu.modules.filter.SecurityAuth)")
12 public void annotationAspect(){}
13
14 /**
15 * 前置通知
16 */
17 @Around("annotationAspect()")
18 public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {
19 // 拿到响应
20 HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
21 // 拿到当前登录用户
22 UserDetail user = SecurityUser.getUser();
23 if(null == user){
24 // 未登录
25 throw new RenException(ErrorCode.ACCOUNT_NOT_EXIST,"该用户不存在");
26 }
27 // 从切面织入点处通过反射机制获取织入点处的方法
28 MethodSignature signature = (MethodSignature) joinPoint.getSignature();
29 // 获取切入点所在的方法
30 Method method = signature.getMethod();
31 // 获取注解
32 SecurityAuth auth = method.getAnnotation(SecurityAuth.class);
33 // 获取该方法使用的角色
34 String roleNames = auth.roleName();
35 // 获取该用户的角色列表
36 if(ObjectUtil.notEqual(user.getSuperAdmin(),1)){
37 List<String> roleList = sysRoleUserService.getRoleNameList(user.getId());
38 List<String> list = new ArrayList<>();
39 if(null != roleList && roleList.size() > 0){
40 String[] roleName = roleNames.split(",");
41 for (String str : roleName) {
42 for (String s : roleList){
43 if(ObjectUtil.equal(str,s)){
44 list.add(s);
45 break;
46 }
47 }
48 }
49 if(list.size() == 0){
50 // 没有权限
51 throw new RenException(ErrorCode.ACCOUNT_NOT_PERMISSION,"该用户无权限访问");
52 }
53 }
54 }
55 // 有权限
56 return joinPoint.proceed();
57 }
58
59 }
Controller类:
 1 @RestController
2 @Slf4j
3 @RequestMapping("/ftpConfiguration")
4 public class FtpConfigurationController {
5
6 @Autowired
7 FtpConfigurationService ftpConfigurationService;
8
9 @Autowired
10 FactorService factorService;
11
12 @SecurityAuth(roleName = "用户角色")
13 @GetMapping("/page")
14 @ApiOperation("统计报表")
15 public Result<PageData<FtpConfigurationDto>> page(@ApiIgnore @RequestParam Map<String, Object> params) {
16 PageData<FtpConfigurationDto> page = ftpConfigurationService.page(params);
17 List<FtpConfigurationDto> list = page.getList();
18 // 用户密码md5加密
19 list.forEach(item ->{
20 try {
21 item.setPassword(DigestUtils.md5Hex(item.getPassword()));
22 } catch (Exception e) {
23 log.info("加密异常信息:{}"+e.getMessage());
24 }
25 });
26 page.setList(list);
27 return new Result<PageData<FtpConfigurationDto>>().ok(page);
28 }
 
前端也对代码做了相关的权限校验

静态路由绑定按钮跳转:

4.1.7.验证是否修复成功
先用不是用户角色的用户登录系统后,然后直接在浏览器地址输入“分页查询用户列表”的url,查看页面上是否有数据返回。如果有,则说明漏洞没修复成功;如果没有,则修复成功。

Web安全漏洞解决方案的更多相关文章

  1. Java WEB安全问题及解决方案

    1.弱口令漏洞   解决方案:最好使用至少6位的数字.字母及特殊字符组合作为密码.数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密.   ...

  2. 针对需要使用T3协议的Weblogic2628漏洞解决方案

    针对需要使用T3协议的Weblogic2628漏洞解决方案 前几天用户的服务器中检查到了Weblogic2628l漏洞,并且打过Oracle官方补丁后还是能检测到. 针对此问题,去网上查找了一些资料. ...

  3. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...

  4. Web安全漏洞深入分析及其安全编码

    摘自:http://blog.nsfocus.net/web-vulnerability-analysis-coding-security/ 超全Web漏洞详解及其对应的安全编码规则,包括:SQL注入 ...

  5. 基于 burpsuite的web逻辑漏洞插件开发(来自JSRC安全小课堂,柏山师傅)

    基于 burpsuite的web逻辑漏洞插件开发 BurpSuite 提供了插件开发接口,支持Java.Python.Ruby语言的扩展.虽然 BApp Store 上面已经提供了很多插件,其中也不乏 ...

  6. 【OWASP TOP10】2021年常见web安全漏洞TOP10排行

    [2021]常见web安全漏洞TOP10排行 应用程序安全风险 攻击者可以通过应用程序中许多的不同的路径方式去危害企业业务.每种路径方法都代表了一种风险,这些风险都值得关注. 什么是 OWASP TO ...

  7. [web安全]Web应用漏洞攻击分析与防范

    网站攻击主要分为以下几类: (1) sql注入攻击 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.它是利 ...

  8. 宣布发布 Windows Azure 导入/导出服务的预览版以及 Web 和移动解决方案场景的若干增强功能

    客户评估基于云的存储解决方案时,面临的挑战之一是以经济高效.安全快速的方式从 Blob 存储区移进和移出大量数据.今天,我们很高兴地宣布发布 Windows Azure 导入/导出的预览版,这款新服务 ...

  9. 基于Web的漏洞利用

    1.Nikto 基于Web的漏洞信息扫描 nikto 自动扫描web服务器上没有打补丁的软件,同时同时也检测驻留在服务器上的危险文件,nikto能够识别出特定的问题,检测服务器的配置问题, 检测某台主 ...

  10. ​Web安全测试解决方案

    Web安全测试解决方案 介绍常见的Web安全风险,Web安全测试方法.测试基本理论和测试过程中的工具引入

随机推荐

  1. 2021-09-20:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O

    2021-09-20:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O ...

  2. Linux 内存管理 pt.3

    哈喽大家好,我是咸鱼 在<Linux 内存管理 pt.2>中我们学习了多级页表和大页,我们知道了由于历史遗留的问题,Linux 的页通常为 4KB 这样就会导致一个页表里面会有特别多页,为 ...

  3. ODOO升级模块后到系统进入不了,报错500

    有时候安装后者升级odoo相关模块后会导致系统进入不了,报错500,此时我们可以通过Odoo命令行卸载相关模块 此方法适用于在安装或升级某个模块后导致崩库,进不去桌面的情况下使用.原理是通过odoo- ...

  4. Java如何实现去重?这是在炫技吗?

    大家好,我3y啊.由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧.austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重. Java开源 ...

  5. CANoe _ Panel面板的创建过程

    在Canoe中创建Panel面板,用于显示和操作CAN网络的数据和信号,遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.打开项目 在Canoe的菜单栏中,选择"File&quo ...

  6. Intellij IDEA 插件开发

    写在前面 很多idea插件文档更多的是介绍如何创建一个简单的idea插件,本篇文章从开发环境.demo.生态组件.添加依赖包.源码解读.网络请求.渲染数据.页面交互等方面介绍,是一篇能够满足基本的插件 ...

  7. windows安全中心打不开

    解决win11打不开安全中心的问题!!! 许多用户在最近都升级了Windows11系统,而且不少用户最近在使用Win11的时候发现自己打不开Windows安全中心 操作方法: 管理员权限打开Power ...

  8. 如何让一句话木马绕过waf ?

    一.什么是一句话木马? 一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能.为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令. ...

  9. SQL SERVER 基础使用技巧

    1 .编写目的 本人总结了一些实际使用中常常因为疏忽大意而出现各种意想不到的问题,本文档总结相关经验(有些并未得到验证),便于交流学习. 1 基础 1.1 char.varchar.nchar.nva ...

  10. tcpdump 常用命令

    最后更新时间 2021-10-05. Linux 的命令太多,tcpdump 是一个非常强大的抓包命令. 有时候想看线上发生的一些问题: nginx 有没有客户端连接过来-- 客户端连接过来的时候 P ...