
2020年4月21日那天我参加完奇安信Web安全工程师的笔试出了考场先在楼下抽了根烟脑子里的题目还在转。奇安信在政企和等保市场的覆盖量大家心里都有数所以这场笔试既考“原理背得熟”也考“你上手能不能打”综合题和场景题明显偏向红队视角和防护落地。往回看那套题其实是非常典型的“奇安信式考法”——不跟你玩虚的重点全压在OWASP Top 10的实战化迁移、渗透测试报告的工程规范以及代码层漏洞挖掘的思维深度上。如果你正在准备这类岗位或者想摸清国内头部安全厂商对一个Web安全工程师的技术预期这篇文章值得你花十分钟读完。我会把那天涉及的题型、底层原理、还有我踩过的坑结合当时项目里真实遇到的问题拆开讲尽量把能直接“抄作业”的思路给到你。1. 整体设计4月21日这张卷子的出题逻辑奇安信的题不是临时拼凑的从“2020web安全工程师”这个岗位定位来看出题人明显想把候选人分成两类一类是只会用工具“打点”的脚本小子另一类是能看懂漏洞根因、能写出有效修复建议的工程型选手。整张卷子给我的感觉就是“基础题确保下限场景题拉高上限”。1.1 为什么这场笔试很值得拉出来复盘很多人觉得奇安信这类厂子笔试肯定很难其实难不在原理本身而在它的题目设计相当“反套路”。举个例子它没有问你“SQL注入分哪几类”而是直接抛出一个经过URL编码、且被WAF过滤了空格的注入点问你“如果直接跑sqlmap会失败你会怎么手工去注入”。这种考法其实就是安全圈真实的工作状态。企业里最常遇到的不是“裸奔”的漏洞而是被各种安全设备、代码层过滤、宿主机防御层层包裹的漏洞。4月21日这场笔试的“4月21日”这个时间点也很微妙——大概率是在年度安全项目集中开展的时候团队需要即插即用的实战型Web安全人才。所以它强调“为什么”和“怎么绕过”而不仅仅是“是什么”。1.2 核心题型解构从选择题到大题按我的回忆题型大概分三类对应能力矩阵如下基础理论题占比约30%覆盖HTTP协议细节、加解密基础、同源策略、DNS解析过程等。注意它不直接考“什么是XSS”而是考“XSS与CSRF的交互链路”。漏洞利用与绕过题占比约40%给定一个模拟的请求包和部分后端代码片段让你分析漏洞类型、构造出完整的利用请求并说明如何规避WAF。综合实战与报告题占比约30%给定一个目标站的测试范围描述让你写出完整的渗透测试步骤并且输出结论性报告。这一步极其考验工程化能力。我当时在最后的大题上花了一个小时就是写一份“某金融业务系统渗透测试报告”的节选。那真不是套模板就能糊弄过去的它要求你的风险评级、复现步骤、修复建议必须逻辑自洽这是纯粹的经验活。2. 把Web安全基础焊死从原理到攻击链复述在笔试里基础题往往是滤网。很多朋友“会打”但“说不清”在口头或书面表达时会露怯。奇安信的题特别注重“攻击链”的完整性——一个漏洞从出现到利用再到影响中间每个链路节点都不能断。2.1 必考组合之一SQL注入与WAF绕过的底层逻辑这部分涉及基础中的基础但深度要超出常规。以当时试卷中一道典型的题为例后端代码大致是String user request.getParameter(user); String query SELECT * FROM users WHERE name user ; Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(query);第一问很简单闭合引号加注释useradmin or 11 --。考试的关键在第二问如果这台机器前面有一层WAF把select、union和空格都过滤了你要怎么打这里有一个常见的绕过公式用内联注释替换空格/**/用大小写混合绕过关键字UnIoN SeLeCt如果WAF很严格还可以用编码辅助比如二次URL编码。我笔试时给出的请求体验证是这样写的GET /sqli.php?id-1/**/UnIoN/**/SeLeCt/**/1,user(),3-- HTTP/1.1 Host: target.com输出里再带一句WAF本质上是基于正则的模式匹配当payload拆分成多个不连续的片段或者把关键字写成等价函数时比如substr换成right(left())正则就很容易漏掉。这就是“为什么我们要懂原理而不是只跑工具”的核心原因。2.2 必考组合之二XSS的三种形态与防护边界除了SQL注入XSS是另一个重头戏。笔试中的考察点是让候选人区分“存储型、反射型、DOM型”的触发位置和绕过机制。我之前的项目里遇到过一段很典型的修复不当代码var name document.getElementById(username).value; document.getElementById(info).innerHTML 欢迎回来, name;这段代码是纯DOM操作如果name里包含img srcx onerroralert(1)那么他会直接执行。但如果后端用了htmlspecialchars把编码了那么这段代码又不会触发。关键在于——存储型XSS的防护难点不在后端转义而在输出上下文的精确判断。考场上我给的建议分三层若插入在HTML标签内容中用实体编码转义若插入在标签属性中如a href...必须针对属性做上下文感知编码否则绕过会直接引入新的事件若插入在script内部仅做HTML实体编码是无效的需要做JavaScript编码。这不是考八股是因为在实际渗透测试报告里你给客户写“建议使用XSS Filter”客户根本没法落地。奇安信这种厂商对工程师的要求就是“修复建议必须可执行到代码行级别”。2.3 基础协议与逻辑漏洞超乎想象的细节考察考试还穿插了一些协议层面的题。比如典型的HTTP请求走私Request Smuggling场景利用Content-Length和Transfer-Encoding解析差异导致前置代理和后端服务器对请求的边界判断不一致。在2020年那会儿这是红队特别喜欢打的一类点。这里想说的是做Web安全绝对不能只盯着“参数”本身要时刻关注“数据链路”。从浏览器到WAF到反向代理到应用服务器每一层对数据的解析都可能存在偏差这种偏差就是漏洞。奇安信的题目里也包含了“如果请求包头存在重复的Host代理和源站分别如何处理”这类细节这些就要靠平时抓包时认真观察流量走向而不是只会在Burp Suite里点Repeater。3. 奇安信笔试的高频技术点路径遍历与代码审计思维“路径遍历”这个热词在网络上热度很高恰恰是因为它太常见却又容易被忽略。在4月21日那次笔试里它作为一个独立的知识点出现了结合了静态代码审计的逻辑。3.1 路径遍历目录穿越原理、绕过与实战复现先看一段后端代码String fileName request.getParameter(file); File file new File(/var/www/uploads/ fileName); FileInputStream fis new FileInputStream(file);如果fileName直接传../../../etc/passwd就能读到系统文件这就是经典的路径遍历。但奇安信的题做了两个升级过滤了../怎么办用....//后端如果只做了一次replace(../, )那么....//会变成../过滤了/怎么办可以采用URL编码%2f如果后端接受了解码后的路径就绕过了在某些中间件上还可以尝试..;/这种特殊路径分隔符。我在笔试时给的利用案例是Windows环境下读取系统文件的构造GET /download.jsp?file..%5c..%5c..%5cwindows%5cwin.ini HTTP/1.1 Host: target.com这里把\做了URL编码%5c很多开发者只过滤了../的Linux风格却漏了Windows下的反斜杠路径。一个合格的Web安全测试者必须同时具备跨平台路径思维。3.2 从“奇安信代码卫士”看静态代码审计的核心思路这就要聊到热度词里的“奇安信代码卫士工具下载”了。我们可以不讨论具体某个商业工具的界面但必须理解它的底层工作逻辑静态应用程序安全测试SAST。在我负责的项目里对开发团队交付的源码进行审计是常规动作。代码审计工具的核心在于“数据流分析”——它会把用户可控的输入Source到危险函数Sink之间的路径画出来如果这条路径上没有被净化函数Sanitizer卡住就判定为漏洞。考察代码审计思维最重要的就是掌握“Source - Sink”模型。举个实战例子$dir $_GET[dir]; include($dir . /index.php);这个$dir就是Sourceinclude就是Sink中间没有经过任何过滤这就是一个本地文件包含LFI漏洞。在笔试的代码审计大题中拿到一段几百行的代码不要逐行看先找参数入口request.getParameter、$_GET、$_POST再看这些参数流向哪些敏感函数exec、eval、include、query这样才能在半小时内快速找到“埋点”。3.3 渗透测试报告怎么写才专业一份高分答案的拆解笔试的最后大题会给你一个目标系统http://test.shop.com让你围绕其中某个模块写测试过程。我当时的写法基本是下面这个框架之后在奇安信项目的日常工作中我也会用这份逻辑去对齐整个部门的报告规范测试范围控制明确目标域名、IP段、测试时间窗口、允许使用的攻击方式如禁止DoS。漏洞概要以表格形式列出漏洞名称、URL、风险等级、可利用性。漏洞详情与复现包含请求包、响应包、影响数据范围。其中关键一段这样写漏洞URLhttps://test.shop.com/api/user/info参数userId风险等级高风险复现请求POST /api/user/info HTTP/1.1 Host: test.shop.com Content-Type: application/x-www-form-urlencoded userId1 and updatexml(1,concat(0x7e,(select user()),0x7e),1)--响应中回显了数据库报错信息证明存在时间盲注/报错注入风险可获取数据库用户与版本信息进而可能导致数据泄露。修复建议必须具体到代码层。比如“对userId参数使用PreparedStatement预编译进行参数化查询严格限制输入为整型数字”。这整个格式基本就是从奇安信这类售后项目中提炼出来的GTOGreat Technical Output标准。你可以发现它强调的不是“我打进了”而是“我用什么手段打进了造成了什么后果如何修得彻底”。笔试环节能写出这样的报告比单纯罗列工具名称要加分得多。4. 实操环节限时“挖洞”中必须掌握的压箱底能力笔试中也有类似CTF的实操题给你一个虚拟的答题环境你在里面提交flag。如果模拟的是真实业务场景那答题思路就完全不一样了。4.1 搭建一个模拟环境把曾经做过的方法跑一遍我当时为了复习这类实操题在本地拿DVWA和sqli-labs又过了一遍。核心是不要浮于表面要把每个Level的防护原理吃透。以DVWA中的SQL注入模块为例Low级别的代码是不带任何过滤的字符串拼接直接跑sqlmap -u http://192.168.1.100/dvwa/vulnerabilities/sqli/?id1SubmitSubmit --cookiePHPSESSIDxxxxx; securitylow --batch --dbs时间关系你可以直接拿到所有库名。但Medium级别使用了mysqli_real_escape_string来转义特殊字符。在实战场地上这意味着你直接丢一个进去会被转义成\导致闭合失效。这时候很多新手就卡住了。解题思路的第一性原理是单引号被转义后如果业务本身还使用了数字型参数那么就不需要字符串闭合直接以数字结尾。例如id1 and 11它不需要引号也能参与逻辑运算。Deep下钻一下当后端对id执行了intval()强转那么你再传1 and 11会被强制变成1根本没法注入。这时候就要看代码逻辑是不是把所有参数都做了强转或者是仅对关键词做了正则替换。说到底实操题拼的是“你能根据响应结果的细微差异判断出后端代码大概长什么样”的能力。4.2 绕过WAF的几种“肌肉记忆”在4月21日那天有一道实操题让我印象很深给定了一个请求包要求把注入payload补全当时目标在后端做了一些拦截。下面几条思路是我在实战中反复使用的“肌肉记忆”笔试时直接用上了大小写变形如果拦截了select可以尝试SeLeCt但如果规则是转小写后匹配那这招没用注释符拆分sel/**/ect如果后端是直接把关键词过滤为空那内联注释可以完美绕过但如果后端是调用了PHP的stripslashes和preg_replace双重过滤就会失效编码绕过对整段payload进行URL编码一次或二次。WAF常见只解码一次如果你发出去的是%2527服务器解码一层得到%27再解码一层得到而WAF很可能只解到第一层就不管了。我当时的答题方式就是在Burp里反复对比编码后的响应最终确认它支持二次解码于是构造出id1%252527%2561nd%25201%253d1这样的嵌套payload成功绕过。这类实操题是能练出来的。你要做的不是背payload而是理解每一层解码、解析逻辑。这样你拿着Burp的Intruder去跑字典时心里才会有底也才能在有限的考试时间内找到最稳的一条链。5. 揭掉滤镜聊聊天擎这类终端安全在Web实战中意味着什么热度词里有一大堆关于“奇安信天擎卸载”的搜索这很能反映实际业务场景。在很多企业里天擎这类EDR终端检测与响应是合规要求必须装上的它和Web安全工程师的日常工作有着极强的关联。5.1 为什么“卸载要密码”以及安全工程师该怎么看这件事很多人一搜索“奇安信天擎卸载密码”是想把自己电脑上的客户端强制卸载。但站在一个老安全工程师的角度我必须说清楚在企业内网终端杀软往往是由域控、准入策略统一管理强制卸载会被后台日志记录这本身就是一个安全事件。我经历过一个客户他们的运维同学因为嫌装了天擎之后内存占用高直接百度搜“如何绕过密码卸载天擎”结果把主防服务搞坏了第二天域内爆发了勒索软件变种那台机器直接成了突破口。所以如果你在奇安信笔试或面试中提到终端安全管理千万不要说“怎么绕过它”而要强调如何在有EDR的环境下做Web攻击链的收敛。在攻防演练期间我们做Web渗透测试最怕的不是WAF而是目标的服务器上装了EDR。因为一旦Web shell传上去文件落地瞬间就会被终端查杀进程执行也会触发行为监控。这时候你的利用思路必须调整为“内存马”或者“无文件攻击”。这些实战细节比单纯研究怎么卸载客户端有价值得多。5.2 终端与Web的联动做安全的全局视角笔试中肯定也会考“如果Web服务器被攻破你作为安全工程师第一反应是什么”。我的答案是“日志分析和扩散控制”。不能只盯着/var/log/nginx/access.log还要结合终端侧的进程启动时间线。奇安信这类厂商的工程师之所以值钱就是因为他们能打通“网络层—应用层—终端层”三层数据。用天擎这类EDR反查溯源也是一样你在Web层看到某个IP发起攻击你要去EDR后台查这个IP对应的主机上有没有执行过whoami、有没有创建可疑计划任务两点连起来才能判断攻击者是否已横向移动。这种能力在2020年笔试现场未必能做实操验证但在驻场工作中几乎是每日必修。5.3 做Web安全测试的底线合规与合法测试边界最后关于“删除奇安信”、“强制卸载”这些搜索热词我多提醒一句合规永远是第一位的。不管在笔试还是真实项目中只有你拥有授权只有测试目标在授权范围内你才可能动手。如果在没有授权的情况下为了研究技术去尝试卸载一个企业级终端产品或者对一个非授权系统做扫描这属于违规行为。奇安信这类厂商的岗位招聘非常看重候选人的职业操守。那天的笔试其实也嵌入了一道软性题告诉你一个目标却让你判断测试范围是否超出授权。这种细腻的合规考量才是从“脚本小子”进阶到“职业Web安全工程师”的分水岭。我在实际项目中的体会是笔试和面试都只是入场券真正拉开差距的是你在跨层数据联动、漏洞根因复盘和报告规范化这些“软实力”上的积累。4月21日那场考试过去很久了但如果让我重来一次我会少刷点工具多花时间把每一条漏洞的请求包、原理和绕过逻辑手写整理成册那才是真正能在项目中抗住风险的底气。最后再分享一个小技巧平时做记录时尽量用纯文本格式保存带时间戳的请求包和响应包一旦需要溯源或者复盘回忆不会骗你。