瞎捣鼓之核心API未授权监控

admin 2025年6月10日15:28:28评论13 views字数 2576阅读8分35秒阅读模式

一个人的安全,总会有点力不从心,又不能完全信任业务能做到安全,说不得此时此刻没有安全问题,保不准哪一波更新就会导致问题出现,而且最可怕的并不是什么SQL注入、命令执行类漏洞,因为这些一般都会很快被定位锁死,反而是一些未授权访问漏洞最为致命,悄无声息的。

瞎捣鼓之核心API未授权监控
今天主要也是为了这类漏洞,花了一大波时间梳理了一下内部的核心API,然后打算自己写一个简单的脚本实时监控这些API是否存在未授权访问的风险。好了,话不多说,直接上正文。
瞎捣鼓之核心API未授权监控

目录结构很简单,存放核心APItargets.json文件,以及脚本文件。这个脚本比较简单,就是一个单纯的request请求。

整体思路也很简单,仅安全人员自看,比如在下。思路大致是:github action定期触发->脚本运行扫描API->将未授权的API通过dingtalk发送给安全人员(在下)。

脚本代码如下。

import requests
import json
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

DINGTALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=?"
unauthorized_apis = []

def load_targets(filename = "targets.json"):
    with open(filename, "r") as f:
        # print(json.load(f))
        return json.load(f)

# 发送钉钉告警
def send_to_dingtalk(message):
    headers = {"Content-Type": "application/json"}
    data = {
        "msgtype": "text",
        "text": {
            "content": message
        }
    }
    try:
        resp = requests.post(DINGTALK_WEBHOOK, headers=headers, data=json.dumps(data))
        print(f"[🔔] 已发送钉钉告警,响应: {resp.status_code}")
    except Exception as e:
        print(f"[❌] 钉钉推送失败: {e}")

def report_unauthorized(apis):
    print("=== 开始发送dingtalk ===")
    if not apis:
        print("无未授权接口")
        return

    msg = "🚨 以下 API 存在未授权访问风险:\n"
    for item in apis:
        msg += f"- {item['method']} {item['url']},状态码: {item['status']}\n"

    send_to_dingtalk(msg)    


def make_request(target):
    method = target.get("method", "GET").upper()
    url = target["url"]
    headers = target.get("headers", {})
    body = target.get("body", {})

    try:
        if method == "GET":
            resp = requests.get(url, headers = headers, timeout = 10)
        elif method == "POST":
            resp = requests.post(url, json = body, headers = headers, timeout = 10)
        elif method == "PUT":
            resp = requests.put(url, json = body, headers = headers, timeout = 10)
        elif method == "DELETE":
            resp = requests.delete(url, headers = headers, timeout = 10)
        elif method == "PATCH":
            resp = requests.patch(url, headers = headers, timeout = 10)    
        else:
            print(f"[⚠️] 不支持的方法: {method}")
            return

        print(f"[{resp.status_code}] {method} {url}")

        if resp.status_code not in [401, 403, 405]:
            unauthorized_apis.append({
                "method": method,
                "url": url,
                "status": resp.status_code
            })

    except Exception as e:
        print(f"[❌] 请求失败 {method} {url}: {e}")

def main():
    print("=== 多方法 API 未授权访问检测脚本 ===")
    targets = load_targets()

    thread_count = 5
    max_threads = min(thread_count, len(targets))

    with ThreadPoolExecutor(max_workers=max_threads) as executor:
        future_to_target = {
            executor.submit(make_request, target): target
            for target in targets
        }

        for future in as_completed(future_to_target):
            target = future_to_target[future]
            try:
                future.result()
            except Exception as e:
                print(f"{target} 执行失败: {e}")

    print("=== 所有未授权扫描任务完成 ===")
    report_unauthorized(unauthorized_apis)

if __name__ == "__main__":
    main()

targets.json api样式如下。

[
  {
    "method": "POST",
    "url": "https://xxxx/xxxx",
    "headers": {
      "Content-Type": "application/json"
    },
"body": {
}
  }
]
大致运行的效果,emmm,粗糙但是够用,哈哈。
瞎捣鼓之核心API未授权监控

原文始发于微信公众号(安全无界):瞎捣鼓之核心API未授权监控

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月10日15:28:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   瞎捣鼓之核心API未授权监控https://cn-sec.com/archives/4152283.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息