自动化安全脚本学习

news2025/6/1 1:25:40

1.目录扫描器

目标:使用python编写一个自动化目录扫描工具,实现简单信息收集,判断目标网站是否存在常见路径。

import requests  #用于发HTTP请求
from concurrent.futures import ThreadPoolExecutor #实现多线程扫描

# 扫描目标
target = 'http://vulnweb.com'

# 常见目录字典
wordlist = ['admin', 'login', 'uploads', 'phpinfo', 'config', 'dashboard', 'include', 'images', 'assets']

#扫描函数
def scan(path):
    url = f"{target.rstrip('/')}/{path}"  # rstrip:用于删除末尾指定符号
    try:
        r = requests.get(url, timeout=3) #发起get请求
        if r.status_code in [200, 403]:  #若返回码是200,403则输出
            print(f"[+] Found: {url} (Status: {r.status_code})")
    except requests.RequestException:
        pass

# 线程池并发扫描(用map方法将wordlist中每一项传给scan函数并执行)
with ThreadPoolExecutor(max_workers=10) as executor:
    executor.map(scan, wordlist)

执行:

扩展:

1)把结果写入文件,而不是直接输出

with open('result.txt', 'a') as f:
    f.write(f"{url} (Status: {r.status_code})\n")

2)从文件读取字典,而不是自己一个一个写

with open('dict.txt') as f:
    wordlist = [line.strip() for line in f]

结果:

2.XSS自动化测试器

目标:写一个脚本自动检测GET参数是否存在XSS注入点

import requests
import sys
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse

# 用一个简单的 payload 测试是否反射
payload = "<script>alert(1)</script>"

def scan_xss(url):
    parsed = urlparse(url)  # 分解 URL 成分
    query = parse_qs(parsed.query)  # 获取参数字典 {"q": ["123"], "name": ["abc"]}

    # 替换每个参数为 payload
    new_query = {}
    for param in query: 
        new_query[param] = payload

    # 构造新的 URL
    encoded_query = urlencode(new_query, doseq=True)
    new_url = urlunparse((parsed.scheme, parsed.netloc, parsed.path, '', encoded_query, ''))

    print(f"[*] Testing: {new_url}")

    try:
        r = requests.get(new_url, timeout=5)
        if payload in r.text:
            print(f"[+] Possible XSS found! Payload reflected in response.")
        else:
            print("[-] No reflection detected.")
    except requests.RequestException as e:
        print(f"[!] Request failed: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: python3 {sys.argv[0]} <url>")
        sys.exit(1)

    target_url = sys.argv[1]
    scan_xss(target_url)

requests:用于向目标网站发HTTP请求

sys:用于获取命令行参数

urllib.parse:用来拆解和重建URL,特别是带参数的GET请求地址

payload:最简单的例子,可能还需要绕过

优化:

1.解析命令行参数(argparse)

import argparse

def parse_args():
    parser = argparse.ArgumentParser(description="XSS 注入检测器")
    parser.add_argument("-u", "--url", required=True, help="目标 URL(带参数,payload 用 test 占位)")
    parser.add_argument("-p", "--payloads", help="指定 payload 字典文件")
    parser.add_argument("-v", "--verbose", action="store_true", help="显示详细信息(每次测试 URL)")
    parser.add_argument("-o", "--output", help="将检测结果保存到文件")
    return parser.parse_args()

解释:创建命令行解析器,添加参数规则,-u是必须的,用户必须传入目标URL,-p是可选的,用于指定自定义payload文件,-o是可选的,用于指定保存结果的文件路径,parser.parse_args():把命令行参数解析为对象,代码中通过 args.url 这样访问。

2.加载payload列表

def load_payloads(payload_file=None):
    if payload_file:
        with open(payload_file, "r") as f:
            return [line.strip() for line in f if line.strip()]
    else:
        return [
            "<script>alert(1)</script>",
            "'\"><script>alert(1)</script>",
            "<img src=x onerror=alert(1)>",
        ]

解释:如果用户传了-p,我们从给定的文件中读取每一行,作为一个payload,否则就用内置的三个payload,strip()用于去除换行和空格,确保干净的数据

3.主程序逻辑

import requests

