尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Seay源码审计系统实战:AWD比赛PHP后门与危险函数排查

发布时间:2026/9/29 1:12:08

资讯中心
01
ARTICLE

Seay源码审计系统实战:AWD比赛PHP后门与危险函数排查

Seay源码审计系统实战:AWD比赛PHP后门与危险函数排查
简介Seay源代码审计系统是一款基于C#开发的PHP代码安全性审计工具主要运行于Windows平台面向网络安全学习者、CTF/AWD竞赛选手及代码审计工程师。软件可覆盖SQL注入、代码执行、命令执行、文件包含、文件上传、XSS跨站、任意URL跳转等漏洞场景并具备一键审计、代码调试、函数定位、插件扩展、自定义规则配置、数据库执行监控等数十项功能适合在代码审计与攻防实战中快速定位风险点。资源包共30个文件大小42.16MB包含exe主程序、dll依赖库、rar资料压缩包、bin数据文件、zip源码包及若干txt、html、php、ini说明与示例文件dll提供运行支撑rar内含审计资料与插件示例zip为2.1完整源码。压缩包附带了可执行程序、源码、插件示例和整理好的审计资料便于直接运行体验也能深入分析实现原理或做二次开发扩展。已有801人学习下载适合希望夯实PHP代码审计能力、备战AWD比赛的读者。1. Seay源代码审计系统AWD里没人愿意慢慢翻代码AWDAttack With Defense比赛里最磨人的不是写EXP而是你连对方网站跑的是什么框架、哪个文件里藏了后门都不知道。翻源码翻到眼花等你定位到漏洞隔壁队早就把flag提走了。Seay源代码审计系统就是干这个的——它把PHP源码审计从“人肉通读”变成“半自动扫描人工复核”你只需要把目标源码搁进去它就能按危险函数、参数来源、代码执行链路这几个维度把可疑点全筛出来你再去人工确认就是了。这个工具适合三类人第一次打AWD的新手用它做开局侦察能省掉两小时的无头苍蝇式翻代码带队的学长拿它快速定位对方常见小后门以及日常做代码审计的运维用它清洗开源CMS的第三方插件。它不是万能的误报也多到能吓死人但能把“从零开始找洞”变成“从一百个候选里挑真洞”这就是它最大的价值。2. 安装与环境准备先把工欲善其事这件事做对2.1 这工具什么来头为什么要用Windows跑Seay源代码审计系统是C写的Windows桌面程序不是跨平台的——跟那些Java写的、跑在命令行里的开源审计工具完全是两路子。它不需要安装解压出来是一个EXE直接双击跑连环境变量都不配。但正因为它是个Windows GUI程序在AWD现场你面临的第一个问题往往是靶机是Linux你手里的审计机是Windows两边怎么配合我的一般做法是本地Windows跑Seay做静态审计然后配合Sublime Text或VS Code打开同一个源码目录做动态跟进。Seay负责“哪里可疑”编辑器负责“为什么可疑”。千万别在Seay里改代码它的编辑体验远不如正经编辑器。还有个坑要说清楚Seay默认带的是PHP 5.x时代的正则规则集对现代的PHP 7/8项目识别率会下降特别是那些用了命名空间、闭包、魔术方法的框架代码误报率奇高。后面第5章会细说怎么调。2.2 首次打开界面布局与三个必须改的设置第一次打开Seay你会看到左侧是文件树中间是你的审计界面下方是“调试信息”和“危险函数”列表。这个布局跟专业IDE没法比但它确实有四个区域是你日常要盯的左侧文件树跟Windows资源管理器差不多但专门过滤了.git、.svn这类版本控制目录避免审计时被无关文件淹没中间代码窗口默认打开你选中的文件关键词高亮只有最简单的几种下方的危险函数列表这是Seay的核心输出每一行是一个“疑似漏洞点”带文件名、行号、危险函数名和参数来源右侧的“函数/变量/常量”树点变量名可以看它在这个文件里的所有引用点这个对跟踪参数传递特别有用。打开后先别急着扫把三个设置改掉。第一菜单栏“选项→配置→扫描选项”里把“包含全局变量”勾上否则$_GET、$_POST这类超全局变量不会被追踪。第二把“扫描文件类型”默认的php/phtml改成php/phtml/inc很多CMS的模板文件用的是.inc后缀不加上会漏扫。第三“配置→编辑器→字体大小”调到14以上长时间盯代码眼睛会废。提示Seay对中文路径支持有问题。把源码解压后放在D:\seay_test\source这类纯英文路径下否则会出现“找不到文件”的诡异报错。2.3 和PHPStudy配合本地调试是审计的后悔药静态审计只能告诉你这里可能有问题不能告诉你这个问题能不能打穿。所以本地要装一套PHPStudy或者小皮面板配好和靶机一致的PHP版本和MySQL版本。Seay自带的“代码调试”功能可以单步执行但那个默认断点设置得很傻你更常用的做法是Seay输出可疑点后去本地跑一下这个文件看它实际输出是什么。比如Seay报eval($_POST[x])可疑你在本地把$_POST[x]改成phpinfo()看看页面是否真的执行了。这一步能帮你过滤掉大约三成“看起来危险但实际被过滤或无法触发”的误报。AWD比赛里时间紧本地验证一定要快所以PHPStudy不用装最新版装5.4/5.6/7.0这三个版本就够了8.0以上反而不一定匹配靶机。3. 用Seay跑通一次PHP源码审计的最小闭环3.1 新建项目与导入源码别直接拖文件夹有同学喜欢直接把靶机源码文件夹往Seay窗口里拖这样做的结果通常是“文件树加载不全”或者“扫到一半卡死”。正确流程是菜单“项目→新建项目”填一个项目名然后选择源码根目录。Seay会自己扫描目录结构生成一个.spj项目文件。导入完成后第一步不是点“自动审计”而是先看一下“文件统计”。如果源码有几千个文件自动审计会耗掉大量时间这时你要在“项目设置→排除目录”里把vendor/、node_modules/、uploads/、cache/这些目录排除掉。uploads里如果是用户上传的shell那已经不是源码审计问题了是文件上传漏洞的问题vendor里的第三方库漏洞那是另一套检测逻辑不是Seay的强项。# 排除目录的正则写法示例在排除目录里填 [/\\\\](vendor|node_modules|cache|logs|uploads|runtime)[/\\\\]这条正则的意思是匹配路径中任意位置出现的vendor等目录名两边带路径分隔符。Seay用的是正则过滤你如果只写vendor它会把所有名字里带vendor的文件都排除掉比如vendor_backup.php这种所以前后要跟分隔符。填完后重新加载项目文件树会干净很多。3.2 自动审计先看高危再看可疑点“自动审计”按钮Seay会弹出扫描选项窗口。这里有几项要特别说明“危险函数”是必勾的它是Seay的核心规则覆盖了eval、system、exec、shell_exec、include、require、unlink、file_put_contents、assert、preg_replace带e修饰符的情况这些“代码注入”和“SQL注入”建议单独勾选因为它们用的是不同的正则模式混在一起扫会拖慢速度“自定义规则”第一次用先不勾等你跑熟了规则格式第6章会说再启用。扫描过程是滚动的左下角能看到正在扫描的文件路径。扫完后的输出列表按照“高危险”“中危险”“低危险”排列。不要急着一条条看先看高危险里有没有eval、assert、system这一类的“直接执行”点这些是AWD里第一优先级的后门通道。只要出现“参数来源: $_GET/$_POST/$_REQUEST”“危险函数: eval/system/assert”这个组合基本就是可以直接利用的漏洞或者恶意后门。// 典型高危可直接RCE ?php // 参数来源是用户输入直接进了eval eval($_POST[x]); ?逻辑说明这段代码是第一类要重点确认的$_POST[x]是用户可控的输入eval会把它当PHP代码执行。Seay报出“高危险”的依据就是参数来源和危险函数的组合不是单纯看到eval就报。这里要强调看到这种代码先别激动AWD里很多是“兔子洞”或者蜜罐——对方故意放一个明显的shell你一访问就触发流量告警直接被裁判扣分。正确验证方式是本地执行一个无害的phpinfo()验证执行点存在再确认没有WAF拦截最后才考虑拿flag。3.3 代码调试功能用“黑匣子”看参数怎么流动Seay的代码调试功能本质是本地模拟执行不是真正连数据库或外部服务。选中一个文件点“调试”按钮它会弹出调试窗口左侧是变量监视列表右侧是代码执行进度。你可以给$_GET和$_POST赋值然后看程序怎么跑。这个功能我平时用得不多因为对复杂的框架代码支持很差——它没法正确处理Composer的自动加载机制。但有一种情况它特别有用看单个文件的变量传参链。比如Seay报了一个include点你需要确认用户输入的参数能不能从入口文件传到这个include的地方用调试模式手动给参数传值走过几个if分支你就知道这个点是不是真的可控了。这里有个技巧调试模式底下方的“过滤规则”标签页会把你配置的全局过滤规则比如全局的addslashes、htmlspecialchars自动应用到变量上。如果你在配置里填了全局过滤规则Seay会认为所有用户输入都经过了过滤于是危险级别降低——这其实是误报率高的一个原因。用了框架的项目入口文件确实会做统一过滤但那种过滤往往只防SQL注入不防文件包含和命令执行Seay会把它们一视同仁降级所以看到“低危险”也不能完全放过。3.4 SQL注入的检测逻辑与手工复核姿势Seay找SQL注入的规则不全靠正则它还会做一个简单的参数追踪看一个变量从$_GET到SQL语句拼接之间是否经过了转换。但它不会做真正的数据流分析比如跨文件追踪所以你经常看到它报select * from user where id$_GET[id]这种醒目的注入点却漏掉M(user)-where($map)-find()这种框架写法。对MVC框架的审计Seay的作用是缩小范围而不是直接定位。比如ThinkPHP 3.x的常见注入Seay往往报不出来但如果你在Seay的全局查找功能里搜where(把所有的条件拼接点列出来再配合Seay的变量引用追踪右键变量名→“查找引用”就能找到框架封装后的注入链。-- 手工验证SQL注入是否成立 -- 本地测试先试真值再试假值 SELECT * FROM user WHERE id 1 AND 11; -- 真值应该正常返回 SELECT * FROM user WHERE id 1 AND 12; -- 假值返回为空则存在注入参数说明这两条SQL不是让你往靶机上打的而是在本地把Seay报的可疑SQL点复制出来用真实的数据库结构跑一遍确认参数拼接处没有经过类型转换或转义。如果id1 AND 12返回空说明id的值确实拼进了SQL条件里那么用1 AND (SELECT 1 FROM (SELECT SLEEP(3))a)就能做时间盲注。时间盲注在AWD里是常用手段但一定注意别用堆叠查询去打比赛数据库——极大概率触发裁判系统告警。4. AWD实战场景Seay在比赛前两小时怎么用4.1 开局侦察三分钟决定先看哪个网站AWD的典型开局是你拿到三个靶机IP源码包是同一个CMS加每个队自己的暗改。别急着每台都全量扫——先抽一台扫出全部高危点再对比另外两台的文件哈希找出“不同文件”只审这几台之间不一样的代码。这里有个具体可操作的做法在Windows下用Beyond Compare或直接命令行对比。先把三台靶机的源码下载成三个目录# 在审计机上做目录对比找出三份源码的差异文件 diff -rq target_A/ target_B/ diff_AB.txt diff -rq target_A/ target_C/ diff_AC.txt-r是递归-q是只报告哪些文件有差异而不输出具体内容。diff_AB.txt里出现的文件就是B队在A的基础上改过的文件重点审计这些就行。一般在common、include、config这几个目录下差异文件通常不会超过二十个。把差异文件按Seay能识别的方式单独建一个项目扫一遍速度快得多。4.2 文件监控与批量查杀Seay的“系统”按钮不是摆设Seay主界面上有一个“文件监控”功能很多人以为这只是个摆设。它的原理是定期扫描指定目录的文件哈希发现新增或修改的文件就报警。在AWD里这就是你的小后门检测器——对方攻破你的服务器后第一个动作往往是往你的目录里写一个shell.php文件监控能在几秒钟内告诉你“你的地盘被人动了”。# 配合Seay文件监控的哈希快照命令 find /var/www/html -type f -name *.php -exec md5sum {} \; /tmp/php_snapshot.txt逻辑说明find列出所有PHP文件md5sum为每个文件生成哈希输出重定向存作基线快照。比赛期间隔几分钟跑一次和基线比对新增或哈希变化的文件。Seay的文件监控在Windows上对网络共享目录的扫描有延迟所以Linux靶机上用命令做快照是更可靠的做法。如果你拿到的是Docker环境直接把这一串写进crontab里每分钟跑一次也行但要留意不要生成太多文件拖垮IO。4.3 应急对方已经打进来Seay怎么帮你找后门应急场景下对方已经破坏了你的网页源码需要快速确认后门藏在哪。Seay这时候的作用不是“审计”而是“特征搜索”。用它的全局搜索功能搜这几条正则(eval|assert|call_user_func|array_map|system)\s*\(\s*\$_(GET|POST|REQUEST|COOKIE)(preg_replace|preg_filter)\s*\(\s*[]/(.*?)/e[]move_uploaded_file\s*\(|file_put_contents\s*\(\s*\$_(GET|POST)这三条分别对应直接命令执行/代码执行、preg_replace的e修饰符后门、文件上传和写马。搜索结果按“文件→行号”展示双击直接跳转。找到可疑文件后不要急着删先改名加.bak保留现场做流量分析。关于查杀后门有一个玄学经验很多后门代码会故意拆成一句话——比如$_a.s.s.e.r.t;$_($_POST[x]);——就是为了绕正则匹配。这种拆解法Seay直接扫不出来但因为它在同一文件里连续出现了用户输入和动态函数调用Seay的“危险变量”标签页反而会把这些片段兜住。所以应急时除了看高危列表也要顺手翻一遍“变量引用”面板里被标注为“受污染数据”的变量。4.4 AWD的规则红线哪些事情Seay帮不了你Seay是静态审计工具它能告诉你有什么洞但不能告诉你洞能不能打。在AWD赛场上有三条红线必须记住打点之前先看规则。很多比赛禁止使用真实攻击payload打裁判系统或对方靶机的非目标端口你从Seay审计出的SQL注入点验证时用sleep(3)做时间差是要出事的最好用无副作用的11/12判断后门要分清是谁的。AWD的源码里既有主办方故意放置的“公共后门”也有对手潜入预留的“私有后门”。对公共后门所有队伍都知道你打进去的同时别人也可能在里面对你设伏。Seay只负责找出来判断归属要看文件修改时间开局前的极端时间戳大概率是主办方放的和文件内容特征审计工具要及时更新规则。Seay的规则文件是rules.ini和custom.ini在比赛前可以去网上搜一下社区分享的加固版规则关键词“Seay 规则包 增强”替换后误报率能低不少——但替换前先备份原文件规则包质量良莠不齐有的规则会把整站代码全标成红色。换了规则后先在本地已知漏洞的小项目上验证一下再上赛场。5. Seay使用避坑指南五个让我翻过车的细节5.1 中文路径引发的“无法扫描”问题现象项目导入后点自动审计进度条走一圈直接报“扫描完成”但结果列表是空的一个可疑点都没有。原因源码路径里有中文或特殊字符Seay的C底层对编码处理不友好部分文件没有被正确加入文件树自然扫不到。解决把项目路径改成纯英文目录比如D:\code\audit\targetA文件名里也不要出现中文。另外如果源码本身从服务器打包下来时带了中文文件名优先重命名而不是换目录。5.2 低版本PHP规则对现代框架的误报雪崩现象扫描ThinkPHP 6或Laravel项目时高危险列表爆出几百条eval每条都在框架核心代码里看得人心态崩了。原因框架内部的函数封装方式比如call_user_func动态调用、容器拿取依赖注入被正则误判成了危险函数。Seay不会解析PHP抽象语法树它只看文本模式所以框架里常见的call_user_func最多被误报。解决在“配置→扫描选项→排除目录”里把框架核心目录vendor、framework、core排除掉只保留应用层代码。同时把“危险函数”列表里的call_user_func和call_user_func_array取消勾选——这两个函数在实际漏洞里极少直接造成RCE反而和现代PHP框架的合法用法高度重合。5.3 杀毒软件把Seay当木马删了现象解压Seay后Windows Defender直接隔离或者双击EXE提示“无法验证发布者”。原因Seay当年为了对抗杀软的查杀混淆过自身代码加上长时间没有更新数字签名杀软判定为“高危程序”。这跟Seay本身是否作恶无关纯粹是签名过期和特征库命中的问题。解决加白目录解压关闭实时防护后运行虚拟机里做最保险。不建议拿修改版或破解版那些往往真的被塞了东西。如果公司电脑不让关Defender可以试试管理员权限运行不行就用另一台Windows虚拟机。5.4 AWD时用Seay扫Linux靶机源码遇到的编码坑现象Linux服务器上下载的源码迁移到Windows后部分PHP文件用UTF-8无BOM编码保存Seay打开后中文注释乱码更严重的是文件内使用了Linux路径分隔符或换行风格正则匹配时把整个路径字符串匹配错位。原因Windows下读取LF换行的文件不会出错但Seay的某些版本对CRLF有隐式依赖误判路径截断。解决批量转换换行符为CRLF再审计。用Notepad的“编辑→行尾转换→Windows(CR LF)”或者命令行跑# 用sed把目录下所有PHP文件的LF换成CRLF find /d/code/audit -name *.php -exec sed -i s/$/\r/ {} \;注意这条命令会改变文件的md5如果是用来排查后门先对比差异再转换。转换后再用Seay扫描你会发现之前漏掉的include点全浮出水面了。5.5 自定义规则写错导致扫描直接崩溃现象按照网上教程往custom.ini里加了自定义规则保存后点“自动审计”Seay直接闪退或者扫描进度卡在99%不动。原因规则文件格式写错——比如正则里的/没有转义、少了一个、或者两处分隔符不匹配。Seay在启动加载规则时不会做语法校验等扫描到匹配处才会炸。解决改规则之前先备份原始文件。改完后先在“工具→正则调试”里逐条测试自己写的正则能不能匹配目标字符串确认无误再保存到custom.ini。正则调试是Seay里最容易忽视的角落但它是写规则的生命线。6. 让Seay更好用的进阶操作规则自定义与联动验证前面说了Seay误报高但它的规则是可以调教的。custom.ini文件在Seay安装目录的data文件夹下用记事本打开就能看到条目格式。每条规则大致分三段名称、正则、危险级别。默认里已经有一批“代码注入”和“命令执行”规则你可以按照自己的审计目标往里加。[add] name变量覆盖漏洞 regex\$_(GET|POST|REQUEST)\s*\[\s*[][^][]\s*\]\s*\s*\$_(GET|POST|REQUEST) dangermedium这段规则匹配的是“用户参数直接赋给其他用户参数”的代码典型变量覆盖的起点。字段说明name是显示在结果列表里的名字regex是正则体注意转义danger风险级别有low/medium/high三个档。写的时候先备份写一条就测试一条别一次加十条。配合Seay的“代码调试”做联动验证在调试模式里给$_GET赋值后跟踪变量是否进入了$$动态变量或者extract()函数。单靠静态正则看不到的“变量覆盖→动态函数调用”链用调试模式跑一遍就能看穿。如果本地调试环境没有靶机对应的PHP版本很多特性比如$$的解析行为会不一样这时宁可在Seay里看变量引用列表也别全信本地执行。最后一个经验Seay输出结果后把高危列表导出成HTML或CSV“文件→导出报告”按文件路径排序再把同一目录下的多个可疑点合并查看。AWD里一个文件同时出现“文件写入”和“参数接收”基本就是被人动过手脚的明显信号。用Seay文件哈希双重确认比单靠肉眼盯代码高效得多。我自己在AWD里用Seay的最大翻车经历就是开局图省事没做换行符转换结果漏了一个最明显的文件包含后门。后来学乖了拿到源码先统一环境路径、换行、排除目录再开扫。这套流程跑了小半年从没在比赛里因为“找不出后门”而被翻盘。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。