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

 

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM