Contents

API渗透测试

API渗透测试

0x00 前言

在昨天阅读国外的文章的时候,翻到了一篇 Microsoft Regional Director DANA的文章,我个人是很喜欢去测试API接口的,比如面试官常问的,“给你个登录框你有什么思路 ”,在很久以前面QAX的时候,有梳理过一个思路,如下:

/api_Att/image-20240315100830326.png

大多数情况下,特别是最近吧,发现自己漏洞挖掘越来越没有耐心了,所以我觉得应该让测试流程化,而流程化的第一个步骤,我觉得就是梳理站点的API文档。

0x01 API文档梳理

回到Microsoft Regional Director DANA的文章里,DANA详细的教学了为什么要梳理一份API文档(当然源站点自带api-docs最好)以及如何去梳理一份API文档,具体为什么要梳理以及一些Swagger, and the OpenAPI specification原理等,可以去原文看DANA文章 How to craft rogue API docs for a target when they don’t exist,这里只简单记录一下如何操作。

首先需要用到的工具有: mitmproxy2swagger

1
pip install mitmproxy2swagger

使用谷歌浏览器利用开发者工具捕获流量,首先打开F12,设置保留日志与禁用缓存

/api_Att/image-20240315101922754.png

尽可能的把所有的功能点触发一遍,包括不限于,修改头像、评论、举报等等

/api_Att/image-20240315102222312.png

生成 HTTP 存档 (HAR)

/api_Att/image-20240315102304840.png

利用前面提到的工具mitmproxy2swagger将HAR转换为简单的openai规范文档

1
mitmproxy2swagger -i ***.***.com.har -o crapi.yaml -p http://***.***.com -e -f har
  • -i:用谷歌浏览器保存下来的HAR源文件
  • -o:输出要生成的yaml文件
  • -p:调用API的前缀,通常为 target.domain 或 target.domain/v1 等
  • -e:在文档中提供示例数据,这些数据为刚刚我们浏览器捕获的真实数据,如不想泄露或者需要将文档分享给他人,建议不加这个参数
  • -f:这告诉工具输入文件是 HAR 捕获,而不是典型的 mitmproxy文件

/api_Att/image-20240315102927596.png

文档生成后,在x-path-templates 下有大量以"-ignore:/“开头的行,我们需要打开文件并删除任何看似 API 调用的请求上的"ignore:"。并且忽略/删除图像、图标、HTML、Javascript 等内容,使文档看起来变成如下:

原文档:

/api_Att/image-20240315103012595.png

修改后:

/api_Att/image-20240315103745826.png

重新运行一遍相同的命令: mitmproxy2swagger -i ***.***.com.har -o crapi.yaml -p http://***.***.com -e -f har

注意

注意,如出现以下报错,这是因为代码使用了python2的str.decode()方法

File “C:\Python3\lib\runpy.py”, line 196, in _run_module_as_main return _run_code(code, main_globals, None,

File “C:\Python3\lib\runpy.py”, line 86, in _run_code exec(code, run_globals)

File “C:\Python3\Scripts\mitmproxy2swagger.exe_main_.py”, line 7, in

File “C:\Python3\lib\site-packages\mitmproxy2swagger\mitmproxy2swagger.py”, line 265, in main body_val[key.decode(“utf-8”)] = value.decode(“utf-8”)

AttributeError: ‘str’ object has no attribute ‘decode’. Did you mean: ’encode’?

请修改C:\Python3\lib\site-packages\mitmproxy2swagger\mitmproxy2swagger.py文件中的265行即可:

1
body_val[key.encode().decode("utf-8")] = value.encode().decode("utf-8")

重新运行命令后,文档应该就会变成如下的样子,包括端点、使用的方法、对象的参数和属性,如果包含 -e 选项,甚至还包括完整的示例:

/api_Att/image-20240315104545229.png

将文档复制粘贴到https://editor.swagger.io中就能在 Swagger 编辑器调用测试API了

/api_Att/image-20240315104713865.png

0x02 API文档与Postman与BurpSuite结合

先将API文档导入到Postman当中CTRL+O快捷键导入yaml文件即可

/api_Att/image-20240315110138538.png

打开设置

/api_Att/image-20240315110324335.png

SSL证书验证不勾选

/api_Att/image-20240315110346123.png

勾除掉系统代理,然后设置burp的代理即可

/api_Att/image-20240315110441566.png

测试一下burp有没有收到流量

/api_Att/image-20240315110533098.png

0x03 API攻击指南