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
请登录后查看评论内容