原项目链接: 31-days-of-API-Security-Tips
tip1:
旧的API版本通常会包含更多的安全漏洞,他们缺乏一些安全机制。我们可以使用REST API的可预测性来预测是否存在旧的API版本。比如当前有一个API被命名为/api/v3/login
,我们可以检查/api/v1/login
是否存在 。
比如:
http://api.example.com/v3/login
可以把v3换成v2,v1等等,其实如果想探测到更多的版本,可以探测一些大范围比如v0-100等等。还有存在一些v2.1 这种小版本的可能。
http://api.example.com/v2.1/login
tip2:
永远不要认为只有一种方法来验证API的身份。现代的应用程序有很多API接口用于认证:/api/mobile/login| /api/v3/login| /api/magic_link
等。找出他们并测试所有的授权认证问题。
认证的接口确实很多,包括
/api/mobile/login
/api/v3/login
/api/magic_link
这种需要去变量很多的二级子目录,再加上login,或者一些其他的接口也是可以登录,这个需要查看官方的文档。
OAuth的认证机制,需要学习一下。很多大公司的OAuth的接口如下:
在线服务 | 接口端点 |
RFC 6749 | /token |
/oauth2/token | |
Dropbox | /oauth2/authorize |
/oauth/access_token | |
/o/oauth/token | |
Github | /login/oauth/access_token |
/oauth/authorize | |
tumblr | /oauth/token |
做认证的时候,公开API 一般为:
https://api.example.com/v1/oauth2/token
tip3:
还记得5-10年前SQL注入是多么常见么?你几乎可以进入任意一家公司。BOLA(IDOR)是API安全最新的流行病。作为一个渗透者,如果你知道如何利用它,你的荣誉就得到了保证。
BOLA参考信息:https://medium.com/@inonst/a-deep-dive-on-the-most-critical-api-vulnerability-bola-1342224ec3f2
看了一下BOLA,打算写一篇文章来介绍一下,后面放文章链接。
tip4:
测试一个Ruby on Rails App的时候,注意一个包含URL?的HTTP参数。 开发人员有的时候会使用”Kernel#open” 函数访问urls== Game Over,只需要发送一个管道作为第一个字符,然后发送一个shell命令(通过设计的命令注入)
更多的参考函数文档: https://apidock.com/ruby/Kernel/open
tip5:
寻找SSRF? 使用它来
- 内部端口扫描
- 利用云服务
- 使用http://webhook.site 网站来反查IP地址和HTTP库
- 下载大的文件(7层 DOS)
- 反射SSRF,本地管理平台泄露
tip6:
Mass Assignment(批量赋值)是一个真实存在的。现在框架鼓励开发人员在不理解安全影响的情况下使用MA。在开发过程中,不要猜测对象的属性名称,只需要找到一个返回所有属性的GET端口即可。
更多的了解批量赋值:
一文带你了解 Laravel 中的 Mass-Assignment (批量赋值)
tip7:
一家公司向开发者公开了API接口,而且在移动端和web端使用了相同的API程序。我们需要分开测试它们,不要假设它们实现了相同的安全机制。
tip8:
在进行测试REST API时,我们也应该检查一下API是否也支持SOAP。将content-type更改为“application/xml”,在请求主体中添加一个简单的xml,并查看API如何处理它。
有时身份验证是在不同的组件中完成的。可能是在REST和SOAP API之间共享的,所以SOAP API可能支持JWT。如果API返回带有DUMPling的stack trace,那么它很可能是存在漏洞的。
tip9:
试图找到BOLA(Broken Object Level Authorization)的漏洞?
HTTP bodies/headers 中的id往往比url中的id更容易受到攻击,首先试着关注他们。
tip10:
利用REST的特性来查找管理API endpoints!
比如你看到一个api叫做 GET /api/v1/users/<id>
,我们可以试着修改请求方法POST/DELETE
来 create/delete users
其实这些API端口是很好猜的,而且设计规范的API 也应该这样设计。
一个规范的设计:
https://api.example.com/v1/users/<id>
可以替换版本,二级目录,id ,包括方法等等,这都是可以用遍历工具来找出来的。