• 从JS接口到拿下超级管理员权限


    信息收集

    首先通过网站标题搞清楚了网站的性质,是一个某地的站群系统,集合管理着大量的子网站

    1724504633_66c9da39d65bc68047808.png!small?1724504634611

    通过Wappalyzer了解使用的重点技术有:Java、Swagger-UI、Spring、Vue.js、Webpack

    而常用的前后端分离架构正是Vue.js + Java(SpringBoot)

    于是可以初步判断该站点是前后端分离架构

    而前后端分离的架构,常涉及到前后端之间的数据的传递与调用,如果接口鉴权未做好,很容易出现API接口未授权的安全漏洞

    基本测试流程

    简单的信息收集之后,接下来开始走一遍登录框的基本测试流程

    万能密码

    弱口令

    用户名枚举

    前端登录检验绕过

    找前端源码泄露

    ……

    这些基本流程走完后,不出所料,没有任何发现

    那么既然是前后端分离的架构,当然得测一测JS中未授权接口了,于是展开对JS中未授权接口的详细测试

    API接口提取

    对于API接口的测试,前面也提过很多次了,我常用的工具是FindSomeThing、URLFinder并结合手工的方式去测试的

    ok,先用FindSomeThing看看接口

    1724504649_66c9da49708809daa113c.png!small?1724504650127

    好家伙,一个接口也没有,这种时候不要慌,前面信息收集提到了站点使用了Webpack,那么JS就被压缩打包了,这可能对该工具提取API接口有影响,或者是该工具的匹配接口的正则不适合于当前站点的写法的原因

    这种情况可以选择用URLFinder看看能不能提取成功,一般是可以的,但是这个工具爬取功能太强大了,爬取到API接口的同时,也会爬取到大量无用的数据和垃圾数据,之后仍然需要手工去把有效的接口筛选出来,数据多的时候反而效率不如手工直接找接口来得快,而且,还有一点,有时API接口不完整,需要拼接baseURL、baseAPI,该工具无法做到正确地拼接接口,也是需要手工去拼接的

    看看js文件

    1724504664_66c9da589e075411d71aa.png!small?1724504665309

    1724504677_66c9da6505bcdeac39d95.png!small?1724504677618

    果然有baseURL,是需要手动拼接接口的,于是我选择手工+自写小脚本来进行API接口的测试

    findAPI.py

    import json
    import re
    import requests
    import sys
    import os

    headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}

    fileurl=sys.argv[1]

    filemkdir=fileurl.split('_')[0]
    if not os.path.exists(filemkdir):
    os.makedirs(filemkdir)


    # 下载chunk.js
    # with open (str(fileurl)) as furl:
    #   url=furl.readlines()
    #   print(str(url)+"---is---downloading")
    #   for url in url:
    #       url=url.strip('\n')
    #       file=url.split('/')[-1]

    #       resp = requests.get(url)
    #       html = resp.text

    #       with open ("./"+filemkdir+"/"+file,"a",encoding="utf-8") as f1:
    #           f1.write(html)



    #get path + 路径名称
    paths=[]
    for dirpath, dirnames, filenames in os.walk('./'+filemkdir):
    for file in filenames:
    with open("./"+filemkdir+"/"+file,"r",encoding='gb18030', errors='ignore') as f2:
    try:
    line=f2.readlines()
    for line in line:
    line=line.strip('\n').strip('\t')
    #print(line)
    p =  re.findall('''(['"]\/[^][^>< \)\(\{\}]*?['"])''',line)
    #print(p)
    if p != None:
    #print(p)
    for path in p:
    path=path.replace(':"',"").replace('"',"")
    paths.append(file+"---"+path)
    except Exception as e:
    print(e)


    for var in sorted(set(paths)):
    with open (fileurl+'_path.txt',"a+",encoding='gb18030', errors='ignore') as paths:
    paths.write(var+'\n')

    先把base路径单独提取出来

    然后再去提取后半段的API接口作为字典

    然后再放进burp里批量跑一下接口,固定一个base路径然后跑字

  • 相关阅读:
    多线程 Leetcode 打印零与奇偶数
    浅刷牛客链表题,逐步深入链表,理解链表
    CBAM:Convolutional Block Attention Module--通道+空间混合注意力
    关于 Laravel Redis 多个进程同时取队列问题详解
    FastDFS分布式文件系统
    华为机试 - 等和子数组最小和
    OpenWRT、Yocto 、Buildroot和Ubuntu有什么区别
    希腊字符的发音
    使用VS创建Linux项目,并远程连接Linux
    编译原理 x - 练习题
  • 原文地址:https://www.freebuf.com/vuls/409392.html