if __name__ == "__main__":
    args = parse_args()
    target_url = args.url
    payloads = load_payloads(args.payloads)

    for payload in payloads:
        test_url = target_url.replace("test", payload)
        if args.verbose:
            print(f"[*] Testing: {test_url}")
        try:
            response = requests.get(test_url, timeout=5)
        except Exception as e:
            print(f"[!] 请求失败: {e}")
            continue

        if payload in response.text:
            print(f"[+] Possible XSS found! Payload reflected in response: {payload}")
            if args.output:
                with open(args.output, "a") as f:
                    f.write(f"{test_url}\n")

解释:

  • args = parse_args():调用刚才定义的函数,获取命令行参数。

  • payloads = load_payloads(...):加载 payload 字典。

  • 遍历每个 payload,替换 URL 中的 test 为 payload。

  • 发起请求(requests.get())并捕获异常。

  • 检查响应中是否回显了 payload,如果是,就打印结果并可选保存。

4.支持自动识别参数并插入payload

目标:程序自动识别所有参数,然后挨个哪这些参数值替换为paylaod,生成多个新URL进行测试

import requests
import sys
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
import argparse

# 默认 XSS payload 列表
DEFAULT_PAYLOADS = [
    "<script>alert(1)</script>",
    "'\"><script>alert(1)</script>",
    "<img src=x onerror=alert(1)>"
]

# ========== 解析参数 ========== #
def parse_args():
    parser = argparse.ArgumentParser(description="XSS 注入检测器")
    parser.add_argument("-u", "--url", required=True, help="目标 URL(带参数)")
    parser.add_argument("-p", "--payloads", help="自定义 payload 字典文件")
    parser.add_argument("--param", help="只测试指定参数(可选)")
    parser.add_argument("-v", "--verbose", action="store_true", help="显示详细信息")
    parser.add_argument("-o", "--output", help="保存结果到文件")
    return parser.parse_args()

# ========== 加载 Payload 文件 ========== #
def load_payloads(filepath):
    if not os.path.exists(filepath):
        print(f"[!] 文件不存在: {filepath}")
        return []
    with open(filepath, "r", encoding="utf-8") as f:
        return [line.strip() for line in f if line.strip()]
        

# ========== 生成注入 URL ========== #
def generate_payload_urls(url, payloads, target_param=None):
    parsed = urlparse(url)
    params = parse_qs(parsed.query)
    
    if not params:
    	print("[!] 未检测到任何参数。")
        return []
    
    result = []
    
    if target_param:
    	if target_param not in params:
            print(f"[!] 参数 {target_param} 不存在。")
            return []

        for payload in payloads:
            new_params = params.copy()
            new_params[target_param] = [payload]
            new_query = urlencode(new_params, doseq=True)
            new_url = urlunparse(parsed._replace(query=new_query))
            result.append((new_url, payload, target_param))
    
     else:
        for param in params:
            for payload in payloads:
                new_params = params.copy()
                new_params[param] = [payload]
                new_query = urlencode(new_params, doseq=True)
                new_url = urlunparse(parsed._replace(query=new_query))
                result.append((new_url, payload, param))

    return result
    
# ========== 执行测试并输出结果 ========== #
def test_payload_urls(payload_urls, verbose=False):
    detected = []

    for url, payload, param in payload_urls:
        if verbose:
            print(f"[*] 正在测试参数 '{param}':{url}")
        else:
            print(f"[*] Testing: {param}")

        try:
            resp = requests.get(url, timeout=6)
            if payload in resp.text:
                print(f"[+] [参数:{param}] 可能存在 XSS 注入:{url}")
                detected.append((url, param, payload))
            elif verbose:
                print(f"[-] [参数:{param}] 未发现反射。")
        except Exception as e:
            print(f"[!] 请求失败:{e}")

    return detected
    

# ========== 保存结果到文件 ========== #
def save_results(output_file, results):
    with open(output_file, "w", encoding="utf-8") as f:
        for url, param, payload in results:
            f.write(f"[XSS] param={param} | payload={payload} | url={url}\n")
    print(f"[+] 结果已保存至:{output_file}")


