今天来分享下我是如何自动提取 swagger 中配置的 API 接口的,在此之前,先来了解下 swagger 是什么?下面是 chatgpt 的回答:
总结起来就是一套方便开发人员设计、构建 API 的框架,国内外应用非常广泛,大家在日常信息收集的时候经常会遇到这样的系统,比如通过谷歌语法可以轻松找到:
还可以使用网络空间搜索引擎,比如 fofa:
足以看出使用量是非常广泛来,当然,还有很多是隐藏在网站目录中的,需要通过目录枚举来发现这类系统。随便打开一个看看这个系统长什么样:
上图是配置的一些 API 接口信息,点击其中任意一个接口,会有该 API 详细的信息,比如:
手工测试时,可以根据接口的描述,进行针对性的测试,即方便了开发人员,如果存在未授权访问的情况下也方便的攻击者,而我们作为白帽子,这种系统可以扩展我们测试范围,从而发现更多问题。
所以对于企业而言,这种系统,可以设置访问权限,仅限相关开发人员访问,或者将其设置内网访问,尽量不要将其映射至外网,从而降低这类信息比恶意利用的风险。
今天的主要目的是如何通过编写脚本自动化提取其中的接口,从而实现自动化测试,适用于大量目标的测试。
通过查看网站访问的数据包,可以发现所有接口信息是通过 api 返回数据,再通过前端的 javascript 进行格式化成方便操作的页面,所以我们只需要找到那个返回数据的接口,进行分析提取即可,如图:
上面的案例是 openapi 的 3.0 版本,下面是 swagger 2.0 版本:
经过分析,发现,不同版本的格式有略微的差别,所以在做自动化分析的时候,需要根据不同版本做相应的处理。
从上面的案例同样可以看出,返回接口数据的接口不太一样,第一个是 swagger.json,第二个是 swagger-docs,所以在收集这类数据接口的时候,需要指定常见接口名称和路径的字典,从而发现更多可以返回 API 数据的接口。
下面分别以这两个版本的接口作为案例,解析其中的 API,然后在参数部分添加默认值,输出 API 接口列表,从而应用在其他漏洞扫描器中进行漏洞探测。
1、基于 openapi 3.0 版本,提取接口列表
核心其实就是写一个函数将接口数据中的参数增加默认值后输出即可,一个完整的接口配置如图:
其中 statusCode 是路径中的参数,可以将默认值设为 1,get 表示该接口是通过 GET 方法请求,parameters 就是需要配置的接口参数,name 就是参数的名称,schema 就是参数的类型是数字,我们在自动提取的时候,可以根据参数的类型设置默认值,也可以直接都设置成数字,根据自己的需要来。
简单写了一个解析函数,输出的结果如图:
2、基于 swagger 2.0 版本,提取接口列表
方法其实大同小异,只是格式不同而已,解析出的格式如图:
关于参考脚本可以前往【渗透测试那些事儿】知识星球获取,由于代码并不成熟,所以就不公开分享了,互联网上也有同类型的脚本可以参考:
https://github.com/jayus0821/swagger-hack
在实现解析单个脚本的能力之后,那么就是如何收集更多类似接口,这里推荐 nuclei 的 POC 模板,也可以根据自己的经验进行添加:
https://github.com/projectdiscovery/nuclei-templates/blob/e6c20a24de75a63b3ce01fd25925aef4604cd34c/http/exposures/apis/swagger-api.yaml#L47
比如我们刚才测试的目标:
第一个目标测试出了一个 js 文件,第二个没有测试出来,说明这个 POC 中配置的字典并不全面,这种情况,自己可以将未收录的路径添加到 POC 中,从而扩展工具的能力。