使用CodeQL寻找SSTI漏洞
污点追踪概述
污点追踪是指分析项目代码运行过程中可能存在安全隐患或者受污染
的数据的流动情况。
在代码自动化安全审计的理论中,有一个最核心的三元组概念,就是source
,sink
和sanitizer
- source 是指漏洞污染链条的输入点,比如获取http请求的参数部分
- sink 是指漏洞污染链条的执行点,比如SQL注入漏洞,最终执行SQL语句的函数就是sink
- sanitizer 又叫做净化函数,是指在整个漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer
回忆我们平时审计代码的过程,是否是source
和sink
同时存在,并且source
-> sink
的链路是通的,才表示当前漏洞是存在的
CodeQL中进行污点追踪
这里给出一个简易版的flask SSTI漏洞的代码
我们直接使用全局污点追踪TaintTracking::Configuration
官方文档中的模板为
我们通过isSource(DataFlow::Node source)
方法来设置source
,在一个典型的flask
应用中,思考一下我们的source
是什么。显然,作为一个web应用,source
理所当然是用户的输入,在flask
中有很多种方式获取用户的输入,例如:request.form.get('title')
或者request.values.get('name')
CodeQL
中封装的RemoteFlowSource
表示来自远程网络输入的数据流,也就是用户的网络输入,里面也包括了flask
的输入,我们直接调用即可
这里我们暂且把instanceof
理解为这种类型
的意思
上述代码的sink
在哪里呢,显然是
return render_template_string(template)
这里使用codeql中的API图进行定义
exists
子查询,是CodeQL谓词语法里非常常见的语法结构,它根据内部的子查询返回true
or false
,来决定筛选出哪些数据。
将存在render_template_string
函数调用的第一个参数作为sink
点
设置好了source
和sink
后,首尾如果能够连通,一个受污染的变量,能够流转到危险函数,才证明漏洞存在。连通工作是由CodeQL引擎本身来完成的,我们使用其中的config.hasFlow(src, sink)
方法来判断即可
整体代码如下
参考链接
- https://rmb122.com/2020/03/30/Codeql-踩坑记录/
- https://rmb122.com/2020/03/31/Codeql-踩坑记录-二/
- https://www.freebuf.com/articles/web/283795.html
- https://codeql.github.com/docs/codeql-language-guides/using-api-graphs-in-python/
- https://codeql.github.com/docs/codeql-language-guides/analyzing-data-flow-in-python/
END
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注 😃
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/15959434.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-03-03 Leetcode学习笔记(1)