# ========== 主函数 ========== #
if __name__ == "__main__":
    args = parse_args()

    # 加载 payloads
    if args.payloads:
        payloads = load_payloads(args.payloads)
        if not payloads:
            print("[!] 自定义 payload 加载失败,使用默认 payload。")
            payloads = DEFAULT_PAYLOADS
    else:
        payloads = DEFAULT_PAYLOADS

    # 生成注入 URL
    injected_urls = generate_payload_urls(args.url, payloads, args.param)
    if not injected_urls:
        return

    # 检测
    results = test_payload_urls(injected_urls, verbose=args.verbose)

    # 输出结果
    if args.output and results:
        save_results(args.output, results)


参数类型是否必填说明
-u / --url字符串必须目标带参数的 URL
-p / --payloads字符串(文件路径)可选自定义 payload 文件
--param字符串可选只测试某一个参数(而不是全部)
-v / --verbose布尔值可选是否显示详细信息
-o / --output字符串(文件路径)可选将结果写入文件

示例:

1)自动遍历所有参数

python3 xss_scan.py -u "https://example.com/page?search=test"

2)指定测试参数q

python3 xss_scan.py -u "https://example.com/page?q=test&lang=en" --param q

3)使用自定义payload文件

python3 xss_scan.py -u "https://example.com/page?q=test" -p my_payloads.txt

4)保存检测结果到文件

python3 xss_scan.py -u "https://example.com/page?q=test" -o results.txt

5)详细模式查看全部过程

python3 xss_scan.py -u "https://example.com/page?q=test" -v

5.添加POST请求

1)修改扩展命令行参数,添加POST和data

parser.add_argument("-m", "--method", choices=["GET", "POST"], default="GET", help="请求方法,默认GET")
parser.add_argument("-d", "--data", help="POST请求的数据,格式:param1=val1&param2=val2")

2)修改生成带payload的请求函数,支持GET和POST两种模式

from urllib.parse import urlparse, parse_qs, urlencode, urlunparse

def generate_payload_requests(url, payloads, method="GET", data=None, target_param=None):
    """
    根据请求类型生成带 payload 的请求列表。

    返回格式:
      - GET 请求:(url, None, payload, param)
      - POST 请求:(url, post_data, payload, param)
    """

    results = []

    if method.upper() == "GET":
        parsed = urlparse(url)
        params = parse_qs(parsed.query)

        if not params:
            print("[!] 未检测到任何 GET 参数。")
            return []

        if target_param:
            if target_param not in params:
                print(f"[!] 参数 {target_param} 不存在于 GET 参数中。")
                return []
            for payload in payloads:
                new_params = params.copy()
                new_params[target_param] = [payload]
                new_query = urlencode(new_params, doseq=True)
                new_url = urlunparse(parsed._replace(query=new_query))
                results.append((new_url, None, payload, target_param))
        else:
            for param in params:
                for payload in payloads:
                    new_params = params.copy()
                    new_params[param] = [payload]
                    new_query = urlencode(new_params, doseq=True)
                    new_url = urlunparse(parsed._replace(query=new_query))
                    results.append((new_url, None, payload, param))

    elif method.upper() == "POST":
        if not data:
            print("[!] POST 请求必须提供 data 参数。")
            return []

        post_params = parse_qs(data)

        if not post_params:
            print("[!] 未检测到任何 POST 参数。")
            return []

        if target_param:
            if target_param not in post_params:
                print(f"[!] 参数 {target_param} 不存在于 POST 参数中。")
                return []
            for payload in payloads:
                new_post_params = post_params.copy()
                new_post_params[target_param] = [payload]
                new_post_data = urlencode(new_post_params, doseq=True)
                results.append((url, new_post_data, payload, target_param))
        else:
            for param in post_params:
                for payload in payloads:
                    new_post_params = post_params.copy()
                    new_post_params[param] = [payload]
                    new_post_data = urlencode(new_post_params, doseq=True)
                    results.append((url, new_post_data, payload, param))
    else:
        print(f"[!] 不支持的请求方法: {method}")
        return []

    return results

3)修改请求发送和检测函数

import requests

def test_payload_requests(requests_list, verbose=False):
    detected = []
    for method, url, post_data, payload, param in requests_list:
        try:
            if method == "GET":
                response = requests.get(url, timeout=10)
            else:  # POST
                headers = {"Content-Type": "application/x-www-form-urlencoded"}
                response = requests.post(url, data=post_data, headers=headers, timeout=10)

            if payload in response.text:
                detected.append( (method, url, post_data, payload, param) )
                if verbose:
                    print(f"[+] 发现可能的XSS,参数: {param},Payload: {payload},请求方式: {method}")

            elif verbose:
                print(f"[-] 无XSS,参数: {param},Payload: {payload},请求方式: {method}")

        except Exception as e:
            print(f"[!] 请求异常: {e}")

    return detected

