前言
最近学了一下codeql,刚好拿这个来练一下手。简单记录一下,有疑问的师傅可以一起探讨。大佬们都还沉浸在log4j的世界里,可是俺还在卷grafana。写的比较简单,适合有基础的师傅。
数据库
先从lgtm把数据库下下来,发现洞已经被修。
https://lgtm.com/projects/g/grafana/grafana/ci/#ql


既然如此,只能自己编译了。
codeql database create /Users/safe6/codeql/database/gf --language="go" --source-root=/Users/safe6/Desktop/grafana-8.2.6 --overwrite
编译好的库,我已经放在最后了,需要的师傅自取。
分析数据流
各位大佬已经把sink分析好了,我们直接来找os.open的全部引用即可。


居然有50多个,我们先不管。也不知道能不能挖出新的洞 。
接来下开始找source。
进到关键类,可以看到有很多种方法,可以用了注册各种类型的路由。


把这当source,简单的查一下,查出来300多个api接口

随便点一个进去,发现符合预期

尝试污点跟踪
下面开始尝试污点跟踪
定义source

定义Sink


定义isAdditionalTaintStep


尝试跑了一下并没有结果

再次尝试污点跟踪
再各种尝试之后,还是无法解决。于是找了三梦师傅,请教一下。
热心的三梦师傅,直接开撸。

经过三梦师傅,指点后,改造了一下source。


再次查询,这次有了结果。可是我们想要的并没有在里面


回过头看看,发现这个api的路由用到了*,然后在具体方法里面用Params进行获取参数



那么我们需要继续加个isAdditionalTaintStep,把在这里断掉的数据流接上。
经过各种查资料发现赋值语句可以满足需求,赋值语句具体的Examples如下

最后写出来的isAdditionalTaintStep如下

再来看看结果,成功了!!!!!


最后
Codeql资料真挺少的,全靠官方文档续命。
最后还是要感谢三梦师傅,在我学习codeql给到的帮助。
代码放在:https://github.com/safe6Sec/codeql-grafana
正在整理的一点笔记https://github.com/safe6Sec/CodeqlNote