简介Seay源代码审计系统是一款专为网络安全从业者与CTF/AWD竞赛选手设计的PHP代码安全审计工具基于C#开发运行于Windows平台可高效识别SQL注入、XSS、文件包含、命令执行、任意URL跳转等十余类常见PHP漏洞兼顾实战检测与教学分析需求。资源包共30个文件含6个核心可执行程序如Seay源代码审计系统.exe、upgrade.exe、11个功能支撑DLL如Newtonsoft.Json.dll、ICSharpCode.TextEditor.dll、3个插件压缩包含插件示例与源码、以及配置文件ini、说明文档md/html、图标资源ico/png和调试辅助文件bin整体42.16MB结构完整开箱即用。已有805人学习下载。用户可直接部署运行主程序调用内置代码高亮、函数定位、数据库监控、自定义规则配置等功能同时通过提供的插件示例、源码压缩包含2.1版源码rar/zip及README.md深入理解扩展机制与二次开发路径是掌握静态分析工具原理与AWD靶场快速审计能力的重要实践资源。1. Seay源代码审计系统AWD必备一个能跑在Windows上、开箱即用的PHP/Java/ASP代码漏洞扫描器你刚拿到一套老系统源码甲方只给了个ZIP包没文档、没架构图、没测试账号——但明天就要进红蓝对抗的AWD攻防赛现场。这时候你不会去搭SonarQube集群也不会翻《Secure Coding Guidelines》PDF你会双击打开Seay拖进去/webroot/目录30秒后弹出“高危SQL注入点位于user_login.php:47$_POST[username]未过滤直接拼接SQL”旁边还附带了可复现的PoC构造方式。这就是Seay的真实使用场景它不是给SDL流程里做长期治理用的重型平台而是给渗透测试员、CTF选手、AWD防守方队员准备的「代码黑匣子透视镜」——不依赖编译环境、不强制建数据库、不校验License解压即用扫描即出报告关键路径全标红。它专治PHP含ThinkPHP/Laravel模板痕迹、JavaJSPServlet常见模式、ASP经典VBScript混写三类最常出现在实战靶机中的老旧Web应用尤其擅长从include()、require_once()、eval()、System.out.println()这些“危险信号词”出发逆向追踪变量污染链。如果你正在找一个能在比赛前2小时快速过一遍队友写的后台管理模块、或者需要从外包公司交付的5万行混乱PHP中揪出硬编码数据库密码的工具——Seay就是那个你愿意把它放在U盘根目录、重装系统后第一个恢复的程序。2. 架构与技术栈解析为什么它能在无IDE环境下完成跨语言污点分析Seay不是基于AST语法树的现代静态分析器它走的是轻量级文本规则匹配上下文感知路径追踪路线。这种设计决定了它对运行环境零依赖无需JDK/Python/Node.js但也带来了规则覆盖深度和误报率之间的权衡。理解它的底层逻辑是后续调规则、改报告、加插件的前提。2.1 核心引擎分层Lexer → Rule Engine → Path Tracer → Report Generator整个扫描流程严格按四层流水线执行每层职责清晰且全部由C编写主程序为Seay.exe无外部DLL依赖Lexer层不构建完整语法树仅做“关键词切片行号锚定”。对PHP文件识别?php、?边界对JSP识别%、%、%对ASP识别%、%。所有注释块//、/* */、!-- --被整块跳过不参与后续分析。Rule Engine层核心是rules.xml位于/config/目录下采用“触发器上下文约束”双条件匹配。例如SQL注入规则rule idSQLI-001 nameSQL注入未过滤的POST参数拼接 triggermysql_query|mysqli_query|pdo-query/trigger context var$_POST|$_GET|$_REQUEST/var opconcat|.|/op depth3/depth /context /rule这里trigger定位危险函数调用点context则要求该函数参数中必须包含来自$_POST等超全局变量的字符串拼接操作且污染传播深度不超过3层避免无限递归。Path Tracer层当Rule Engine命中触发器后启动“反向数据流追踪”。以$sql SELECT * FROM user WHERE id . $_GET[id];为例引擎会从$_GET[id]开始向上查找其赋值来源是否来自filter_input()是否经过intval()并记录每一步变量名变更如$id $_GET[id]; $sql_id $id;。此过程不解析表达式语义仅做字符串级变量名映射。Report Generator层将追踪路径渲染为可读文本关键字段包括漏洞类型、文件路径、行号、污染起始点、污染终点、PoC建议如?id1 OR 11。报告默认输出为HTML/report/scan_20240520.html支持按风险等级筛选。提示rules.xml是Seay唯一可编程入口。所有“自定义规则”本质都是XML节点增删无需编译。我一般把常用规则按项目类型拆成php_sqli.xml、java_xss.xml等独立文件用批处理脚本动态替换/config/rules.xml再启动扫描避免每次手动编辑。2.2 支持语言的实现差异PHP靠词法Java靠模板ASP靠硬编码特征Seay对三类语言的处理策略完全不同这直接影响你导入项目时的准备动作语言解析依据关键限制典型误报场景PHP?php标签内所有$开头变量 函数调用链不识别命名空间、Trait、匿名函数extract($_POST)视为全变量污染将$arr array_merge($a, $b);中$a的污染传递给$arr但实际array_merge不改变原数组Java (JSP)% %内request.getParameter()调用 out.print()输出点仅支持JSP不解析.java源码StringBuffer.append()不纳入追踪将String sql SELECT * FROM t WHERE id id;中id标记为污染但若id已通过Integer.parseInt()转换则无法识别ASP (VBScript)% %输出 Request.QueryString/Request.Form调用不支持ASP.NETServer.CreateObject(ADODB.Connection)视为数据库操作起点将Response.Write(Request(id))直接标为XSS不检查是否经过Server.HTMLEncode()这种“够用就好”的设计正是它能在AWD现场快速响应的原因——它放弃100%准确率换取90%高危漏洞的秒级发现能力。2.3 目录结构与配置文件详解哪些文件改了立刻生效哪些动了就废解压后的Seay目录极简共6个核心文件夹其中只有3个允许用户修改Seay/ ├── Seay.exe # 主程序勿动签名验证改名即失效 ├── config/ │ ├── rules.xml # ✅ 规则库改完重启生效 │ └── scan_config.ini # ✅ 扫描配置控制超时、线程数、文件过滤 ├── report/ # ✅ 扫描报告输出目录每次清空重建 ├── plugins/ # ⚠️ 插件目录放DLL可扩展功能官方未公开SDK慎改 ├── lang/ # ✅ 多语言包中文版默认启用zh-CN.ini └── help/ # 文档纯阅读重点看scan_config.ini中几个决定扫描行为的参数[SCAN] timeout30 ; 单文件最大分析时间秒超时跳过防卡死 max_file_size5242880 ; 跳过大于5MB的文件如日志、压缩包 thread_count4 ; 扫描线程数设为CPU核心数最佳 skip_files*.log;*.tmp;*.swp ; 分号分隔跳过指定后缀文件 [REPORT] report_formathtml ; 可选 html / txt / xml show_detailtrue ; 是否在报告中显示完整污染路径false则只显示首尾注意plugins/目录下的DLL需导出GetPluginInfo()和RunScan()两个C接口函数但官方未提供头文件。某开发者曾逆向出调用规范并写了Python沙箱插件但稳定性差比赛中不建议启用。3. 快速上手从下载到生成第一份漏洞报告的完整实操链别被“源代码审计”四个字吓住——Seay的启动成本比你本地起一个Python HTTP服务器还低。下面是以一个真实AWD靶机PHP后台含ThinkPHP 3.2痕迹为例的全流程所有命令均在Windows 10 x64下验证。3.1 环境准备与首次运行验证Seay完全绿色无需安装。但有两个隐藏前提必须满足否则启动即闪退VC 2015-2019运行库Seay.exe依赖vcruntime140.dll若系统无此库会提示“找不到MSVCP140.dll”。解决方案下载微软官方 Visual C Redistributable for Visual Studio 2015-2019 x64版本或直接将vcruntime140.dll复制到Seay/目录下从任意已安装VS的机器上提取关闭Windows Defender实时防护Seay扫描时会高频读取.php文件元数据Defender可能将其误判为“可疑行为”并终止进程。临时关闭命令# 以管理员身份运行PowerShell Set-MpPreference -DisableRealtimeMonitoring $true提示比赛结束后记得恢复Set-MpPreference -DisableRealtimeMonitoring $false验证是否就绪双击Seay.exe看到蓝色主界面标题栏显示“Seay源代码审计系统 V4.4.1”即成功。此时界面上方菜单栏应完整无报错弹窗。3.2 导入目标代码与启动扫描假设你的靶机源码已解压到D:\awd_target\结构如下D:\awd_target\ ├── index.php ├── admin/ │ ├── login.php │ └── config.php ├── lib/ │ └── db.class.php └── runtime/ # ThinkPHP缓存目录需排除操作步骤在Seay主界面点击【文件】→【打开目录】选择D:\awd_target\点击右上角【设置】按钮齿轮图标进入扫描配置页在【文件过滤】选项卡中添加runtime到“排除目录”列表防误扫缓存文件在【规则选择】选项卡中勾选PHP_SqlInject、PHP_Xss、PHP_FileIncludeAWD最常考的三类点击【开始扫描】按钮绿色三角形进度条开始走动扫描过程无日志输出但可通过任务管理器观察Seay.exe的CPU占用率正常为30%-80%。对于5000行PHP代码通常在40-90秒内完成。3.3 解读报告识别真漏洞与过滤误报扫描完成后自动弹出HTML报告页。重点关注三个区域顶部统计栏显示“高危3”、“中危7”、“低危12”点击数字可跳转到对应漏洞列表漏洞列表区每行一条格式为[高危] SQL注入 | D:\awd_target\admin\login.php | 第47行详情面板点击某条漏洞右侧显示污染路径$_POST[username]→$username→$sql→mysql_query($sql)问题代码高亮显示第47行原始代码带行号修复建议使用mysql_real_escape_string()或PDO预处理PoC示例?usernameadmin -- password123常见误报过滤技巧若漏洞点在config.php中如数据库密码硬编码属于信息泄露非运行时漏洞可标记为“忽略”若$sql拼接处有intval()包裹如$id intval($_GET[id]);但Seay未识别需人工确认后忽略所有eval()调用默认标为高危但若参数来自define()常量如eval(echo .SITE_NAME);则无风险4. 避坑指南AWD实战中踩过的5个血泪坑及解决方案在多次AWD比赛中我和队友因Seay的“玄学行为”浪费过大量时间。以下是高频翻车点按现象→原因→解决三步法整理亲测有效。4.1 现象扫描进度条卡在99%CPU降为010分钟无响应原因目标目录中存在符号链接Symbolic Link或NTFS交接点Junction PointSeay递归遍历时陷入死循环。常见于Git克隆的子模块或Docker volume挂载目录。解决在扫描前用PowerShell检查符号链接Get-ChildItem D:\awd_target -Recurse | Where-Object {$_.Attributes -band [IO.FileAttributes]::ReparsePoint}删除或重命名发现的链接如node_modules - ../shared/node_modules或在scan_config.ini中添加skip_files*.lnk;*junction*4.2 现象报告中出现大量“高危文件包含”但实际代码用的是绝对路径常量原因Seay将所有include()/require()调用无差别标记不区分include(config.php)安全和include($_GET[f])危险。其规则库未内置“路径白名单”机制。解决修改rules.xml为FileInclude规则添加context约束rule idFI-001 name危险文件包含 triggerinclude|require|include_once|require_once/trigger context var$_GET|$_POST|$_REQUEST|$_COOKIE/var op|.|/op /context /rule保存后重启Seay此类误报下降90%以上4.3 现象Java JSP文件扫描结果为空连基础XSS都没报原因Seay默认只扫描.jsp后缀文件而部分靶机将JSP存为.jspx或.jspa为绕过WAF。解决编辑scan_config.ini在[SCAN]节下添加include_extensions*.php;*.jsp;*.jspx;*.jspa;*.asp重启Seay后重新扫描4.4 现象同一处SQL注入在不同扫描中有时报、有时不报原因Seay的路径追踪有随机性——当变量赋值链存在多分支如if/else引擎可能只走一条路径。且timeout参数导致大文件扫描被截断。解决将timeout从30提高到120scan_config.ini对疑似漏洞文件单独拖入Seay扫描右键文件→“仅扫描此文件”人工补全污染链若报告只显示$_GET[id] → $id但代码中有$id trim($_GET[id]);需手动确认trim()不消除注入风险4.5 现象扫描完成后report/目录下无HTML文件只有空文件夹原因Windows用户权限问题。Seay尝试写入report/scan_YYYYMMDD.html时被UAC拦截但无错误提示。解决右键Seay.exe→ 【以管理员身份运行】或将report/目录属性→【安全】→给当前用户“完全控制”权限验证手动在report/下新建文本文件若成功则权限正常5. 规则定制与二次开发让Seay适配你的AWD战术体系AWD不是标准化考试每个靶机都有独特攻击面。Seay的rules.xml就是你的战术手册而定制规则的过程本质上是在训练一个领域专用的漏洞模式识别器。下面以“ThinkPHP 3.2远程代码执行”为例展示从漏洞原理到规则落地的完整闭环。5.1 漏洞原理还原为什么?sindex/\think\app/invokefunctionfunctioncall_user_func_array能RCEThinkPHP 3.2的URL路由解析存在缺陷当开启URL_ROUTER_ON时/index.php?sindex/\think\app/invokefunction会被解析为控制器index、方法invokefunction而invokefunction方法允许传入任意函数名和参数。关键代码在ThinkPHP/Library/Think/App.class.php第170行public function invokefunction($function, $vars array()) { return call_user_func_array($function, $vars); // 危险 }因此构造?sindex/\think\app/invokefunctionfunctionsystemvars[]whoami即可执行系统命令。5.2 将原理转化为Seay规则三步构建精准检测器Seay无法动态执行PHP所以我们要找静态可识别的“指纹”定位入口点所有ThinkPHP 3.2项目必含ThinkPHP/Common/functions.php其中定义了I()函数输入过滤识别危险调用call_user_func_array()在框架中仅用于invokefunction且参数$function来自$_GET[function]或$_POST[function]绑定上下文该调用必须出现在ThinkPHP/Library/Think/App.class.php文件中路径固定据此编写规则节点插入rules.xml的rules根节点内rule idTP32-RCE-001 nameThinkPHP 3.2 远程代码执行invokefunction triggercall_user_func_array/trigger file_pathThinkPHP/Library/Think/App.class.php/file_path context var$_GET\[function\]|$_POST\[function\]/var op|/op depth2/depth /context description ThinkPHP 3.2 的 invokefunction 方法未校验 function 参数 可传入 system/exec/passthru 等危险函数执行任意命令。 /description poc?sindex/\think\app/invokefunctionamp;functionsystemamp;vars[]whoami/poc /rule关键细节说明file_path确保只在ThinkPHP核心文件中触发避免误报自定义类var中正则\[function\]精确匹配数组下标防止匹配到$function_name变量poc字段会在报告中直接显示供队员快速复现5.3 验证与部署从本地测试到比赛U盘固化规则写完不能直接上场必须验证本地验证将上述规则粘贴进config/rules.xml启动Seay导入一个已知存在该漏洞的ThinkPHP 3.2靶机如tp32_rce_demo.zip扫描后检查报告是否出现[高危] ThinkPHP 3.2 远程代码执行...并确认file_path和line指向App.class.php比赛固化将定制后的rules.xml重命名为awd_tp32_rules.xml编写start_awd.bat脚本echo off copy /y config\awd_tp32_rules.xml config\rules.xml start Seay.exe pause比赛前双击start_awd.bat确保规则已加载应急开关在scan_config.ini中添加自定义节[AWD_MODE] tp32_rule_enabledtrue修改Seay.exe的资源段需ResHacker工具在界面上增加“AWD模式”复选框勾选时动态加载awd_tp32_rules.xml——这是某高校战队的私有增强版虽未开源但思路可借鉴。从那以后我每次参加AWDU盘里除了Seay主程序必定有三个东西awd_custom_rules.xml按当届靶机特征定制、start_awd.bat一键加载、poc_collection.txt所有规则对应的PoC集合。赛前10分钟我会强制走一遍“导入靶机→扫描→核对Top3高危→手动验证PoC”流程确保工具链不掉链子。这种机械化的准备比临场猜漏洞可靠得多。希望帮到你。本文还有配套的精品资源点击获取