4)修改main

requests_list = generate_payloads_for_request(
        url=args.url,
        payloads=payloads,
        method=args.method,
        data=args.data,
        target_param=args.param
    )

示例:

# GET 模式全参数扫描
python xss_scan.py -u "https://example.com/search?q=test&cat=1" -m GET

# GET 模式只扫描 q 参数
python xss_scan.py -u "https://example.com/search?q=test&cat=1" -m GET --param q

# POST 模式全参数扫描
python xss_scan.py -u "https://example.com/submit" -m POST -d "username=alice&comment=hello"

# POST 模式只扫描 comment 参数
python xss_scan.py -u "https://example.com/submit" -m POST -d "username=alice&comment=hello" --param comment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传输层协议TCP(上)

上一篇https://blog.csdn.net/Small_entreprene/article/details/148143494?fromshareblogdetail&sharetypeblogdetail&sharerId148143494&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 上文学习了传输层的协议之一UDP&#xff0c;接下来…

Windows下安装并使用kubectl查看K8S日志

【1】安装kubectl 官网文档&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下载后得到 kubectl.exe&#xff0c;放到一个目录下&#xff0c;然后配置环境变量。 此时CMD 进入DOS命令窗口 kubectl version【2】配置config文件 其实就是…

Android studio进阶开发(六)--如何用真机通过okhttp连接服务器

我们学过了如何通过okhttp查询网络上已经发布的网页&#xff0c;但我们还需要在做全栈时保证前后端能够交互。 前要课程 okhttp的使用 真机端口连接 安全认证 由于http的安全性较差&#xff0c;在没有安全协议的情况下&#xff0c;使用自己的后端连接会报错&#xff0c;所以…

WeakAuras Lua Script [ICC BOSS 11 - Sindragosa]

WeakAuras Lua Script [ICC BOSS 11 - Sindragosa] 冰冠堡垒Icecrown Citadel 冰龙 辛达苟萨&#xff08;寒冰信标插件&#xff09; 左 &#xff08;绿&#xff0c;黄&#xff09; 中(蓝&#xff0c;紫&#xff09; 右&#xff08;白&#xff0c;橙&#xff09; lua script&…

电脑开机后出现bootmgr is conmpressed原因及解决方法

最近有网友问我为什么我电脑开机后出现BOOTMGR is compressed&#xff0c;这个提示意思是:意思是启动管理器被压缩了&#xff0c;即使重启也无法正常进入系统。原因有很多&#xff0c;大部分是引导出现问题&#xff0c;或选错了启动硬盘所导致的&#xff0c;下面我们来详细分析…

vite配置一个css插件

vite.config.js的plugins执行函数 该例子只是替换一些css,具体内容不重要,主要看形参的运用 // vite-plugin-css.js export default function cssPlugin() {return {name: vite-plugin-css-post, // 插件的名字&#xff0c;Vite 插件必须有名字enforce: post, // 设定插件执…

React+Taro 微信小程序做一个页面,背景图需贴手机屏幕最上边覆盖展示

