WebGoat基于SpringBoot框架

    CodeQL Java在进行数据流分析时内置了一个数据流来源:RemoteFlowSource,用来获取远端用户的输入源

    1. import java
    2. import semmle.code.java.dataflow.FlowSources
    3. from RemoteFlowSource source
    4. select source

    例如下面这些都可以通过RemoteFlowSource识别出来
    image.png
    image.png
    但是在很多真实项目中,大多数输入源RemoteFlowSource无法试别出来,例如WebGoast中下面这些
    image.png
    image.png
    下面这个是其他项目的也是无法试别出来的
    image.png
    我们用官方提供的SQL注入漏洞扫描规则来扫一下WebGoat可以看到一个也扫描不出来,有一个很大的原因就是RemoteFlowSource无法试别所有的输入点
    image.png
    手动修改一下它的代码,上面那行注释掉的是它原先的代码;除了RemoteFlowSource以外增加对@RequestParam String param的支持

    1. // override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
    2. override predicate isSource(DataFlow::Node src) {
    3. exists(Annotation ann, AnnotationType anntp|
    4. src instanceof RemoteFlowSource or (
    5. anntp.hasQualifiedName("org.springframework.web.bind.annotation", "RequestParam") and
    6. ann.getType() = anntp and
    7. src.asParameter().getAnAnnotation() = ann
    8. )
    9. )
    10. }

    image.png
    优化完以后再运行SqlTainted里面的查询语句,可以看到之前一个也扫描不出来,现在查询出来了3个SQL注入漏洞
    image.png

    ===
    From三梦师傅
    在SpringControoler.ql中增加对WebGoat的类标注的支持
    image.png