WebGoat基于SpringBoot框架
CodeQL Java在进行数据流分析时内置了一个数据流来源:RemoteFlowSource,用来获取远端用户的输入源
import java
import semmle.code.java.dataflow.FlowSources
from RemoteFlowSource source
select source
例如下面这些都可以通过RemoteFlowSource识别出来
但是在很多真实项目中,大多数输入源RemoteFlowSource无法试别出来,例如WebGoast中下面这些
下面这个是其他项目的也是无法试别出来的
我们用官方提供的SQL注入漏洞扫描规则来扫一下WebGoat可以看到一个也扫描不出来,有一个很大的原因就是RemoteFlowSource无法试别所有的输入点
手动修改一下它的代码,上面那行注释掉的是它原先的代码;除了RemoteFlowSource以外增加对@RequestParam String param的支持
// override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
override predicate isSource(DataFlow::Node src) {
exists(Annotation ann, AnnotationType anntp|
src instanceof RemoteFlowSource or (
anntp.hasQualifiedName("org.springframework.web.bind.annotation", "RequestParam") and
ann.getType() = anntp and
src.asParameter().getAnAnnotation() = ann
)
)
}
优化完以后再运行SqlTainted里面的查询语句,可以看到之前一个也扫描不出来,现在查询出来了3个SQL注入漏洞
===
From三梦师傅
在SpringControoler.ql中增加对WebGoat的类标注的支持