【超危漏洞】ruoyi 验证码kaptcha包

【超危漏洞】ruoyi 验证码kaptcha包

【超危漏洞】ruoyi 验证码kaptcha包-一线网
【超危漏洞】ruoyi 验证码kaptcha包
此内容为付费阅读,请付费后查看
9.9
付费阅读
已售 1350

Kaptcha 安全漏洞 (版本 2.3.2)
组件: com.github.penggle:kaptcha
版本: 2.3.2
漏洞编号: CVE-2018-18531
风险等级: 超危
受影响的 JAR: [xxx.jar/BOOT-INF/lib/kaptcha-2.3.2.jar]
漏洞数据库: CNNVD-201810-1111
描述:
Kaptcha 是一个基于 SimpleCaptcha 的验证码生成工具。Kaptcha 2.3.2 版本中的多个文件存在安全漏洞,原因是程序使用了 Random 函数来生成验证码,而非更安全的 SecureRandom 函数。这可能会让远程攻击者通过暴力破解的方式绕过访问限制。

受影响的文件包括:
text/impl/DefaultTextCreator.java
text/impl/ChineseTextProducer.java
text/impl/FiveLetterFirstNameTextCreator.java
漏洞影响范围:
此漏洞影响 Maven 系统中版本大于 0 且小于等于 2.3.2 的 com.github.penggle:kaptcha 组件。

修复建议:
请修改以下文件:

将 Random rand = new Random(); 修改为 Random rand = new SecureRandom();,具体文件包括:
DefaultTextCreator.java
ChineseTextProducer.java
FiveLetterFirstNameTextCreator.java
整改步骤
删除原验证码依赖

从 pom.xml 中删除 Kaptcha 2.3.2 版本的依赖。
删除原验证码文本生成器

删除 KaptchaTextCreator.java 文件。
删除原验证码配置

删除 CaptchaConfig.java 文件。
更新验证码控制器

修改 CaptchaController 中的 /captchaImage 接口方法。
一. 修改代码
引入工具类
该工具类使用 JDK 自带的包,无需引入额外的依赖包,代码示例如下:

/**
 * 生成图片验证码工具类
 *
 * 单纯使用jdk包, 避免引入依赖存在安全漏洞
 *
 */
public class RandomValidateCodeUtil {
 
    private static String randNumString = "0123456789";//随机产生只有数字的字符串 private String
    private static String randCharString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
    private static String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
    private static int width = 65;// 图片宽
    private static int height = 25;// 图片高
    private static int lineSize = 40;// 干扰线数量
    private static int stringNum = 4;// 随机产生字符数量
    private static Random random = new Random();
 
    /**
     * 生成随机图片
     */
    public static BufferedImage getRandCode(String code) {
      // TODO

    }
 
    /**
     * 绘制字符串
     */
    private static void drawString(Graphics g, String codeSingle, int i) {
       // TODO
    }
 
    /**
     * 绘制干扰线
     */
    private static void drawLine(Graphics g) {
       // TODO
    }
 
    /**
     * 获取随机的字符
     */
    public static String getRandomString(String captchaType) { 
       // TODO
    }
 
    /**
     * 获得字体
     */
    private static Font getFont() {
        return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
    }
 
    /**
     * 获得颜色
     */
    private static Color getRandColor(int fc, int bc) {
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r, g, b);
    }
}

2. 在 Controller 中使用工具类生成验证码
控制器代码示例如下:

import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.framework.config.RandomValidateCodeUtil;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
 
/**
 * 验证码操作处理
 * 
 */
@RestController
public class CaptchaController {
    @Autowired
    private RedisCache redisCache;
    
    @Autowired
    private ISysConfigService configService;
    /**
     * 生成验证码
     */
    @GetMapping("/captchaImage")
    public AjaxResult getCode(HttpServletResponse response) throws IOException {
        AjaxResult ajax = AjaxResult.success();
        // 判断系统的验证码的开关,false就没必要走生成验证码逻辑了
        boolean captchaOnOff = configService.selectCaptchaOnOff();
        ajax.put("captchaOnOff", captchaOnOff);
        if (!captchaOnOff) {
            return ajax;
        }
 
        // 保存验证码信息
        String uuid = IdUtils.simpleUUID();
        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
 
        String capStr = null, code = null;
        BufferedImage image = null;
        // 获取系统验证类型:纯数字、纯英文、数字+英文
        String captchaType = RuoYiConfig.getCaptchaType();
        // 获取验证码值
        code = RandomValidateCodeUtil.getRandomString(captchaType);
        // 获取验证码图片
        image = RandomValidateCodeUtil.getRandCode(code);
        // 将验证码放入redis中
        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // 转换流信息写出
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try {
            ImageIO.write(image, "jpg", os);
        } catch (IOException e) {
            return AjaxResult.error(e.getMessage());
        }
 
        ajax.put("uuid", uuid);
        ajax.put("img", Base64.encode(os.toByteArray()));
        return ajax;
    }
}
3. 请求结果

{
    "msg": "操作成功",
    "img": "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",
    "code": 200,
    "captchaOnOff": true,
    "uuid": "e9d46b960c1d4f0aa215c1a765641bfe"
}
图形验证码: 


漏洞修复代码, 阿里云盘资源下载

© 版权声明
THE END
喜欢就支持一下吧
点赞1966打赏支持 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    请登录后查看评论内容