• web安全渗透扫描已解密的登录请求


    keyword:web渗透检测,安全检测,AppScan

    web渗透检测   渗透的本质是漏洞。web渗透检测也即web漏洞检测。

    AppScan安全扫描报告

    如下是问题类型为“已解密的登陆请求”中提到的问题-详情

    改造方案:

    服务端添加获取加密秘钥的接口:/getLoginSignKey。

    前端在调用登陆接口时,先调用 /getLoginSignKey 接口,获取加密key,对用户登陆密码进行加密。然后,调用登陆接口时,上送加密后的用户密码参数。

    服务端登陆接口在获取到登陆请求参数时,先对密码做解密,再执行原有验证逻辑。

    改造代码:

    /getLoginSignKey 接口

        private static final String LOGIN_SIGN_KEY_CACHE = "loginSignKeyCache:";
    
        // 获取登录签名key
        @RequestMapping(value = "/getLoginSignKey", method = RequestMethod.POST)
        public Result<String> getLoginSignKey(@RequestBody SysLoginModel sysLoginModel) throws Exception {
            String cacheKey = LOGIN_SIGN_KEY_CACHE + sysLoginModel.getUsername();
    
            Object signCache = redisUtil.get(cacheKey);
    
            if (ObjectUtil.isNotNull(signCache)) {
                return Result.successWithMsg(signCache.toString());
            }
    
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            // 初始化密钥对生成器,密钥大小为96-1024位
            keyPairGen.initialize(1024, new SecureRandom());
            // 生成一个密钥对,保存在keyPair中
            KeyPair keyPair = keyPairGen.generateKeyPair();
            // 得到公钥字符串
            String publicKeyString = com.emax.zhenghe.common.util.Base64.encode(keyPair.getPublic().getEncoded());
            // 得到私钥字符串
            String privateKeyString = Base64.encode(keyPair.getPrivate().getEncoded());
    
            redisUtil.set(cacheKey, privateKeyString, 7 * 24 * 60 * 60); //7天有效
    
            return Result.successWithMsg(publicKeyString);
        }

    登陆接口改造

        // 登录接口
        @RequestMapping(value = "/login", method = RequestMethod.POST)
        public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) {
            Result<JSONObject> result = new Result<JSONObject>();
            String username = sysLoginModel.getUsername();
            String password = "";
            log.info("用户登陆--系统登录--/sys/login--username={}", username);
    
            // 设置登录次数限制
            Result loginLimitResult = loginLimitValidate(sysLoginModel.getUsername());
            if (!loginLimitResult.isSuccess()) return loginLimitResult;
    
            //密码加密验签:
            String signCacheKey = LOGIN_SIGN_KEY_CACHE + sysLoginModel.getUsername();
            Object signPrivateKeyCache = redisUtil.get(signCacheKey);
    
            if (ObjectUtil.isNull(signPrivateKeyCache)) {
                result.error500("非法请求!");
                return result;
            }
    
            try {
                password = new String(RSAUtils.decryptByPrivateKey(Base64.decode(sysLoginModel.getPassword()), signPrivateKeyCache.toString()));
            } catch (Exception e) {
                log.info("login--username={},解密失败", sysLoginModel.getUsername());
                result.error500("非法请求!");
                return result;
            }
            
            ..... 原有登陆逻辑
        }

     前端页面请求的网络调用:

    根据登陆用户去拿key

     

    调用登陆接口,密码是加密后的密文

  • 相关阅读:
    自学Python编程的第二天----------来自苦逼的转行人
    自学Python编程的第一天----------来自苦逼的转行人
    A-B 高精度
    A+B 高精度
    [NOI2002]银河英雄传说
    口袋的天空
    修复公路(并查集)
    并查集
    Surjectivity is stable under base change
    为什么Fourier分析?
  • 原文地址:https://www.cnblogs.com/buguge/p/16167320.html
Copyright © 2020-2023  润新知