InQL v5技术深度解析:GraphQL安全测试工具全面升级

本文深入解析InQL v5的重大升级,涵盖从Jython到Kotlin的技术迁移、GQLSpection核心引擎、兴趣点扫描、增强日志记录和内联注解等新功能,为渗透测试人员提供更强大的GraphQL安全测试能力。

InQL v5: 技术深度解析

我们很高兴向大家展示我们广泛使用的Burp Suite扩展的最新版本 - InQL。版本5引入了显著的增强和升级,巩固了其作为渗透测试人员和漏洞赏金猎人不可或缺工具的地位。

引言

网络安全格局处于不断变化的状态。随着GraphQL采用率的激增,对适应性强、有弹性的测试工具的需求变得至关重要。作为GraphQL安全领域的领导者,Doyensec自豪地发布我们开源测试工具的最新版本 - InQL v5.x。这不仅仅是一个更新;这是一个全面的改进,旨在增强您的GraphQL测试能力。

发展历程:从Jython到Kotlin

我们与InQL的旅程始于Jython平台。然而,随着时间的推移,我们开始体验到Jython的局限性 - 主要是缺乏对Python 3的支持,这使得寻找兼容的工具和库变得越来越困难。显然需要进行转型。经过仔细考虑,我们选择了Kotlin。它不仅与Java(Burp的编写语言)兼容,而且还提供了健壮性、灵活性和活跃的开发人员社区。

将Burp扩展转换为Kotlin的挑战

我们选择在Kotlin扩展中包含完整的Jython运行时(超过40 MB),以克服重用现有Jython代码的挑战。虽然这不是理想的解决方案,但这种方法使我们能够以Kotlin启动扩展,启动Jython解释器,并将执行委托给较旧的Jython代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class BurpExtender: IBurpExtender, IExtensionStateListener, BurpExtension {

    private var legacyApi: IBurpExtenderCallbacks? = null
    private var montoya: MontoyaApi? = null

    private var jython: PythonInterpreter? = null
    private var pythonPlugin: PyObject? = null

    // 传统API首先实例化
    override fun registerExtenderCallbacks(callbacks: IBurpExtenderCallbacks) {

        // 保存传统API用于仍依赖它的功能
        legacyApi = callbacks

        // 启动嵌入式Python解释器会话(Jython)
        jython = PythonInterpreter()
    }

    // Montoya API第二个实例化
    override fun initialize(montoyaApi: MontoyaApi) {
        // InQL中的所有新功能都应使用新的Montoya API
        montoya = montoyaApi

        // 设置扩展名称
        montoya!!.extension().setName("InQL")

        // 实例化传统Python插件
        pythonPlugin = legacyPythonPlugin()

        // 将执行传递给传统Python代码
        pythonPlugin!!.invoke("registerExtenderCallbacks")
    }

    private fun legacyPythonPlugin(): PyObject {
        // 确保默认使用UTF-8
        jython!!.exec("import sys; reload(sys); sys.setdefaultencoding('UTF8')")

        // 将从Burp接收的回调作为全局变量传递给Python插件
        jython!!.set("callbacks", legacyApi)
        jython!!.set("montoya", montoya)

        // 实例化传统Python插件
        jython!!.exec("from inql.extender import BurpExtenderPython")
        val legacyPlugin: PyObject = jython!!.eval("BurpExtenderPython(callbacks, montoya)")

        // 在全局变量被使用后删除
        jython!!.exec("del callbacks, montoya")

        return legacyPlugin
    }

避开stickytape的需求

我们转向Kotlin也解决了另一个问题。Burp Suite中的Jython扩展通常是单个.py文件,但InQL的复杂性需要多文件布局。以前,我们使用stickytape库将Python代码压缩成单个文件。然而,stickytape引入了细微的错误并禁止访问静态文件。通过使InQL成为Kotlin扩展,我们现在可以将所有文件打包到JAR中并正确访问它们。

介绍GQLSpection:InQL v5.x的核心

在我们转型旅程中的一个重要里程碑涉及重构处理GraphQL模式解析的InQL核心部分。结果是GQLSpection - 一个与Python 2/3和Jython兼容的独立库,具有方便的CLI接口。

我们已在测试用例中包含了GraphQL规范中的所有GraphQL代码示例,确保全面覆盖。

作为一个额外的优势,它还取代了以前InQL版本的独立和CLI模式,这些模式已被移除以简化我们的代码库。

新功能

我们的客户严重依赖尖端技术。因此,我们在许多项目中经常有机会接触真实的GraphQL部署。这种丰富的接触使我们能够了解InQL用户面临的挑战和他们的需求,使我们能够决定实施哪些功能。为了回应这些见解,我们在InQL v5.0中引入了几个重要功能,以支持更有效和高效的审计和调查。

兴趣点

此版本中的一个突出功能是"兴趣点"。由GQLSpection提供支持,并由@schoobydrew贡献初始实现,这基本上是一个配备了多个可自定义预设的关键字扫描。

当分析具有超过50个查询/变更和数千个字段的广泛模式时,兴趣点扫描特别有用。它以人类可读的文本和JSON格式生成报告,提供了现代应用程序中常见的大型模式的高级概述,并帮助渗透测试人员快速识别模式中的敏感数据或危险功能。

改进的日志记录

早期版本工具的一个令人沮丧之处是,当解析器在真实模式上中断时缺乏有用的错误消息。因此,我引入了可配置的日志记录。这一点,加上解析功能现在由GQLSpection处理的事实,使得InQL v5.0更加可靠和用户友好。

内联注解

InQL的另一个重要补充是注解。在此之前,InQL只生成最基本的查询,需要使用其他工具来推断正确的输入格式、期望值等。然而,通过添加从GraphQL模式的"描述"字段或类型注解填充内容的内联注释,InQL v5.0已经更加成为一个独立工具。

这里有一个权衡:虽然广泛的注解使InQL更可用,但它们有时可能使理解和导航变得困难。我们正在为未来版本寻找解决方案,以动态限制注解的显示。

InQL和GraphQL安全的未来

我们对InQL的路线图是雄心勃勃的。话虽如此,我们致力于重新引入GraphiQL和循环关系检测等功能,实现与v4的完全功能对等。

随着GraphQL的持续增长,确保健壮的安全至关重要。InQL的未来涉及解决经常被忽视的利基GraphQL功能,并改进现有的渗透测试工具。我们期待与社区分享更多发展。

InQL:学生和贡献者的优秀项目

InQL不仅仅是一个工具,它是一个项目 - 一个邀请那些对网络安全充满热情的人贡献的项目。我们正在积极寻找希望为InQL做出贡献或进行GraphQL相关安全研究的学生和开发人员。这是一个与GraphQL安全专家合作的机会,并在塑造InQL未来的过程中发挥作用。

结论

InQL v5.x是持续工作和坚定致力于增强GraphQL安全的结果。我们敦促所有使用GraphQL的渗透测试人员、漏洞猎人和网络安全爱好者尝试这个新版本。如果您过去尝试过InQL并期待增强功能,v5.0不会让您失望。

在Doyensec,我们不仅仅是在开发一个工具,我们正在推动GraphQL安全可能性的边界。我们邀请您加入我们的旅程,无论是作为用户、贡献者还是实习生。

祝黑客愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计