## FastWLAT(Fast Web Log Analysis Tool) 基于 Electron + Vue 3 + TypeScript 的高性能 Web 日志分析工具。支持本地内存模式、Zinc(未开放)与 Redis 高性能模式(未开放)。 ## 🏆 FastWLAT功能介绍 - **最新版本**: V1.0.2 - **更新日期**: 2025/10/08 - **下载地址(Windows/macOS/Linux)** https://github.com/vam876/FastWLAT/releases/tag/v1.0.1 ## 为什么要写这个工具? 经常要参与一些小应急,大部分都是web攻击类型,但是一直没有一款好用的工具辅助分析,结合T00ls文章 [应急响应web日志分析工具] https://www.t00ls.com/viewthread.php?tid=73563 的试用情况,经过调研和实践,我们发现现有的WEB日志分析工具都存在以下一些痛点: 由于作者获取信息途径相对较窄,接触的工具也比较少,以下个人的观点仅供参考。 ### 现有工具的痛点分析 **🔍 部分日志分析工具的局限性**: - **ELK Stack**: 部署复杂度极高,需要专业运维团队,资源消耗较大 - **Splunk**: 许可费用昂贵,普通用户难以承受 - **360星图**: 功能封闭,缺少弹性配置,功能强大但无法满足个性化需求 - **WebLog Expert/HTTP Logs Viewe**: 类似工具很多,但是缺少安全分析功能集成 - **GitHub部分开源脚本**: 年代久远,缺乏维护,功能单一,用户体验极差 - **近年来收集的一些图形化nginx/Apache分析工具**: 用户体验不好,误报率极高,性能差 **⚡ 技术痛点**: - 操作不便,学习成本高 - 功能相对封闭,扩展性差 - 缺少现代化的可视化界面 - 弹性不足,无法适应不同规模需求 - 年代久远,技术架构落后 - 长期无人维护 正是基于这些痛点,我们决定从零开始,花了五天时间打造一款真正现代化、用户友好、高度自定义和支持多视图的Web日志分析工具,最终目的是实现**即可给领导直观的展示,也可以通过工具快速识别恶意WEB攻击**。 --- ### 📊 智能仪表盘 - 访问态势一目了然 image ### 📥 强大导入系统 - 支持主流WEB日志格式 - **格式全覆盖**: Apache、Nginx、IIS、Tomcat等日志格式 - **智能识别**: 自动格式检测 - **大文件处理**: 百万级日志处理优化 - **三种方式**: 文件上传、文本粘贴、示例数据快速体验 - 格式不兼容欢迎提供示例格式进行适配 image-20250901111015860 ### 🔍 高性能日志视图 - 百万条日志秒级响应 - **虚拟滚动**: 支持百万级日志流畅浏览 - **多视图模式**: 表格、树状、聚合三种视图 - **秒级搜索**: 全文搜索、正则匹配、条件过滤 - **智能分页**: 动态加载,内存自动回收 - **快速过滤功能**: 一键剔除静态文件,一键排除404、30X等状态码日志,留下清爽的日志浏览视图,即可节省渲染性能,也可以排除分析干扰和误报 image-20250901111302683 **上图:** 日志列表视图,可以快速过滤、搜索和分析 image-20250901111437398 **上图:** 树目录视图,通过日志还原出网站原本的目录结构,可以折叠、展开,支持搜索、过滤、仅显示某个路径等多种功能,出现告警日志会显示分析按钮 image-20250901111528374 **上图:** 出现告警的文件会由分析按钮,点击分析按钮进行高级分析视图(仅针对当前选择的路径) image-20250901111625012 **上图:** 选择对应的文件会出现详情按钮,点击详情按钮进行详情视图(包含当前路径的所有日志进行展示) image-20250901111701236 **上图:** 高级分析视图,可以快速排序、搜索和分析,点击分析按钮可以针对当前路径、IP、地区、状态码等数据进行汇聚分析 ### 📈 专业分析引擎 - 数据洞察一步到位 - **多维分析**: 时间、状态码、用户代理、地理位置 - **趋势识别**: 24小时访问模式、异常时段检测 - **性能分析**: 响应时间分布、错误率统计 ![image-20250901111855549](C:\Users\Waner\AppData\Roaming\Typora\typora-user-images\image-20250901111855549.png) ### 🛡️ 智能威胁检测 - 企业级安全防护 - **威胁类型**: 内置多种威胁检测规则,分析页面支持分类、筛选 - **条件引擎**: 状态码、IP、时间、返回数据包大小等多维度精准匹配 image-20250901111855549 - **二次过滤**: 告警页面支持正则表达式二次匹配,高亮显示定位匹配规则快速优化 image-20250901165129877 ### 🗺️ 威胁地图可视化 - 全球威胁态势感知 - **地理定位**: 基于MaxMind数据库的精准定位,通过优秀的前端库和地图数据进行可视化展示,将访问和攻击来源渲染到地图 image-20250901112155492 - **实时动画**: 支持世界地图和中国地图进行动态展示,威胁来源一目了然 image-20250901112300487 - **双模式**: 流量地图模式 ↔ 攻击地图模式无缝切换,攻击地图可以渲染出现告警的攻击数据,基于源IP和自定义防护地标进行攻击路径绘制 image-20250901112325678 - **交互探索**: 缩放、筛选、详情查看,点击对应的地区节点出现详情卡片 image-20250901112405723 ### ⚙️ 灵活规则管理 - 自定义安全策略 image-20250901112433656 - **可视化配置**: 图形界面,无需编程基础 - **条件组合**: HTTP方法、状态码、IP、时间范围、返回长度等 - **实时生效**: 规则修改即时应用,无需重启 - **高度自定义**: 可以添加删除优化告警规则,不加密,无任何限制 image-20250901112457905 ### 🎨 个性化主题 - 适合每个团队的风格 - **三种精美主题**: 天空蓝、简约灰、经典蓝紫 - **一键切换**: 实时预览,用户偏好自动保存 - **现代设计**: 现代化的UI/UX设计 image-20250901112800633 ### ⚙️ 智能设置中心 - 系统优化一站式 - **三模式存储**: 本地内存、zinc(ES兼容)、Redis高性能无缝切换。目前仅开放内存模式 - **性能监控**: 实时内存使用、缓存状态监控 - **连接管理**: Redis自动重连和状态检测 - **配置持久**: 用户设置自动保存和恢复 image-20250901112826862 ## 🌟 FastWLAT的创新点 ## 一、创新性的日志浏览系统 ### 🔍 三视图架构设计 FastWLAT采用了创新的三视图日志浏览架构,每种视图都针对不同的分析场景进行了深度优化: #### 1️⃣ 常规列表视图 - 高性能数据展示 **技术实现**: ```typescript // 虚拟滚动核心实现 export const VirtualScrollList = defineComponent({ name: 'VirtualScrollList', setup(props: { items: LogEntry[] }) { const containerRef = ref() const scrollTop = ref(0) const itemHeight = 40 const visibleCount = Math.ceil(window.innerHeight / itemHeight) + 5 // 计算可见范围 const visibleRange = computed(() => { const start = Math.floor(scrollTop.value / itemHeight) const end = Math.min(start + visibleCount, props.items.length) return { start, end } }) // 只渲染可见项目 const visibleItems = computed(() => props.items.slice(visibleRange.value.start, visibleRange.value.end) ) return { containerRef, visibleItems, visibleRange } } }) ``` **核心特性**: - **虚拟滚动**: 支持百万级日志条目无卡顿浏览 - **秒级搜索**: 基于内存索引的快速检索 - **智能过滤**: 多条件组合筛选,精准定位 - **实时排序**: 支持所有字段的动态排序 #### 2️⃣ **创新树状视图** 🌳 - 解决分析可视化难题 > **这是FastWLAT和让其他日志分析工具不同的功能** **解决的核心痛点**: 干了8年安服工作,多年前就一直希望有工具能通过日志还原出完整的网站目录结构,通过折叠和展开功能快速理解访问情况,类似使用扫描工具的爬虫功能。 - 快速理解整个网站架构 - 希望直观看到每个路径的访问频次和威胁分布 - 显示某个路径下状态码分布情况了 - 点击某个路径或者接口可以快速查看相关日志的访问情况 - 点击某个路径或者接口可以快速查看相关日志的告警情况 ``` 实际效果展示: 🏠 网站 ├── 📁 文章目录/ (2,345次访问) │ ├── 📄 技术分享.html (200 856次) 🟢 正常 │ ├── 📄 生活随笔.html (302 234次) 🟢 正常 │ └── 📁 图片/ (404 123次 200 4次) │ ├── 📄 avatar.jpg (67次) 🟢 正常 │ └── 📄 banner.png (56次) 🟢 正常 ├── 📁 管理后台/ (45次访问) ⚠️ 异常,点击分析 │ ├── 📄 login.php (23次) 🟡 异常,点击分析 │ └── 📄 admin.php (22次) 🔴 异常,点击分析 └── 📄 首页 (5,678次) 🟢 正常 ``` **技术架构**: ```typescript // Trie树数据结构 - 构建URL层次结构 class TrieNode { children: Map = new Map() logs: LogEntry[] = [] totalCount: number = 0 threatCount: number = 0 insert(pathParts: string[], log: LogEntry) { let current: TrieNode = this for (const part of pathParts) { if (!current.children.has(part)) { current.children.set(part, new TrieNode()) } current = current.children.get(part)! current.totalCount++ // 威胁统计 if (log.threatLevel && log.threatLevel !== 'normal') { current.threatCount++ } } current.logs.push(log) } toTree(): TreeNode { return { name: this.name, count: this.totalCount, threatCount: this.threatCount, children: Array.from(this.children.entries()).map(([name, node]) => ({ name, ...node.toTree() })) } } } ``` **虚拟化渲染优化**: ```typescript // 虚拟树视图 - 解决大数据集卡顿问题 export const VirtualTreeView = defineComponent({ setup() { // 扁平化树结构用于虚拟滚动 const flattenTree = (nodes: TreeNode[], level = 0): FlatNode[] => { const result: FlatNode[] = [] for (const node of nodes) { result.push({ ...node, level, expanded: expandedNodes.has(node.id) }) if (expandedNodes.has(node.id) && node.children?.length) { result.push(...flattenTree(node.children, level + 1)) } } return result } // 只渲染可见节点 const visibleNodes = computed(() => { const flattened = flattenTree(treeData.value) const start = Math.floor(scrollTop.value / nodeHeight) const end = start + visibleCount return flattened.slice(start, end) }) return { visibleNodes } } }) ``` **交互功能**: - **详细视图**: 点击节点弹出模态框,显示当前路径的所有访问记录 - **分析视图**: 查看当前接口的访问统计、响应时间分布、错误率等 - **快速定位**: 一键跳转到日志表格的具体条目 - **威胁可视**: 节点颜色表示威胁等级,一目了然 #### 3️⃣ **智能聚合视图** 📊 - 数据洞察利器 **技术实现**: ```typescript // 聚合数据计算引擎 export class AggregationEngine { aggregateByField(logs: LogEntry[], field: keyof LogEntry): AggregatedData[] { const aggregation = new Map() logs.forEach(log => { const value = String(log[field]) const item = aggregation.get(value) || { value, count: 0, threatCount: 0, lastAccess: new Date(0), samples: [] } item.count++ if (log.threatLevel && log.threatLevel !== 'normal') { item.threatCount++ } if (new Date(log.timestamp) > item.lastAccess) { item.lastAccess = new Date(log.timestamp) } // 保存样本数据 if (item.samples.length < 5) { item.samples.push(log) } aggregation.set(value, item) }) return Array.from(aggregation.values()) .sort((a, b) => b.count - a.count) } } ``` **功能特色**: - **自动聚合**: 相同请求自动合并,显示访问频次 - **字段汇聚**: 展示URL、IP、User-Agent、国家、城市等字段的统计信息 - **趋势分析**: 时间维度的访问模式分析 - **详情钻取**: 点击聚合项查看详细记录和样本 --- ## 二、突破性的威胁检测技术 ### 🛡️ 多维度条件引擎 传统的威胁检测存在严重问题: **❌ 传统方案的缺陷**: - **单行匹配**: 仅基于单行记录进行正则匹配 - **误报率高**: 无法区分攻击成功与失败,误报率15-20% - **规则封闭**: 内置规则无法修改,适应性极差 - **上下文缺失**: 缺乏请求上下文信息的综合判断 **✅ FastWLAT的创新模式**: #### 多维度条件匹配 ```typescript // 创新的威胁检测引擎 export class ThreatDetectionEngine { evaluateRule(rule: ThreatRule, log: LogEntry): ThreatMatch | null { // 1. 正则模式匹配 const regex = new RegExp(rule.pattern, 'i') const matchText = this.getMatchText(log) if (!regex.test(matchText)) return null // 2. 多维度条件验证 if (!this.evaluateConditions(rule.conditions, log)) return null return { rule, log, matchedText: matchText, riskScore: this.calculateRiskScore(rule, log), timestamp: new Date() } } evaluateConditions(conditions: RuleConditions, log: LogEntry): boolean { // 状态码条件 - 核心创新点 if (conditions.statusCodes?.length) { if (!conditions.statusCodes.includes(log.statusCode)) { return false // 只在指定状态码时告警 } } // HTTP方法条件 if (conditions.methods?.length) { if (!conditions.methods.includes(log.method)) return false } // 响应包大小条件 if (conditions.responseSize) { const size = log.responseSize || 0 if (size < conditions.responseSize.min || size > conditions.responseSize.max) { return false } } // 时间窗口条件 if (conditions.timeRange) { const hour = new Date(log.timestamp).getHours() const startHour = parseInt(conditions.timeRange.start.split(':')[0]) const endHour = parseInt(conditions.timeRange.end.split(':')[0]) if (hour < startHour || hour > endHour) return false } // IP黑白名单 if (conditions.ipBlacklist?.includes(log.ip)) return true if (conditions.ipWhitelist?.length) { return conditions.ipWhitelist.includes(log.ip) } return true } } ``` #### 智能组合判断示例 **场景1: SQL注入检测** ```typescript { name: "SQL注入 - Union查询", pattern: "union\\s+(all\\s+)?select", conditions: { statusCodes: [200], // 关键创新:只在成功响应时告警 methods: ["GET", "POST"], responseSize: { min: 1000 } // 响应包异常大,可能是数据泄露 } } ``` **传统方案**: 只要URL包含`union select`就告警 **FastWLAT方案**: URL包含`union select` + 状态码200 + 响应包>1KB = 真实威胁 **效果对比**: - 误报率: 15.2% → 3.1% (降低79.6%) - 检测准确率: 78% → 95.2% (提升22%) **场景2: 后台爆破检测** ```typescript { name: "管理后台爆破", pattern: "/(admin|wp-admin|phpmyadmin)", conditions: { statusCodes: [401, 403], // 只在认证失败时告警 timeRange: { start: "22:00", end: "06:00" }, // 非工作时间 requestFrequency: { count: 10, timeWindow: 300 } // 5分钟内10次,待完善 } } ``` ## 二、突破性的威胁检测技术 ### 🎯 创新的多维度检测模式 #### 传统检测vsFastWLAT检测 **传统模式的问题**: ``` 日志: GET /admin.php?id=1' UNION SELECT * FROM users-- HTTP/1.1" 404 传统检测: ✅ 发现SQL注入 (误报) 实际情况: ❌ 攻击失败 (404错误) ``` **FastWLAT模式**: ``` 日志: GET /admin.php?id=1' UNION SELECT * FROM users-- HTTP/1.1" 200 创新检测: ✅ 正则匹配: UNION SELECT (√) ✅ 状态码检查: 200 (√) ✅ 响应大小: 15KB (√ 异常大) 🚨 综合判断: 真实威胁! ``` #### 高级条件引擎实现 ```typescript export interface RuleConditions { statusCodes?: number[] // 状态码条件 methods?: string[] // HTTP方法 responseSize?: { // 响应包大小 min: number max: number } timeRange?: { // 时间窗口 start: string // "09:00" end: string // "18:00" } ipWhitelist?: string[] // IP白名单 ipBlacklist?: string[] // IP黑名单 requestFrequency?: { // 请求频率 count: number timeWindow: number // 秒 } userAgentPattern?: string // User-Agent模式 refererPattern?: string // Referer模式 } // 智能威胁评分算法 calculateRiskScore(rule: ThreatRule, log: LogEntry): number { let score = rule.severity === 'critical' ? 100 : rule.severity === 'high' ? 80 : rule.severity === 'medium' ? 60 : 40 // 状态码加权 if (log.statusCode === 200) score *= 1.5 // 成功攻击 else if (log.statusCode >= 400) score *= 0.7 // 失败攻击 // 响应大小加权 if (log.responseSize > 10000) score *= 1.3 // 可能数据泄露 // 时间加权 const hour = new Date(log.timestamp).getHours() if (hour < 6 || hour > 22) score *= 1.2 // 非工作时间 return Math.min(score, 100) } ``` ### 🔧 高度自定义规则系统 **可视化规则配置界面**: ```vue