自动化安全脚本学习
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"]}# 替换每个参数为 payloadnew_query = {}for param in query: new_query[param] = payload# 构造新的 URLencoded_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 argparsedef 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 requestsif __name__ == "__main__":args = parse_args()target_url = args.urlpayloads = 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}")continueif 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()# 加载 payloadsif args.payloads:payloads = load_payloads(args.payloads)if not payloads:print("[!] 自定义 payload 加载失败,使用默认 payload。")payloads = DEFAULT_PAYLOADSelse:payloads = DEFAULT_PAYLOADS# 生成注入 URLinjected_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¶m2=val2")
2)修改生成带payload的请求函数,支持GET和POST两种模式
from urllib.parse import urlparse, parse_qs, urlencode, urlunparsedef 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 requestsdef 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: # POSTheaders = {"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
相关文章:

自动化安全脚本学习
1.目录扫描器 目标:使用python编写一个自动化目录扫描工具,实现简单信息收集,判断目标网站是否存在常见路径。 import requests #用于发HTTP请求 from concurrent.futures import ThreadPoolExecutor #实现多线程扫描# 扫描目标 target h…...
github公开项目爬取
import requestsdef search_github_repositories(keyword, tokenNone, languageNone, max_results1000):"""通过 GitHub API 搜索仓库,支持分页获取所有结果(最多 1000 条):param keyword: 搜索关键词:param token: GitHub To…...
用豆包写单元测试
用豆包写单元测试, 输入 vue 模板内容,输入 参考vue模板内容写一个单元测试要求用jest.mock实现构造完成,修复bug。npm run test:unit – tests/unit/views/xxx/xxx.spec.js看下 % Stmts 语句覆盖率:执行到的代码语句占总语句的比…...

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

Windows下安装并使用kubectl查看K8S日志
【1】安装kubectl 官网文档:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下载后得到 kubectl.exe,放到一个目录下,然后配置环境变量。 此时CMD 进入DOS命令窗口 kubectl version【2】配置config文件 其实就是…...
Hive 分区详解:从基础概念到实战应用
一、为什么要分区? 1.将大规模数据按规则(如时间、地域)划分到不同目录,提升数据组织性。 2.通过分区过滤,减少扫描数据量,显著提升查询效率。 3.不同分区可对应不同业务线或权限,增强数据隔…...

Android studio进阶开发(六)--如何用真机通过okhttp连接服务器
我们学过了如何通过okhttp查询网络上已经发布的网页,但我们还需要在做全栈时保证前后端能够交互。 前要课程 okhttp的使用 真机端口连接 安全认证 由于http的安全性较差,在没有安全协议的情况下,使用自己的后端连接会报错,所以…...
如何解决网站服务器的异常问题?
当网站服务器出现异常情况,导致用户无法正常访问网页信息的时候,该如何解决这一问题呢?小编下面就带领大家共同探讨一下这一问题。 企业在面对网站服务器异常时,首先要对服务器硬件设备进行详细的检查,可以使用硬盘检测…...

WeakAuras Lua Script [ICC BOSS 11 - Sindragosa]
WeakAuras Lua Script [ICC BOSS 11 - Sindragosa] 冰冠堡垒Icecrown Citadel 冰龙 辛达苟萨(寒冰信标插件) 左 (绿,黄) 中(蓝,紫) 右(白,橙) lua script&…...
用户界面禁忌——基础原则
文章目录 基本原则1:关注用户及其任务,而不是技术基本原则2:首先考虑功能,然后才是表示基本原则3:与用户对任务的看法保持一致基本原则4:设计要符合常见情况基本原则5:不要分散用户对他们目标的…...

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

vite配置一个css插件
vite.config.js的plugins执行函数 该例子只是替换一些css,具体内容不重要,主要看形参的运用 // vite-plugin-css.js export default function cssPlugin() {return {name: vite-plugin-css-post, // 插件的名字,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包(pom.xml)2.配置sqlSessionFactiory(spring.xml)3.再service类中注入Dao代理接口4.测试类5文件结构 Spring集成Mybatis Spring集成Mybatis其核心是将SqlSessionFactory交由Spring管理,并由 Spring管理…...
太阳系运行模拟程序-html动画
太阳系运行模拟程序-html动画 by AI: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>交互式太阳系…...

【C++ Qt】容器类(GroupBox、TabWidget)内附思维导图 通俗易懂
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” ✍️绪论: 本章主要介绍了 Qt 中 QGroupBox 与 QTabWidget 控件。QGroupBox 是带标题的分组框,能容纳其他控件,有标题、对齐方式、是否…...

SOC-ESP32S3部分:18-串口
飞书文档https://x509p6c8to.feishu.cn/wiki/NqrMw6X8Si6sSqkyPbxcFRxGnid UART全称是通用异步接收器/发送器,ESP32-S3 芯片有 3 个 UART 控制器。每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。 串口文档参考…...
CSS 样式表的四种应用方式及css注释的应用小结
CSS样式表的四种应用方式及注释应用小结 一、样式表应用方式 内联样式(行内样式) <div style"color: #ff0000; font-size: 16px;">示例文本</div>特点:直接写在HTML标签的style属性中优先级:最高ÿ…...
五、web安全--XSS漏洞(2)--XSS相关payload
XSS 主要是针对网页客户端的一种攻击,那么就要执行 JavaScript 代码,那么无疑需要用到 JavaScript 语言以及在 HTML 中可以解析 JavaScript 代码的标签。 1、标签类 (1)script <script></script>标签是最直接的 xS…...
AI架构师的新工具箱:ChatGPT、Copilot、AutoML、模型服务平台
AI架构师不仅要懂架构、懂AI服务,还需要具备使用AI工具提升工作效率的能力。新一代AI工具已经成为架构师不可或缺的“工具箱”,帮助他们更高效地进行设计、部署、编码与优化。 以下介绍几类代表性工具,并说明它们在实际架构工作中的应用场景。 一、ChatGPT:生成架构设计文…...
关于智能体接入后端,在Apifox能够传参数给智能体的测试
from flask import Flask, request, jsonify, render_template import requests import json # 用于解析嵌套的 JSON 字符串app Flask(__name__)COZE_BOT_ID 7508736911423963162 COZE_API_KEY pat_cHXqrFzcvtktfmmlp4pjF3O2qmjioQW46uU8UNbUugyvSlFZclklpunc53DbR8ws COZE…...
有铜半孔工艺的制造难点与工艺优化
技术难点剖析 有铜半孔工艺在制造过程中面临多重挑战,主要集中在材料加工精度、孔壁完整性及良率控制三个方面: 铜层翘起与毛刺残留 半孔成型时,铣刀高速切割可能导致孔壁铜层被拉扯,产生翘起或残留铜屑,影响导电性能…...
python分步合并处理excel数据
文章目录 概要整体架构流程技术名词解释技术细节小结概要 客户需求 1. 背景与目标 用户需要将三个包含农业实验数据的Excel表格(AK、AN、AP)合并为一个结构化数据集,用于后续分析。每个表格包含相同类型的字段(如对照组与PSB处理组的样本数、均值、标准差),但需通过字…...
MC0309魔法项链
思路: 以数位贡献的思路来写这题, 统计每一位上为 1 的个数: 对于第 k 位,统计有多少个数在这一位上为 1,记作 cnts[k] 枚举每个数,逐位分析它对整体的贡献(即与其它数交互时的和)…...
为 Ubuntu 安装的软件创建桌面图标
如何为 Ubuntu 安装的软件创建桌面图标(.desktop 启动器) 在 Ubuntu 或其他 Linux 发行版中,我们常常通过压缩包(如 .tar.gz)或官方二进制方式安装软件。这种安装方式虽然灵活方便,但默认并不会将软件添加…...
uni-app 中开发问题汇总
uni-app 中 echarts 中的点击事件失效? 在 main.js 中 设置 window.wx{},这个方式,如果需要调 wx 中的方法会失效(如果默认后续不会调 wx 中的方法推荐使用) 降低版本,安装一个低版本的,比如&a…...

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

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

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

AI大模型学习三十、ubuntu安装comfyui,安装插件,修改返回405 bug,值得一看喔
一、说明 ComfyUI是一个开源的、基于节点的Web应用。它允许用户根据一系列文本提示(Prompt)生成图像。 ComfyUI使用扩散模型作为基础模型,并结合 ControlNet、Lora和LCM低阶自适应等模型,每个工具都由程序中的一个节点表示 二、开…...