奇安信校招笔试复盘:路径遍历、终端安全与验证码考点全解析

发布时间:2026/8/29 10:10:40
奇安信校招笔试复盘:路径遍历、终端安全与验证码考点全解析 每年秋招前后总有学弟学妹来问我“奇安信笔试到底考什么”。我自己是2019年秋季那批参加奇安信校招笔试的当时题目不算难但覆盖面很广而且很多题不是靠背就能答出来的。现在回过头看那套笔试题其实很有代表性既考基础又考思路。这篇就结合我当年的考场回忆、后来带新人时反复讲的知识点以及近些年搜索平台上关于“奇安信”的高频问题把2019年校招笔试的典型题目、考察逻辑和复盘方法一次性讲清楚。准备安全岗校招的同学或者想从运维、开发转安全方向的朋友这篇应该能帮你少走不少弯路。1. 那年秋招奇安信笔试到底在考什么1.1 为什么2019年的题值得复盘奇安信2019年正值从原集团独立运营的早期校招也是大规模铺开的头两年试题风格还没有完全固化。它不像有些大厂题库已经总结到烂大街题型特别杂包括单选、多选、判断、简答、编程、场景分析内容跨度从Web安全、二进制、密码学、操作系统到网络基础甚至还带一点安全管理类的常识题。我记得当时在线笔试是限时两个小时题量不小按100分制的话选择题大概占40分简答和场景题占40分编程题占20分。正因为题目体系处于“建立期”它反而更贴近真实安全岗位的知识结构不是让你背教材目录而是看你能不能把知识串起来解决具体问题。后来几届的题目多少都有2019年的影子所以复盘这一年的题目对后面几届依然有参考价值。1.2 整卷的题型画像和节奏从整体难度看选择题属于“基础但容易错”的类型。比如给一段PHP代码让判断存在什么漏洞选项中既有SQL注入也有路径遍历、文件包含、命令注入看起来都像得靠代码细节判断。简答题则更考验表达我记得有一道“谈谈你对终端安全的理解并说明终端安全软件应具备哪些能力”听起来像是聊天题但要在有限篇幅里答得系统、答出层次非常考验平时的积累。编程题不考算法竞赛那套考的是“用代码解决一个安全场景问题”比如写一段函数过滤路径参数、或者实现简单的字符串解码。这和平常在LeetCode刷题完全是两回事我那年就有同学死在编程题的输入输出处理上。1.3 从搜索热词反推考点逻辑每年搜索平台上关于“奇安信”的高频词其实可以当作考点风向标。像“路径遍历”“验证码”“终端安全”“国产化浏览器”这些词恰恰就是笔试里面反复出现的内容。比如“路径遍历”对应Web安全是安全岗笔试几乎必出的考点“验证码”对应业务安全和人机识别校招笔试喜欢拿它考察逻辑设计能力“终端安全”对应主机安全也是国内安全厂商业务的重心所在。这几块内容正好就构成了2019年奇安信笔试题的主体骨架。2. 路径遍历一道标准Web安全题的完整拆解2.1 题目还原当年有一道题背景是一个文件下载功能URL长这样http://target.com/download.php?filenamereport_2024.pdf题目给了一段简化代码?php $file $_GET[filename]; $path /var/www/data/ . $file; readfile($path); ?问这段代码存在什么漏洞攻击者如何利用如何修复我当时先判定这是路径遍历漏洞Path Traversal / Directory Traversal然后从“原理、利用、防御”三个层面展开作答。这道题拆开看其实是一个很经典的组合考点操作系统文件路径规则、Web应用输入校验、以及服务端配置。2.2 原理为什么“../”能穿越目录路径遍历的关键在于程序把用户输入直接拼接到文件路径里又没有对路径中的特殊字符做过滤。攻击者可以通过提交http://target.com/download.php?filename../../../../etc/passwd按照文件名解析规则..代表上一级目录系统会顺着路径一层一层往上跳最后穿过/var/www/data/跳到文件系统的根目录然后读取/etc/passwd。如果Web服务进程权限够高甚至可以进一步读取数据库配置、应用源码等敏感文件。这里有一个难点是编码绕过。很多基础不牢的同学只会在题目里写../但真实环境里开发往往会加一个简单的过滤比如把../直接替换为空。这时候攻击者可以换成URL编码把.编码成%2e把/编码成%2f即%2e%2e%2f把../编码成..%2f甚至双重编码%252e%252e%252f让服务端解码一次、应用再解码一次在Windows环境下尝试反斜杠..\..\因为有些服务端只过滤正斜杠因此在考场答题时如果题目只写“过滤了../”不能就此判断漏洞不存在而要接着说明“过滤是否完整、是否区分大小写、是否支持编码绕过”。答出这一层基本就能和其他考生拉开差距。2.3 拿满分的防御性答题框架我当时是分三层来回答修复方案的现在带人复习也推荐这个框架输入校验层最直接的做法是白名单校验文件名不允许出现/、\、..、空字节、URL编码字符等只允许字母、数字、下划线和点号。如果必须支持路径则调用语言自带的路径规范化函数再做前缀校验。以Java为例正确答案可以写成这样Path base Paths.get(/var/www/data/).toRealPath(); Path target base.resolve(userInput).normalize().toRealPath(); if (!target.startsWith(base)) { throw new SecurityException(非法路径); }这段代码的关键是toRealPath()会解析符号链接并把路径规范成真实路径再用startsWith(base)防止逃逸。只做normalize()不转绝对路径是不够的因为攻击者可以构造/var/www/data/../../etc/passwd这种“先进入合法目录再跳出”的路径。服务端配置层Web服务运行账户使用低权限账号文件存储放在专用目录不放在Web根目录下对下载接口做统一出口通过一个安全函数拼接真实路径不直接把用户输入传给文件系统接口。纵深防御层文件访问如果走对象存储或独立文件服务可以在更底层做访问控制WAF可以作为补充但不能完全依赖因为WAF只能拦已知特征编码绕过很容易绕过规则。2.4 不同语言下的扩展考点题目一般不会只满足于一种语言。我在考场上看到同卷还有一题是Java代码String path request.getParameter(path); String fullPath basePath path; File file new File(fullPath);这和PHP那题本质相同但Java里还多一个考点File对象不仅可能触发目录遍历还可能造成任意文件读配合后续代码甚至可以发展成任意文件写入。如果程序把InputStream写入file攻击者传../../shell.jsp就能往Web目录写一个webshell。另外注意语言差异Python的os.path.join有个陷阱——如果拼接的后半段以绝对路径开头基路径会被直接丢弃。写os.path.join(/var/www/data, /etc/passwd) # 结果是 /etc/passwd 而不是 /var/www/data/etc/passwd这个特性在校招笔试和面试里都出现过是个很好的拉分点。我建议复习时把PHP、Java、Python顺带Node.js的路径处理差异都整理一遍不要只背一种写法。3. 终端安全大题从企业级防护产品反推主机安全的考察重点3.1 一道以自保护机制为核心的简答题搜索平台上“奇安信天擎”相关的高频词非常多比如“天擎怎么彻底关闭”“天擎卸载要密码”“怎么强制退出天擎”。这些词背后反映的其实是终端安全软件一个非常重要的特性——自保护机制。2019年笔试中有一道简答题几乎就是这事的“正向版本”“终端安全软件在用户主机上运行为什么无法被用户轻松关闭或删除请从技术角度说明终端安全软件实现自我保护的方法。”这道题乍一看像运维常识但答得好不好直接看你有没有真正理解终端安全对抗。所谓“无法卸载”不是商业策略而是技术上的必然如果恶意程序可以轻松结束安全软件进程、删除其文件那这款安全软件就形同虚设。校招笔试把这个问题抛出来是想看你对主机攻防对抗的底层机制了解多少。3.2 主机安全的核心防线拆解我当时是按“进程—文件—内核—系统机制”四个层面来拆解答题的进程保护。最基础的手段是阻止普通用户和恶意程序结束安全软件进程。Windows下可以通过TerminateProcess的权限控制、注册服务的方式将关键进程注册为系统服务配合自我保护驱动拦截结束进程的调用。攻击者想要结束进程要么提升到系统权限要么对抗内核回调门槛一下就高了。文件与目录保护。安全软件安装目录需要防止被恶意修改或删除通常是基于文件系统过滤驱动minifilter实时拦截非授权进程对保护路径的写操作。任何进程试图替换安全软件的可执行文件、DLL都会在写入阶段被拦下。这也是为什么“手动删安装目录”几乎不可能成功。内核回调与驱动对抗。现代终端安全软件会注册大量内核回调比如创建进程回调、加载镜像回调、创建线程回调、对象句柄回调等。恶意程序想关掉保护必须先过这些回调而回调背后是一个完整的内核驱动体系。这类对抗在笔试里不需要说得太细但必须体现“安全软件本身运行在更高权限层靠驱动对抗恶意行为”这个核心逻辑。自我保护驱动。安全软件通常会有一个专门驱动负责保护自身这个驱动会阻止非授权进程打开安全软件的设备对象拦截对其注册表项、系统服务的修改操作。有些还支持双进程守护一个进程被结束另一个立即拉起来。3.3 把知识变成得分点的答题结构这种开放简答题最忌讳只写“权限控制”四个字就结束拿不到分。我推荐一个“现象—原因—对抗—升华”的四段式结构第一段写现象用户无法直接卸载/关闭这是终端安全产品的自我保护特性防止恶意程序“杀软先杀”。第二段写原因恶意程序的首要目标往往是干掉安全软件所以安全软件必须运行在比普通用户程序更高的权限层。第三段写对抗从进程、文件、内核、注册表、服务等角度说明具体技术手段。第四段写升华说明这些能力与EDR、主机入侵防御的关系点出现代终端安全不再只是“杀毒”而是一套覆盖检测、响应、阻断的体系。这样答阅卷人一眼就能看出你不是背资料的是真的理解终端安全在干什么。3.4 国产化环境的延伸考点再往后题目还可能会延伸到适配场景。比如搜索热词里有“银河麒麟系统下载奇安信可信浏览器”“麒麟系统上浏览器版本怎么选”这说明安全产品在国产化操作系统上的落地也是一个重要考察方向。笔试里如果遇到类似“国产操作系统上终端安全软件需要适配哪些内容”的简答题可以围绕这几个点展开系统架构差异x86、ARM、MIPS等不同指令集需要交叉编译、内核接口差异国产Linux内核的安全接口与Windows差异很大、应用生态适配比如浏览器要在可信执行环境里运行、支持国密算法与根证书体系、以及外设驱动兼容性。如果能把“可信计算”和“供应链安全”这两个词自然带进来答题层次又会高一截。4. 验证码与人机识别容易被低估的拉分题4.1 验证码题目的出题动机校招笔试题里出现验证码相关题目往往不是让你开发一套验证码而是考察验证码解决什么问题绕过思路有哪些如何设计才算可靠说白了它对应的是业务安全这个大方向和风控、反爬、账号安全直接相关。验证码的核心目标不是“让人烦”而是区分人和机器。在自动化攻击大行其道的背景下凡是注册、登录、发帖、短信通知等有可能被刷的接口都需要一种低成本的人机识别手段。验证码就是这个场景下的第一道闸门。4.2 两种典型考法一种考法是“看图判断”类选择题给出几张验证码问哪些更安全。这题表面上在问你视觉感受实际上考的是对抗成本纯数字4位验证码攻击者用OCR或者卷积神经网络很容易识别扭曲变形干扰线背景噪声的复杂度要高一个量级滑块拼图、点选汉字等行为式验证码由于带有轨迹、时序信息机器模拟成本更高。另一种考法是场景分析题比如“某网站的短信验证码接口被爆刷导致大量骚扰短信发送到用户手机上。请分析可能的原因并提出改进方案。”回答这个题先分析短信接口为什么被刷。常见原因是验证码生成放在客户端没有服务端校验验证码不与Session/手机号绑定验证码有效期过长接口没有频率限制甚至存在万能验证码或固定验证码的开发后门。改进方案要对应着写验证码只能在服务端生成和校验客户端发到服务端的只是一个凭据做到“一码一用”验证通过后立即失效设置有效期一般5分钟以内同一个号码发送次数限制同一IP单位时间内限制次数加滑块二次验证关键接口接入业务风控识别异常流量4.3 一道加分的设计题如果题目问“设计一套可靠的验证码系统”除了上面的点还可以补充两个高级思路第一多因素人机识别。初级验证码只判断“填对没填对”高级的人机识别还会分析鼠标滑动的轨迹曲率、速度变化、点击坐标分布。这些行为特征很难被脚本完美模拟所以即使字符被识别了轨迹异常也会触发风控。第二验证码与业务风险分层联动。比如低风险操作不弹验证码中风险弹滑块高风险弹二次短信验证或人工审核。这样既保证安全体验又不滥用验证码这正是业务安全里很重要的“风险决策”概念。答题时能提“无感验证”这个词会非常加分。4.4 容易踩的坑验证码这道题容易失分的地方在于把“绕过”写成了“攻击教程”。笔试答题时要突出“从安全测试/红队评估视角分析风险”落脚点是“为了安全加固”而不是“教你怎么刷接口”。另外一个坑是把“短信验证码”和“图形验证码”混为一谈。短信验证码本质上是双重身份验证要素图形验证码是人机识别两者解决的问题不同。如果题目同时出现一定要分清楚谁在前谁在后通常先过图形验证码再做短信发送两道门槛解决两个不同的问题。5. 考场实战时间分配、捞分技巧与复盘建议5.1 做题顺序与时间分配2019年这次线上笔试是两小时题型偏多。我吃过的亏是前脚在选择题上纠结太久后脚编程题和简答题时间不够。后来复盘我给自己定了一个通用的答题节奏推荐给考安全岗的同学第一轮约15分钟先扫全卷。把选择题快速过一遍会的直接选不会的标记跳过。切忌在单题上死磕尤其是一些多选选多了倒扣分选少了保底分得不偿失。第二轮约45分钟主攻简答和场景分析题。这类题分值大而且对错界限不绝对只要写得多、在点上就比选择题好拿分。先把每道题的核心观点列出来再展开层次保证结构完整。第三轮约45分钟做编程题和回头补选择题。编程题往往只要通一个样例就能拿一半分比选择题性价比高。5.2 不会的题怎么捞分如果遇到完全没思路的简答题先别空着。把题目里的关键词一个个摘出来围绕关键词写你懂的东西。比如问“内网渗透中横向移动的手段”不知道的话就把“内网、权限提升、横向”拆开先写内网环境的特点再写权限提升的常见思路最后写为什么需要横向移动至少能拿到步骤分。选择题不会时也有规律可循。安全岗位试题里凡是表述过于绝对“一定”“必然”“完全”的选项通常都是错的凡是多个选项互相矛盾那么答案大概率藏在这几个互相矛盾的选项里。这不是玄学而是出题人设计干扰项的习惯。5.3 编程题的典型坑编程题部分当年考的是一道路径过滤函数的实现。题目给了一个字符串要求过滤掉../和绝对路径写法输出安全路径。多数人直接replace(../, )看起来能过样例但攻击者传入..././时会替换成../等于没过滤。这样反而暴露了对漏洞原理的理解不深。我在考场上的写法是def safe_filename(name: str) - str: # 去掉所有路径分隔符和上层目录引用只保留文件名 name name.replace(\\, /) name name.replace(/, ) name name.replace(.., ) return name虽然保险但在“既要保留子目录又要防穿越”的场景下更稳妥的方式是先规范化再校验前缀。所以建议平时练习时多写几种方案不要只会replace。编程题还有个容易丢分的地方是输入输出模板。在线笔试系统经常要求从sys.stdin读多行输入输出结果到标准输出。如果你平时只在本地IDE里跑函数不习惯牛客网式的主函数读入考试时会白白浪费大量调试时间。我当时的做法是考前把所有常用语言的读多行输入、按行处理、格式化输出模板各练了十遍考场上完全不用想。5.4 考后的复盘方法笔试结束并不是终点。我建议考完当天不要对答案先把能回忆起的题目按知识点分类记录下来隔一周再回头做一遍重点看“当时不会但看了答案就懂的题”和“自以为会但表达失分的题”。把题目做成一张知识点表格比照自己的薄弱项知识点模块是否掌握丢分原因后续复习计划Web漏洞原理路径遍历/SQL注入/XSS是编码绕过细节不完整整理各语言过滤差异终端安全与主机防护部分只答出权限控制未展开内核对抗补充驱动与回调机制知识业务安全与人机识别是设计题缺乏风控分层思路复盘业务风控体系案例编程题实现否输入输出模板不熟练习ACM格式代码题这样的复盘方法虽然朴素但非常有效。我自己就是靠这个表格把笔试暴露出的短板在面试前补齐了后来面试聊到终端安全自保护时考官明显对我回答的系统性比较认可。最后再分享一个小技巧无论笔试题怎么变安全岗位考察的底层能力永远是“原理理解场景分析表达输出”。做对选择题只代表你认识这个知识点简答题能写透才代表你真正理解它。准备笔试时每学一个漏洞都问自己一句如果我是出题人这个知识点能怎么考然后自己出一遍题再自己答一遍。这个过程比做十套模拟题都管用。