通过JS文件进行API接口未授权手工测试下
本文最后更新于 2024年7月31日 中午
前言:对JS中泄露的API接口进行接口未授权测试一直是渗透测试的重点,于是尽可能找到更多的API接口就显得很重要,更重要的是还需要找到怎么拼接接口,怎么精准的找到API接口对应的参数,本文对此进行了简单的总结,一起来看一下吧
本文接着继续探讨:
寻找API接口缺失参数
其实有些接口是可以直接查看到使用参数的,比如有些显式的功能点,重置密码,登录,等等这些接口,只要你抓包就可以直接看到其使用的参数,因为这些是比较明显的功能点的后端接口,这类接口本来就是公开的,是功能点处的逻辑处理接口,也就不存在什么未授权的说法了,因为这类接口本来就是不继续鉴权的公共接口,可以直接查看到其使用的参数,于是可能不会考虑去测试未授权的漏洞,但是不排除有其他逻辑缺失漏洞,比如可以测试水平越权与垂直越权,重放攻击等等……于是我把这种公开的,参数可直接看到的接口称为显式接口,把需要进行鉴权,比较隐蔽,参数不好寻找的接口称为隐式接口,这种接口才是未授权的重点测试对象
隐式接口
接口参数在接口附近
注意观察接口的上下文,附近处,看看能不能找到参数
接口参数离接口较远
案例二
以/api/user/login
接口为例
找出此接口的请求参数,在上图可以看到此接口是POST
请求,在此接口附近有以下发现,/api/user/login
接口赋值给了o
,它定义在c3c9
这个function
中,在这个function
中将c
变量与o
变量进行了绑定,因此,后续可通过c3c9
和c
定位到/api/user/login
接口
全局搜索”c3c9”,在https://xx.xx.xxx.xxx/js/app.b7ca27765d0a5354ebec.js?t=1701951166108 找到两处引用c3c9
的地方
i
和fe
变量与c3c9
进行了绑定,因此通过i
与c
、fe
与c
可以定位到/api/user/login
方法,然后在此app.b7ca27765d0a5354ebec.js
文件中全局搜索Object(i,c )
和Object(fe.c)
,Object(i,c )
和Object(fe.c)
就是代表/api/user/login
方法,然后在https://xx.xx.xxx.xxx/js/app.b7ca27765d0a5354ebec.js?t=1701951166108 文件中并没有找到Object(i,c )
和Object(fe.c)
,因此在其它js
文件中寻找,不过在其它文件中寻找需要重新找到c3c9
。在https://xx.xx.xxx.xxx/js/chunk-2703ab0c.03c38d361c89aa80563e.js 中找到了c3c9
然后在
https://xx.xx.xxx.xxx/js/chunk-2703ab0c.03c38d361c89aa80563e.js?t=1701951166108
中全局寻找Object(i.c)
,此时Object(i.c)
代表/api/user/login
,而它的参数如下
其中的captcha
和loginInfo
可以在当前模块的数据定义data
中可以看到
因此,/api/user/login
接口的参数如下
1 |
|
使用登录功能验证一下,完全一致。
案例三
在http://xx.xx.xx.xx:8081/xxq_zhxq_web/static/js/app.bb8538d1.js 发现重置密码接口
发现在”b3f4”中
在所有js
文件中搜索b3f4
再寻找Object(n["f"])
,轻松找到参数
最终构造数据如下,可成功重置任意用户密码
技巧一:正则提取出所有参数
还有一个粗暴但超级好用的技巧,那就是使用正则表达式,把JS文件里所有的”单词”都提取出来,然后去重做成一份字典,其中就有很大概率爆出参数,因为你JS写得再复杂,参数总归是明文写在里面的,我把所有单词提取出来,那么参数也肯定在其中,后面再用burp爆破就行了
findparam.py
1 |
|
提取到的结果如下:
1 |
|
参数一定在其中,但是由于我们为了不遗漏任何一个参数,正则匹配写得就很广泛,匹配了所有”单词”字符串,缺陷就是有太多的垃圾数据,这样会降低爆破参数的效率和准确度,而且看着这些垃圾数据也不舒服,于是又又又写一个脚本,来正则匹配去除垃圾数据
我的去除垃圾数据,保留参数的逻辑如下:以下数据被视为垃圾数据
- 字符串超过了20个字符
- 字符串类似于base64,MD5编码
- 字符串中含有数字的
- 包含了特殊字符如 - @ _ . < ?等
- 大写开头的字符与字符串
- 是unicode编码,如:u00B7,或者其他进制编码的数据
- 是js代码的关键字,如”funtion”,”this”,等等
clean.py
1 |
|