问题描述:
前段时间公司提出要修复Fastjson1.2.80及以下版本, 代码执行漏洞,该漏洞允许攻击者绕过 Fastjson 中的"AutoTypeCheck"机制并实现远程代码执行这个漏洞,最简单的方法当然是升级Fastjson版本,但是升级版本之后出现了一系列新的问题,其中就包括这个,升级后的版本是2.0.0版本。
原因分析:
public static List parseArray(String text, Class clazz)方法是一个比较常用的方法,遇到问题的第一反应我没有怀疑jar包出现了问题,而是怀疑字符串里出现了某些特殊字符导致的出错,研究了好长一段时间,没有啥头绪,最后就只能看看源码了,看完源码之后我麻了呀。
以下是2.0.0版本这个方法的实现:
好家伙,我直接好家伙,直接没有实现。
顺便贴一下原先低版本1.2.32中此方法的实现
解决方案:
找到问题了,解决就相对简单了。
第一种解决方案就是不再调用此方法了,使用其他方法来达到我们的目的;
比如使用jsonlib里的方法来实现
JSONArray jsonArray = SONArray.fromObject(json);
for(int i=0;i<jsonArray.size();i++){
JSONObject job = jsonArray.getJSONObject(i);
}
第二种就是自己写一个公共方法来替代jar包里的这个方法,工作量与第二种差不了多少;
附上低版本中的方法实现,给大家参考一下:文章来源:https://uudwc.com/A/1zJq
public static <T> List<T> parseArray(String text, Class<T> clazz) {
if (text == null) {
return null;
}
List<T> list;
DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance());
JSONLexer lexer = parser.lexer;
int token = lexer.token();
if (token == JSONToken.NULL) {
lexer.nextToken();
list = null;
} else if (token == JSONToken.EOF && lexer.isBlankInput()) {
list = null;
} else {
list = new ArrayList<T>();
parser.parseArray(clazz, list);
parser.handleResovleTask(list);
}
parser.close();
return list;
}
第三种就是换jar包,简单快捷。文章来源地址https://uudwc.com/A/1zJq