话不多说 直接上图 第一步 import { getSystemInfoSync } from tarojs/taro;第二步 render() {const cardBanner getImageUrlByGlobal(member-merge-bg.png);const { safeArea, statusBarHeight } getSystemInfoSync();const NAV_BAR_HEIGHT 44;const navBarHeight NAV…

Spring框架学习day4--Spring集成Mybatis(IOC)

Spring集成Mybatis1.添加jar包&#xff08;pom.xml&#xff09;2.配置sqlSessionFactiory&#xff08;spring.xml)3.再service类中注入Dao代理接口4.测试类5文件结构 Spring集成Mybatis Spring集成Mybatis其核心是将SqlSessionFactory交由Spring管理&#xff0c;并由 Spring管理…

【C++ Qt】容器类(GroupBox、TabWidget)内附思维导图 通俗易懂

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” ✍️绪论​&#xff1a; 本章主要介绍了 Qt 中 QGroupBox 与 QTabWidget 控件。QGroupBox 是带标题的分组框&#xff0c;能容纳其他控件&#xff0c;有标题、对齐方式、是否…

SOC-ESP32S3部分:18-串口

飞书文档https://x509p6c8to.feishu.cn/wiki/NqrMw6X8Si6sSqkyPbxcFRxGnid UART全称是通用异步接收器/发送器&#xff0c;ESP32-S3 芯片有 3 个 UART 控制器。每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。 串口文档参考&#xf…

https下git拉取gitlab仓库源码

git init 创建仓库 参考下面创建公私秘钥对 注意不要以root用户身份创建公私钥&#xff0c;确保保存在/home/username GitLab配置ssh key - 阿豪聊干货 - 博客园 Your identification has been saved in /home/xxx/.ssh/id_ed25519 Your public key has been saved in /ho…

距离计算范围查找距离排序

一 使用场景 目前基于某个位置查附近的人&#xff0c;附近的商家等等&#xff0c;查出来的结果添加距离&#xff0c;或者查附近多大范围内的人或者商家&#xff0c;然后按距离排序已经是IT界一个很通用的功能了。 二 距离计算搜索(百万点集以下) 2.1 球的定义 2.2 两点之…

PS linux 基础篇1-AXI_DMA

系列文章目录 文章目录 系列文章目录前言一、AXI DMA ip核二、BD工程三、PS linux工程1.使用开源的xilinx_axidma-master工程验证驱动2.按照其他的开源进行就行&#xff0c;没什么写的了 前言 PL与PS之间快速的接口&#xff0c;本文为LOOP回环测试 一、AXI DMA ip核 MM2S mem…

AI大模型学习三十、ubuntu安装comfyui,安装插件,修改返回405 bug,值得一看喔

一、说明 ComfyUI是一个开源的、基于节点的Web应用。它允许用户根据一系列文本提示&#xff08;Prompt&#xff09;生成图像。 ComfyUI使用扩散模型作为基础模型&#xff0c;并结合 ControlNet、Lora和LCM低阶自适应等模型&#xff0c;每个工具都由程序中的一个节点表示 二、开…

Collection集合遍历的三种方法

1.foreach循环遍历 格式&#xff1a;for&#xff08;元素的数据类型 变量名&#xff1a;数组或集合&#xff09;{ } 2.使用迭代器遍历 方法名称&#xff1a;Iterator<E> iterator&#xff08;&#xff09; 说明&#xff1a;返回集合中的迭代器对象&#xff0c;该迭代…

Taro on Harmony C-API 版本正式开源

Taro 是由京东发起并维护的开放式跨端跨框架解决方案&#xff0c;支持以 Web 的开发范式来实现小程序、H5、原生 APP 的跨端统一开发&#xff0c;从 18 年开源至今&#xff0c;在 GitHub 已累计获得 36,000 Stars。 Taro x 纯血鸿蒙 在过去的一年中&#xff0c;Taro 经历了显…

知识隔离的视觉-语言-动作模型:训练更快、运行更快、泛化更好

25年5月来自PI的论文“Knowledge Insulating Vision-Language-Action Models: Train Fast, Run Fast, Generalize Better”。 视觉-语言-动作 (VLA) 模型通过将端到端学习与来自网络规模视觉-语言模型 (VLM) 训练的语义知识迁移相结合&#xff0c;为机器人等物理系统训练控制策…

[ARM][架构] 02.AArch32 程序状态

目录 参考资料 1.程序状态 - PSTATE 2.用户模式的 PSTATE 信息 2.1.状态标志 2.2.溢出/饱和标志 2.3.大于等于标志 2.4.指令集状态 2.5.IT 块状态 2.6.端序控制 2.7.指令执行时间控制 3.用户模式访问 PSTATE - APSR 寄存器 4.系统模式的 PSTATE 信息 4.1.状态标志…

React---day4

3、React脚手架 生成的脚手架的目录结构 什么是PWA PWA全称Progressive Web App&#xff0c;即渐进式WEB应用&#xff1b;一个 PWA 应用首先是一个网页, 可以通过 Web 技术编写出一个网页应用&#xff1b;随后添加上 App Manifest 和 Service Worker 来实现 PWA 的安装和离线…

ArkUI(方舟UI框架)介绍

ArkUI&#xff08;方舟UI框架&#xff09;介绍 构建快速入门 使用ArkWeb构建页面