反编译js.map
Vue使用webpack(静态资源打包器)的时候,如果未进行正确配置,会产生一个app.js.map文件,而这个js.map可以通过Node.js环境安装reverse-sourcemap工具来反编译还原Vue源代码
1、安装nodejs
使用npm -v查看版本
npm -v
2、安装reverse-sourcemap
使用如下命令安装
npm install --global reverse-sourcemap
reverse-sourcemap --output-dir . xxx.js.map
import re
# 读取文件内容
file_path = '1.js'
with open(file_path, 'r', encoding='utf-8') as file:
js_code = file.read()
# 使用正则表达式提取路径
# 匹配 GET 或 POST 请求的路径,支持单引号或双引号
pattern = r'''(D.post|D.get)(["']([^"']+)["']'''
matches = re.findall(pattern, js_code)
# 打印匹配到的路径
if matches:
print("Matched paths:")
for match in matches:
method, path = match
print(f"{method.upper()}: {path}")
else:
print("No paths matched.")
Packer-Fuzzer寻找新接口API
Webpack打包站点手工审计JS寻找接口往往慢人一步,生成的JS文件数量异常之多并且总JS代码量异常庞大(多达上万行),这给我们的手工测试带来了极大的不便,利用此工具可以很好解决此问题
https://github.com/rtcatc/Packer-Fuzzer
// -t adv 代表使用高级版进行扫描
python3 PackerFuzzer.py -t adv -u http://baidu.com
JS接口构造
插件工具
熊猫头 (findsomething)
熊猫头插件针敏前端显示到的接口或者其他铭感信息进行捕获显示,复制粘贴到BP爆破器GET POST 两种请求方式都测试,接口未鉴权就可以发现一些信息泄露以及未授权漏洞 包括内网的IP
但是插件显示是不完整的,针对熊猫头提取出的接口可以手工筛选一遍,例如findsomething显示接口
第一个接口应该将冒号去掉添加个数据,第二个接口也应该加入参数,一般也都是这样处理将 ,杂乱参数去除 需要值的参数就赋值
/user/getInfo/:uid -----> 修改 /user/getInfo/uid
/user/getInfo?uid -----> 修改 /user/getInfo?uid=xxxx
https://github.com/pingc0y/URLFinder
baidu.com
app.js confif.js url.js
app.xxx.js config.xxxxxx.js url.xxxxxx.js
app.sdqew2324.js config.jkjk767.js url.vcbvcj213.js
api/user/info /api/getSharingJson /api/custommap/
baidu.com/api/user/info
baidu.com/api/getSharingJson
baidu.com/api/custommap/
https://github.com/N-Next/URLFinder-x
//扫描域名并指定输出200状态和403状态码接口 -m 安全深入抓取
URLFinder.exe -u https://baidu.com/ -s 200,403 -m 3
// 线程20
URLFinder.exe -u https://baidu.com/ -s 200,403 -m 3 -t 20
案例
SRC信息泄露
开局登录框,功能点无法利用URLFinder深入抓取JS拼接,找到一处下载接口,访问下载xls泄露网站部门人员工号+姓名,简单快速寻找未授权漏洞
https://xxxxx/index.php/c/core_user_export/json?__request_data=
文件上传接口XSS
同样开局登录框,熊猫头短暂测试没有效果使用此工具二次对JS深度抓取接口拼接
探测到隐藏文件上传功能点,成功利用收获文件上传XSS
Fuzz功能接口
构造功能
如果网站功能点只能允许查看 info 那么在查询接口功能抓包构造其他参数; 因为常见业务接口格式如果js文件中只有查询的接口,那么自己可以尝试一下构造添加、修改和删除接口多观察接口,推测其功能,然后根据功能去FUZZ,毕竟你要实现一个web功能,基本都要有对应的增删改查接口
api/info?id=1 // 正常查询接口
api/ delete ?id=1 // 构造删除接口
/api/v1/api-docs
// 尝试替换数字
/api/ v2 /api-docs
/api/ v3 /api-docs
-----------------------------------------------------
查询(获取信息)
search list select query get find
删除(删除某个数据)
del Delete remove
编辑(更新某个信息)
Update Up edit Change
添加(增加某个信息)
add create new
// 查询接口
GET /api/模块名/list
/api/模块名/all
注意
增删改在实际Fuzz中尽可能不携带参数测试,这些操作涉及到业务 万一误打误撞影响到了真实用户就脱离了测试安全的意义了,携带参数也是利用小号的值
// 添加
POST /api/模块名/add
// 删除接口
DELETE /api/模块名/id
GET /api/模块名/del?id=
POST /api/模块名/
// 修改接口
POST /api/模块名/modify
POST /api/模块名/
接口信息泄露
除了构造增删改查外,泄露点更多是在查询处,查询处没有做好鉴权及易导致查询不当全站信息泄露,针对查询功能只要是查询的地方记住删除全部参数以及置空参数或者输入%
// 添加
POST /api/模块名/add
// 删除接口
DELETE /api/模块名/id
GET /api/模块名/del?id=
POST /api/模块名/
// 修改接口
POST /api/模块名/modify
POST /api/模块名/
假设一个接口是,如下,正常肯定是回显自己的,我们可以自行构造多余的功能,按照语义输出列表,并且前置的信息需要删除 small)翻译也是微小意思推断一下就是只输出小部分的,那么可以尝试这个参数删除发包测试,
/prod-api/system/info/small/userId ------> 个人信息
/prod-api/system/info/small/userId/list ------> 报错
/prod-api/system/info/userId/list ------> 全站用户信息
无权限URL混淆添加资源后缀绕过
微信文章学习到的思路功能点Fuzz出来后但是无权限利用此方法进行绕过
https://mp.weixin.qq.com/s/PoXSeckX0iwBSkIr02zYoQ
URL混淆漏洞是指服务器和解析URL时,由于不同组件或系统的解析规则不一致,可以利用这种不一致来绕过安全控制或获取敏感信息,对路径进行编码添加后缀的方式从而进行绕过。
简单来说,混淆后的不同URL均路由至同一资源时,后端程序或组件没有做好URL规范解析时会绕过安全访问控制。
比如:http://example.com/foo
http://example.com /foo/ 和 http://example.com /foo/均指向foo目录
http://example.com/;/foo 和 http://example.com/.;/foo均指向foo目录
http://example.com/foo.js 和 http://example.com/foo.css均指向foo日录
/api/user ----> 未授权403
/api/user.json/css/png --- 200 ok
/login/ ----> 200 ok
/system/user -----> 403 未授权
/system/**logn**/../user ------> 添加白名单接口未授权成功
利用分隔符 ; 让后端以为文明访问的接口不是业务接口,和上面添加 .json 差不多一致切割分隔符绕过
有些像之前学习的shiro权限绕过 但shiro是 ../;
Fuzz接口参数
无论是熊猫头还是其他工具得到的接口Path其实是不完整的,直接拼接的话缺少参数是无法访问接口会报错,需要构造参数, 如果响应包直接提示缺少哪些参数对攻击者是很友好的, 请求包构造发包就可以测试
/api/demo/test HTTP2 --------> "缺少deviceId"
提示缺少参数我们拼接
/api/demo/test? deviceId =xxx HTTP2 ------> {最好情况直接显示数据}
但更多的情况下是直接提示缺少参数也不说什么参数,那么需要可以JS源码里面找一下它的调用代码,找到请求中用到的参数进行构造, 先是找接口找到, 没有办法Fuzz参数是最后的底牌
BP搜索参数
BURP作为挖洞小伙伴善加利用功能点可以事倍功半,站点功能会自动记录加载过的所有JS文件,我们只需要做的是进入网站后点击一切能点击处让BP加载更多,避免缓存影响浏览器需要关闭缓存 ,这样可以保证JS文件被BP加载
/api/
我从js里面找到了这个请求 请帮我构造好原本的请求参数是如何放置的,构造好请求参数值反馈给我
$.getJSON("/getLineLocalPromotion/demo/",{
lineIdstr:a,sid:b,rand:(new Date()).getTime()
},
/getLineLocalPromotion/demo?lineIdstr=123&sid=456&rand=1642678901234
字典Fuzz参数
缺少参数响应包更多的情况是模糊提示 只会提示缺少参数,也不会说是什么参数,我们首先是可以按照上面的手法全局找接口看看构造的是什么参数, 找不到接口构造参数那么可以上字典Fuzz参数
/api/demo/getuserinfo------> Missing parameter // 无提示
/api/demo/getuserinfo? {fuzz} =
后端无提示.那么根据请求的语义,我们虽然不知道参数的具体值,但是能很大程度上缩小范围的,请求是获取用户的信息,那么代表传入的参数是用户参数,搜集常见的用户参数作为字典,根据接口需要实现什么功能,在这个思路基础上推断出参数,
id userid
user_id
uid
userId
google_nid
文件上传参数名肯定是file files filesname,查询接口参数肯定也会是query q ,根据接口语义推断
如果想不出合理的参数名毕竟我们不是开发出身,日常没有足够接口参数积累 可以以一个开发者的视角询问ai通过此接口可以传递哪些参数,有些情况参数存在多个,这个需要依照功能点来进行填充,显示功能点的可能需要pageSize pageNum 上传功能点需要时间戳 文件名等等,思路也是找不到就Fuzz
/api/demo/upload?{ file/files/filesname }=
/api/demo/query?{ q/name/id }=
接口语义参数拼接
原理是Web开发的思路和习惯,尤其是大部分MVC框架,我们对功能点操作实际上是对后端进行增删改查,MVC存在映射关系,根据面向对象思想 为了提供代码的复用性, 增删改查虽然不同功能但实际上操作的还是一个类中的参数,类中的属性肯定是高度类似,很多情况是还是完全相等
在一个接口缺少参数,响应不出数据,可以回过头找到其他**"输出"**功能点显示的参数 拼接到请求包
假设需要构造接口语义是edit编辑,那么肯定需要的是编辑的信息,ID、名称这些参数信息 根据这一点可以找**"输出"** info信息的功能点,
/api/demo/edit/ -----------> 缺少参数
/api/demo/edit
找到输出info 功能点 把数据体复制到edit编辑请求使用修改,GET POST JSON 均提交,
存在用户ID 编号的参数值最好有两个账户进行测试是否可以达到越权或未授权目的!结合此方法在上文Fuzz功能接口的地方找到隐藏功能二次根据语义判断隐藏参数做拼接测试
Fuzz功能点和Fuzz参数原理都是一样的,推测出开发的语义化,因为他们的命名肯定是会有规律的,增删改查功能和和需要的参数都是这样, 寻找 输入 输出 方法只是也是站在开发思维寻找参数,
功能点Fuzz 增删改查即可 ,参数寻找有响应包有提示直接拼接,无提示全局找,找不到根据请求语义找其他功能点输出参数位置拼接猜测,渗透测试讲究一个测,有可能性的话就测一下
Fuzz JS文件
攻防有时会遇到比较古老的站点PHP/ASP.NET,同样是开局一个登录框 JS都是直接引入的,提取不到可以利用的接口 ,并且没有Webpack打包技术这个时候可以尝试Fuzz JS文件, 这些比较古老的站点的JS目录一般就是/js /script /plugins /content等等,很容易找到 JS的名字也比较简单,不像用Webpack打包的JS,名字中可能会带有随机字符。遇到这种还是能去FUZZ一下JS文件的
尝试对JS文件名Fuzz 有些情况下JS文件并没有显示在当前目录 但确实是用到了这些文件,利用好字典对JS文件名进行爆破,如果响应了新的JS文件再从响应包中审计提取新的接口进行二次测试未授权
原文链接:
原文始发于微信公众号(网络安全透视镜):开局只有登录框,我该怎么渗透?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论