奇安信校招笔试复盘:路径遍历、终端安全与验证码考点全解析
2026/9/9 13:20:59 网站建设 项目流程

每年秋招前后,总有学弟学妹来问我“奇安信笔试到底考什么”。我自己是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?filename=report_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格式代码题

这样的复盘方法虽然朴素,但非常有效。我自己就是靠这个表格,把笔试暴露出的短板在面试前补齐了,后来面试聊到终端安全自保护时,考官明显对我回答的系统性比较认可。

最后再分享一个小技巧:无论笔试题怎么变,安全岗位考察的底层能力永远是“原理理解+场景分析+表达输出”。做对选择题只代表你认识这个知识点,简答题能写透才代表你真正理解它。准备笔试时,每学一个漏洞,都问自己一句:如果我是出题人,这个知识点能怎么考?然后自己出一遍题,再自己答一遍。这个过程比做十套模拟题都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询