1. 从一道CTF题到AI辅助解题的实战复盘最近在玩一个叫Passman的CTF挑战这玩意儿是个Web靶场核心是搞一个密码管理器应用。玩CTF的朋友都知道这类题目往往不是单纯让你找个注入点或者绕个认证就完事了它更像一个微缩的、有漏洞的真实应用你得像个真正的安全研究员一样去理解它的业务逻辑、代码架构然后找到那个设计者故意留下的、不那么明显的“后门”。这次解题过程有点特别因为我尝试引入了一个新“队友”——GPT-4。我不是让它直接给我答案那没意思也学不到东西。我的思路是把它当成一个超级强力的“代码理解助手”和“思维碰撞伙伴”在我卡壳的时候提供新的视角或者帮我快速消化那些冗长的代码逻辑。整个过程下来感觉像是和一个经验丰富但脑回路清奇的同行在结对编程效率提升显著也踩了一些坑。这篇文章我就来详细拆解一下我是怎么用GPT-4辅助攻克Passman这道题的重点不是题目答案本身那会剥夺你的解题乐趣而是这套“人机协作”的实战方法论、具体的交互技巧以及那些只有亲手试过才知道的注意事项。Passman这个靶场模拟了一个允许用户存储网站凭证用户名、密码的Web应用。前端是常见的Vue.js后端是Node.js配Express数据库用了SQLite。题目目标很明确拿到藏在数据库里的flag。这通常意味着你需要找到一个方法从“普通用户”权限提升或者利用逻辑漏洞去访问或篡改不属于你的数据最终实现读取任意数据甚至远程代码执行。传统的解题路径无非是手动审计代码、黑盒测试接口、分析流量。但这次我想试试看如果让GPT-4来帮我读代码、理逻辑、甚至生成测试用例整个流程会变成什么样。2. 解题环境搭建与核心思路确立2.1 靶场部署与初步侦察第一步永远是拿到题目环境。Passman通常以Docker镜像或源代码的形式提供。我选择了在本地用Docker跑起来这样最贴近真实测试环境也方便后续调试。启动容器后浏览器访问本地端口一个清爽的密码管理器界面就出来了。常规操作注册账号、登录、尝试添加几条凭证记录。这个阶段我刻意没有去看任何源代码纯粹以黑盒视角进行功能探索目的是建立对应用行为的“第一印象”。我记录了所有的功能点登录、注册、添加/删除/查看凭证、是否有搜索或分享功能、修改个人信息等等。同时用Burp Suite抓取了所有的HTTP请求观察API端点、参数格式和响应结构。这个初步侦察的信息构成了我与GPT-4对话的“上下文基础”。我并没有一上来就把所有代码扔给它。相反我先是自己梳理了应用的大致功能框架然后带着明确的问题去和GPT-4交流。例如我会问“一个典型的Vue.js前端配合Node.js Express后端的密码管理器在数据存储和用户会话管理上常见的实现模式和潜在的安全风险点有哪些” GPT-4会给出一个非常结构化的回答包括但不限于JWT令牌的使用与验证、SQL查询的拼接风险、NoSQL注入的可能性、文件上传逻辑、不安全的直接对象引用IDOR、跨站请求伪造CSRF等等。这份列表成为了我后续代码审计的“检查清单”。2.2 确立人机协作的分工原则在开始深入代码之前我必须想清楚哪些事我亲自做效率更高哪些事交给GPT-4能发挥其优势我的分工原则是这样的架构理解与路径规划我主导整体解题方向、攻击面的优先级判断、关键疑点的标记必须由我基于经验来决定。GPT-4是助手不是指挥官。代码摘要与逻辑解释GPT-4擅长面对数百行的陌生代码文件让GPT-4快速提炼核心路由、函数功能和数据流能极大节省时间。特别是它能在不同文件间建立关联。漏洞模式识别与假设生成协作进行我提出可疑的代码片段比如一个数据库查询函数GPT-4可以基于其训练数据中大量的漏洞案例指出可能存在SQL注入、原型污染等风险的模式并解释原因。但它给出的只是“可能性”需要我手动验证。测试Payload构造与变形GPT-4辅助当确定了一个可能的漏洞点比如某个参数存在注入我可以让GPT-4根据上下文数据库类型、查询语句结构生成多种测试Payload包括绕过WAF的变形技巧。这比我自己翻查笔记快得多。调试与结果分析我主导发送Payload、观察响应、判断是否成功、分析错误信息这个过程需要人类的直觉和临场判断GPT-4无法替代。这个分工的核心是让GPT-4处理信息密度高、模式化强的“重体力”和“广知识”劳动而我专注于需要创造性、策略性和深度理解的“脑力”劳动。绝对避免让它直接给出“漏洞在这里用这个Payload打”的答案那样就失去了CTF训练的意义。3. 代码审计阶段GPT-4作为“超级代码浏览器”拿到源代码后真正的挑战开始。源代码目录通常包含frontend/、backend/、database/等。我决定从后端核心逻辑入手。3.1 快速梳理后端路由与关键函数我首先将backend/routes目录下的主要文件如auth.js、entries.js内容粘贴给GPT-4。我的提示词不是简单的“分析这段代码”而是带有明确指令的“以下是Node.js Express应用的路由文件。请为我做三件事1. 列出该文件导出的所有API端点HTTP方法和路径。2. 对于每个端点用一句话概括其功能。3. 标记出所有涉及数据库操作、文件操作、用户输入直接拼接的代码行并简要说明潜在风险。”GPT-4的回复是结构化的表格例如端点方法功能简述潜在风险点/api/entriesGET获取当前用户的所有密码条目第25行db.get(\SELECT * FROM entries WHERE user_id ${userId})存在SQL注入风险因为userId直接来自JWT令牌但若令牌被篡改.../api/entries/:idGET获取指定ID的密码条目详情第40行const { id } req.params;第42行db.get(\SELECT * FROM entries WHERE id ${id} AND user_id ${userId})id参数直接拼接存在严重的SQL注入。实操心得一提示词的质量决定输出的价值。模糊的问题会得到模糊的回答。你必须像给一个聪明但不懂业务的新手下达清晰指令一样告诉GPT-4你想要的具体格式、分析维度和重点关注点。这能迫使它进行有针对性的思考而不是泛泛而谈。通过这种方式我迅速在/api/entries/:id这个GET端点锁定了一个明显的SQL注入点。参数id未经任何过滤就直接拼接进了SQL语句。这是一个典型的“IDOR SQL注入”组合漏洞场景攻击者不仅可以尝试注入还可以通过修改id值来尝试访问他人的条目如果注入被防御IDOR可能依然存在。3.2 深入理解漏洞上下文与利用条件找到可疑点只是第一步。接下来需要理解利用这个漏洞需要满足哪些条件。我继续与GPT-4对话“针对上面发现的/api/entries/:id端点SQL注入我需要确认以下信息以便构造利用Payload从代码上下文看这个端点是否需要有效的JWT认证认证中间件是如何工作的代码中使用的db对象是哪种SQL库如sqlite3、mysql2这会影响注入Payload的语法。userId是从哪里来的如果JWT令牌中的userId被篡改这个注入是否可以用来查询其他用户的数据假设后端是SQLite请为我生成几个用于该注入点的测试Payload目的是a) 验证注入存在基于布尔或时间盲注b) 获取数据库表名c) 获取flags表的数据假设表存在。请注释每条Payload的意图。”GPT-4基于代码上下文我提供了相关的authMiddleware和数据库初始化代码片段进行了回答。它确认了需要JWT数据库是sqlite3userId来自JWT的sub字段。更重要的是它生成了一系列从简单到复杂的Payload-- 原始查询SELECT * FROM entries WHERE id ${id} AND user_id ${userId} -- Payload 1: 基于布尔的简单验证。如果id1的条目存在返回正常不存在则可能返回空或错误。 1 AND 11 -- 1 AND 12 -- -- Payload 2: 利用SQLite的sqlite_master表获取所有表名。需要结合UNION注入前提是能控制查询字段数。 1 UNION SELECT name, type, null, null FROM sqlite_master WHERE typetable -- -- Payload 3: 假设已知表名为flags获取其列名。 1 UNION SELECT sql, null, null, null FROM sqlite_master WHERE typetable AND nameflags -- -- Payload 4: 读取flags表内容。 1 UNION SELECT flag_column, null, null, null FROM flags --注意GPT-4生成的Payload是“教科书式”的起点。在实际测试中你需要根据实际错误信息、字段数量进行大量调整。例如它给出的UNION查询需要前后字段数一致这需要你先探测出原查询的字段数量。这个过程我并没有让GPT-4完全代劳而是让它提供思路我自己用Burp Intruder或手动测试来探测。3.3 绕过防御与处理复杂逻辑现实中的CTF题目和真实漏洞很少是这么“单纯”的。Passman题目可能设置了额外的防御。例如我可能在代码里发现id参数被一个自定义的sanitize函数处理过或者查询使用了参数化查询但方式有误。这时我需要和GPT-4进行更深入的“讨论”。我会把有防御的代码片段发给它“看这段代码它虽然用了db.run(\INSERT ... VALUES(?, ?), [val1, val2])这种看似参数化的查询但表名却是通过字符串拼接的${tableName}。在SQLite中这种情况可能存在哪些利用方式如果表名来自用户输入如何利用”GPT-4可能会指出在SQLite中表名、列名不能使用?占位符这种拼接如果用户可控可能导致“SQL注入于结构层面”虽然不能直接注入UNION SELECT但可能可以配合ATTACH DATABASE等操作进行有限利用。它会引导我去关注那些“非值”位置的用户输入。实操心得二将GPT-4视为一个“质疑者”和“发散思维生成器”。当你觉得代码“看起来”安全时把代码和你的判断一起发给它问“你觉得这里真的安全吗有没有我忽略的边角情况或特定数据库的特性” 它常常能指出一些你因为思维定势而忽略的细节。4. 漏洞利用与Payload调试实战理论分析完毕进入动手环节。我将Burp Suite捕获到的GET /api/entries/1请求发送到Repeater模块。4.1 手工验证与字段数探测首先我需要验证注入是否存在并确定原始查询的字段数。我手动尝试了经典的ORDER BY探测法GET /api/entries/1 ORDER BY 5-- HTTP/1.1如果应用返回错误说明字段数少于5我再尝试ORDER BY 4、ORDER BY 3...直到返回正常。这个过程是机械的但很重要。我也可以让GPT-4根据可能的错误信息比如SQLite的错误日志如果被返回来帮我分析原因。确定字段数为4后我就可以构造UNION注入Payload了。最初的Payload可能不工作因为数据类型或列名不匹配。这时我会把错误响应比如SQLITE_ERROR: no such column: flag_column反馈给GPT-4“我的UNION注入遇到了这个错误。原查询返回4个字段。在SQLite中如何更稳妥地探测flags表的结构请给出具体的Payload序列。”GPT-4可能会建议我先用NULL占位所有字段确认UNION是否生效然后逐步替换NULL为可能的列名或使用sql函数获取表结构。4.2 利用GPT-4进行Payload变形与绕过有时题目会有简单的过滤比如过滤了空格、UNION、SELECT等关键词。我会把过滤规则我通过测试归纳的告诉GPT-4“目标过滤了空格和UNION关键词但在SQLite中/**/可以替代空格UNION能否被大小写变形或内联注释分割绕过请给出绕过后的Payload示例。”GPT-4迅速给出了变形方案1/**/UnIoN/**/SeLeCt/**/1,2,3,4--或者利用SQLite注释特性1/*!UNION*/SELECT/*!1,2,3,4*/--它甚至提醒我在有些场景下可以用%09Tab、%0a换行等URL编码来替代空格这取决于后端如何解析输入。实操心得三永远不要完全信任GPT-4生成的Payload。它生成的Payload是基于模式和历史数据的不一定100%适应当前环境。你必须将其作为“草稿”在真实环境中测试、观察响应、迭代调整。它帮你打开了思路但扣动扳机、观察弹着点的人必须是你自己。4.3 最终利用与Flag获取经过一系列测试、调整、再测试我最终构造出了能成功从flags表或类似命名的表中提取数据的Payload。这个过程可能是经典的UNION SELECT直接回显也可能是基于布尔或时间的盲注需要编写脚本自动化。如果是盲注我会让GPT-4帮我快速生成一个Python脚本框架包含基本的请求逻辑和布尔判断条件然后我自己填充具体的Payload生成和结果解析逻辑。当Flag最终在响应中显现时整个利用链就通了。回顾一下关键链是注册登录获取合法JWT - 发现/api/entries/:id端点存在SQL注入 - 利用注入点探测数据库结构 - 定位并读取flags表。5. 常见问题、踩坑记录与进阶思考5.1 使用GPT-4辅助CTF的典型问题代码上下文不足GPT-4的“记忆”有限。当你分析一个大型项目时不能一次性把所有代码丢给它。需要分模块、分层次地提供信息。先给整体目录结构再给核心路由最后深入具体函数。在对话中要适时地“提醒”它之前的上下文虽然它有上下文长度限制但关键结论可以手动复述。生成“幻觉”代码或漏洞GPT-4有时会“自信地”指出一个不存在的漏洞或者引用一个项目中根本不存在的函数。必须要求它提供代码行号或具体代码片段作为依据然后你自己去源代码中核实。永远以实际代码为准。忽略业务逻辑漏洞GPT-4擅长分析代码语法层面的漏洞如SQLi、XSS但对于复杂的业务逻辑漏洞如条件竞争、权限提升逻辑缺陷它的表现可能不稳定。这类漏洞更需要你对应用流程的深刻理解。过度依赖导致思维惰性这是最大的风险。如果一遇到问题就想着问GPT-4你自己的代码审计能力、漏洞挖掘直觉会退化。它应该是“拐杖”帮助你走得更快更远而不是替代你的双腿。5.2 我的实战避坑指南提示词工程是关键学习如何向GPT-4提问。多用“扮演角色”“你是一个经验丰富的Web安全审计员”、明确输出格式“请以表格形式列出”、分步骤指令“第一步...第二步...”。这能极大提升回复质量。保持“驾驶员”座位你负责制定攻击策略、选择审计重点、判断漏洞真实性。GPT-4是导航仪和资料库告诉你可能的路况和捷径但方向盘在你手里。结合传统工具GPT-4不能替代Burp Suite、sqlmap、代码静态分析工具。它的价值在于连接这些工具和你的思维。例如用GPT-4分析代码找到可疑点然后用Burp手工测试用GPT-4理解一个复杂库函数的用法然后自己编写利用脚本。用于学习和总结在解完一道题后让GPT-4帮你梳理整个漏洞的根源、利用链条、修复方案。它可以生成非常清晰的技术总结报告帮助你深化理解。5.3 关于AI辅助安全研究的未来思考通过这次Passman挑战我强烈感受到AI大模型在安全研究特别是CTF和代码审计这类“知识密集型”任务中的巨大潜力。它不是一个“解题器”而是一个“力量倍增器”。它缩短了安全研究员与陌生代码、庞大知识库之间的距离。未来熟练运用AI辅助可能会成为安全从业者的标配技能。但同时最核心的——对安全原理的深刻理解、对攻击者思维的模拟、以及那种“嗅到”漏洞的直觉——依然是人类无可替代的优势。人机协作各取所长才是效率与深度兼得的王道。最后再分享一个小技巧在与GPT-4进行长时间对话解题时可以新建一个专门的对话线程并在一开始就设定好它的角色和你的目标。在对话过程中定期用你自己的话总结一下当前进展和下一步计划这不仅能帮你理清思路也能让GPT-4在后续回答中更好地保持上下文一致性。记住工具越强大使用工具的人的心法和思路就越重要。