原文:
https://bendtheory.medium.com/finding-and-exploiting-unintended-functionality-in-main-web-app-apis-6eca3ef000af
在主要的Web应用程序中寻找bug时,我遇到了大量有趣的api。有些是安全的,有模糊的文档,可以让你确定攻击的大方向,而另一些则是通过JavaScript文件完全公开的,这让它们成为更有趣的目标!在利用api时,定制的内容枚举、JavaScript文件分析、敏锐的眼光和一些运气都能带来有影响的结果。
关于我最近如何在API中发现两个有影响的漏洞,我已经收集了一些想法,但是下面的步骤和技术应该足够通用,可以帮助发现类似的API漏洞——IDORs、特权升级、信息披露等等。

在主要的Web应用程序中寻找由api支持的单页应用程序和端点
大型目标的主要Web应用通常包含许多不同的应用,它们具有不同的功能,适合不同类型的用户。每个应用程序都可以有自己的API,完全独立于站点上的其他应用程序。这些API的安全程度可能相差很大,所以尽可能多地查找内容会增加至少找到一个易受攻击的API端点的机会。
我结合使用了以下工具和技术来发现应用程序和api中的内容
Google Dorking
我最喜欢的接近目标的方法是通过谷歌找到感兴趣的页面索引。我可以写一篇关于我如何使用谷歌dorking进行bug赏金狩猎的文章,但这里有一些我用来开始或在几个月的狩猎后寻找新内容的好技巧。
site:example.com filetype:jsp
.......
.......
Removing static content and common file types in search results helps you focus on more dynamic, interesting aspects of your target.
site:example.com -ext:pdf -ext:html
手动枚举通过浏览器+被动枚举通过Burp
这很简单,但仍然需要注意。无论身份验证与否,点击每一个链接,提交每一份表单,更改你的电子邮件和密码,填写你的个人资料,购买东西,注册一个高级账户,并确保所有的流量都在Burp中捕捉到。我结合使用了所有其他内容枚举技术。
我通常将范围设置为只包含一个关键字,这样我就可以在所有可能与目标相关的域中找到感兴趣的内容。我也喜欢加入一些云关键词来帮助收集一些有趣的被动信息。广泛撒网是很重要的,因为您将有丰富的信息和数据用于以后的进一步枚举。

JavaScript文件和端点分析
我最喜欢的Burp扩展之一是BurpJSLinkFinder。我一直戴着它,当我通过一个目标时不断检查它。Javascript文件可以包含到其他应用程序、API端点的链接,以及关于如何使用站点的大量有趣信息。
BurpJSLinkFinder确切地说,并从JS文件解析出链接!然而,这些信息本身并不可信。有时,它会吐出这样的链接:
/api/v1/account/
/profile?id=
看起来很好,它们可能是可行的研究终点。也就是说,深入研究实际代码可以揭示更多关于端点实际使用和格式化的信息:
var profileURL = '/api/v1/account/' + type + '/profile?id=' + id
找到创建URL的代码行或构建ajax请求的代码行是很好的起点。从那里,您可以分析代码如何构建这些请求,并尝试寻找利用API的方法。
在浏览一个网站寻找有趣的内容时,我指望BurpJSLinkFinder找到充满详细API端点信息的巨大JS文件。一个好的JS文件可以提供无尽的乐趣,特别是如果开发团队正在定期发布新版本!
我还推荐这个同名的python脚本(https://github.com/GerbenJavado/LinkFinder)用于没有burp 的情况。
创建自定义词库
这是我的秘密武器,但我怀疑你们大多数人都是我最喜欢的个人脚本,我不太担心分享🙂
大约一周后,我手动破解了一个主要的web应用程序,我有一个相当大的burp文件与数以千计的范围内请求。我收集了数百个独特的页面和JavaScript文件,它们充满了有趣的词汇。
我想要一种方法来收集所有这些在一个大文件中,所以我写了一个快速和简陋的python脚本称为burplist.py提取这些单词,并将它们添加到单词列表:
https://gist.github.com/bendtheory/1129e85e578f25fa9056520fded66352
这个脚本可以工作,但非常糟糕,它是用python 2编写的,需要一些关爱。我希望最终用Python3重写它,或者在将来的某个时候构建一个burp扩展。(也许你会的!时间会告诉我们!)
以下是我如何生成一个极好的自定义爆破列表:
-更改代理历史记录中的过滤器设置,以删除所有二进制和图像文件
-选择一个请求,按ctrl-A,右键单击,并在上下文菜单中选择Save Items。我将其保存为一个XML文件,并选中“base64编码请求和响应”选项
像这样运行脚本:python burplist.py burprerequests .xml
-使用@BonJarber制作的clean_wordlist.sh脚本删除垃圾词和废话
-清理单词列表的优化技巧包括:
-删除所有带数字的单词
-转换为小写并删除重复(检查你是否以相同的方式目标响应大写和小写路径)
-调整代理历史和范围,以包含更具体的目标端点和域(即仅JavaScript文件)
在所有这些之后,你将有一个针对性的,完全定制的爆破关键词表专门为你的目标。
CLI侦察工具
一旦我找到了一些有趣的目标,找到了一些api,或者我只是想找到更多的内容,我将开始使用一些命令行侦查工具。
@hacker_的gau是最佳人选。我将结合使用@tomnomnom的qsreplace和@dreyand_构建的一些自定义查找规则。偶尔,我将把这些结果(如果它们是可管理的)传递给httpx以找到有效的端点。前面提到的LinkFinder python脚本在这里也可以很好地工作。
对于目录爆破,我将对默认单词列表使用dirsearch,对前面提到的自定义单词列表使用ffuf。我将同时访问目标的根目录和枚举期间发现的任何有趣的API目录。
@assetnote的kiterunner是API端点发现的一大进步。我已经用过它几次了,很高兴能在更多的地方试用它。这绝对是蛮力API发现的未来。
我最近也一直在使用urlscan。io来收集URL数据,类似于gau。我还没有看到其他工具使用这个源代码,但它是一个很好的方式,为单个域添加10k唯一的url。用户提交的内容有时可能具有有趣的、针对目标的惟一url。
译者:
原文太长了,每日一分享,渗透小技巧,未完待续.......
本文迁移自知识星球“火线Zone”