2019年那场春招,奇安信笔试我印象挺深。当时我身边不少同学以为网络安全公司的笔试就是刷“安全工程师题库”,结果一上来就被题目里的场景化问法打懵了。那一轮笔试考察的并不是简单的概念背诵,而是安全服务、渗透测试、应急响应里真正会遇到的问题,全部压缩成一张在线试卷。
这篇文章不打算贴所谓的标准答案,因为网上流传的版本本来就七零八落。我根据自己的回忆,结合当年校招群里大家讨论出来的复盘版本,把奇安信2019春招笔试题(一)涉及的题型、高频考点和答题思路完整梳理一遍。目标是帮准备走安全方向的读者建立一条清晰的复习线索,同时也让你知道每道题背后对应的工作场景和影响范围。无论你是在校生,还是刚转行想做安全,这篇文章应该都能帮你少走一点弯路。
1. 笔试到底在筛什么
1.1 不是让你背答案,是看你怎么分析问题
奇安信的笔试题目有一个很明显的特征:题目都会套上一个“已经发生了什么”的场景。比如一道选择题,它不会直接问“SQL注入是什么”,而是给你一段登录接口的代码,让你判断存在问题。这种出题方式筛掉的是靠背题通过的选手,留下的是真正理解攻击链路的人。
我当时印象很深的一道题,大意是给了一个PHP文件上传功能的代码片段,选项里有“未校验文件类型”“文件名拼接路径时可目录穿越”“上传目录没有禁止脚本执行”等。很多同学只盯着“文件类型校验”这一个点,却忽略了后面的路径拼接问题。那道题的正确思路应该是把文件上传一整个流程走一遍:从哪里上传、存储到哪个目录、文件名怎么生成、上传之后能不能被解析执行。任何一个环节有疏漏,都会导致完全不同的利用方式。
所以准备笔试不要只记结论,要习惯用“输入-处理-输出-影响”这条链去思考安全风险。这个思维在后面的编程题和场景分析题里基本上会反复出现。我把题目里“为什么这么问”当成第一件事来复盘,后面再去拆具体知识点,效率会高很多。后来跟一些做招聘的同学聊过,他们也说笔试要看的往往是“分析路径”,而不是那个最终结论,因为最终结论在真实工作里可以查文档,分析路径却只能靠自己攒。
1.2 题型分布与时间分配建议
根据当时的印象,奇安信2019春招笔试题(一)大致分为三类:客观题、主观场景分析题、在线编程题。客观题分布在最前面,覆盖网络基础、Linux、数据库、Web安全基础;主观题一般是给一段日志或代码,让你写出漏洞成因、利用思路和修复建议;编程题则是标准的在线编程平台模式,会有用例判分。
我建议的时间策略是:客观题控制在总时长的35%以内,不要在一道不确定的选择题上纠结太久;主观题至少留30%,因为这类题按点给分,写得越完整越容易拿分;最后剩下的时间全部给编程题,哪怕只能过部分用例,也要把暴力解法跑通,至少不能交白卷。
年份和具体题量我不保证完全准确,但备考时按这个结构来分配是稳妥的。你可以把投递方向也考虑进去:偏渗透的方向,Web安全和系统安全权重更高;偏研发的方向,编程题和数据结构权重更高。我见过有人把大量时间花在记忆CVE编号上,结果笔试里其实不考这种死记硬背的东西,反而因小失大。时间花在哪里,方向要对。
2. 高频考点逐个拆解
2.1 网络基础:端口、协议、日志特征
网络安全公司笔试考网络基础,算是一种“行业惯例”。TCP三次握手、HTTP状态码、DNS解析流程、TLS握手过程,这些几乎是必背内容。但奇安信的考法会加一层“安全视角”。比如同样的HTTP状态码,它不会只考404代表什么,而会问你“扫描器不断收到401/403,说明目标可能做了什么防护”。这种题考的是对协议特征和访问控制机制的理解。
端口映射也是一个高频点。SSH是22,MySQL是3306,Redis是6379,Elasticsearch是9200,这些数字在安全日志分析里天天出现。笔试里可能会给一段报警日志,让你判断是Redis未授权访问还是MySQL弱口令爆破。看到端口和返回特征,基本就能判断个八九不离十。我当年就是把常用端口和服务整理成一张表,每天过一遍,笔试时确实帮了大忙。
还有一类网络题跟流量分析相关,会让你从HTTP日志中找异常。正常日志的User-Agent比较杂,但如果大量请求的UA都是同一个扫描器特征,或者URL路径里包含常见的敏感目录,就值得警惕。这种题与其说考协议,不如说考能不能从日志里读出安全事件。如果你平时用过Wireshark或者tcpdump,看到这类题目会觉得特别亲切,因为本质就是把抓包分析搬到了试卷上。
2.2 Web安全:SQL注入、XSS、CSRF、文件上传
Web安全在整张试卷里的占比很高。这跟实际工作有关,不管是攻防还是防护,Web漏洞都是最常见的突破口。SQL注入要理解本质是“数据被当成代码执行”,因为开发者把用户输入直接拼进SQL语句。修复手段不是简单“过滤关键字”,而是参数化查询,把数据和SQL结构分开。MyBatis里#{}和${}的区别,本质上也是这个原理。
XSS考的更多是分类和利用场景。反射型、存储型、DOM型的区别,以及各自的危害范围,都要能说清楚。这里容易丢分的地方是“影响范围”的描述。很多人只写“弹个窗”,但阅卷人想看到的是“存储型XSS会把恶意脚本持久化在服务器上,访问该页面的用户都会被影响,可能造成会话劫持”。把这个描述完整,分数自然就上去了。
CSRF相对容易被忽略,但笔试里也出现过。核心是“浏览器会自动携带Cookie”,服务端无法区分这个请求是用户主动发起的,还是恶意页面借用户的身份发起的。防御思路主要有三种:校验Referer、加CSRF Token、关键操作二次确认。答题时把这三条写全,基本不会失分。
文件上传是另一个笔试常客。题目一般会给一个上传接口的代码,问你存在什么问题。你至少要能讲清楚几个关键检查点:扩展名是否做白名单校验、文件内容是否校验了文件头、存储目录是否禁止脚本执行、上传后的文件名是否随机生成。这几点对应了不同的攻击路径,写全才能拿高分。我自己在准备这部分时,会把每一个漏洞点都配一个“如果我是攻击者,我怎么利用”的脑图,反向记忆印象特别深。
2.3 加密与编码:识别套路比会写算法更重要
加密相关题目在2019年的笔试里不算难,但坑很多。比如给你一串“5L2g5aW9”,选项里有MD5、Base64、URL编码、SHA-1。看到结尾的“==”和字符集范围就能判断是Base64,但很多同学一看到密文就慌了。我当时是先把常见编码的特征记下来:Base64由大小写字母、数字、+ /组成,长度是4的倍数,经常有=填充;URL编码是%后跟两位十六进制;十六进制是0-9和a-f。
另一个高频坑是“哈希是不是加密”。MD5、SHA-1、SHA-256都属于哈希算法,不可逆;AES、RSA属于加密算法,可逆。笔试里经常有人混淆。题目如果问“用户密码在数据库里存储使用MD5是否安全”,只回答“MD5不可逆所以安全”是不完整的。因为弱口令可以被彩虹表反查,所以要加盐并选择更合理的密码哈希方案。
这类题背后的工作场景是日志分析和应急处置。你在日志里看到一串可疑参数,首先要能判断它是编码混淆、加密数据还是普通参数,后面才能决定要不要解码、怎么分析。所以笔试考编码识别,不是单纯为了为难你。我复习时会把Base64解码和URL解码这几个常用操作练到形成肌肉记忆,因为工作里真的会频繁用到。
2.4 系统权限与主机安全
安全岗笔试基本不会绕过系统基础。Linux文件权限、用户和组、SUID位、环境变量、计划任务,这些都可能出题。我记得有一道题是问“Web服务以root权限运行存在什么风险”。答案是:一旦Web应用被攻破,攻击者拿到的就是root权限,后续提权步骤都不需要了,影响范围等于整个服务器。
正确的做法是给服务单独建一个用户,只授予它需要读取的目录和文件权限。进程监听端口也要尽量不用1024以下的特权端口,除非确实有需要。这类题考察的是最小权限原则,笔试里可以用一个反向问题来检验理解程度:假如一个WebShell成功落地,但服务运行在低权限用户下,攻击者能碰哪些东西?想清楚这个,你对权限的理解就会扎实很多。
Windows方向也可能出题,比如自启动目录、注册表Run键、服务权限配置。如果目标岗位偏终端安全,这些内容占比会更高。我备考时把Linux和Windows的常见提权路径各自整理成一张表,不背细节,只记风险点,因为笔试关注的是“你知不知道这里可能有问题”,而不是“你能不能复现提权exp”。
2.5 安全运营与日志分析题
除了漏洞利用,奇安信这类安全厂商也很重视安全运营能力,所以日志分析题在笔试里出现的概率不低。核心考点是:给你一堆系统日志、应用日志或流量日志,让你找出异常并判断原因。比如同一IP在短时间内对多个账号尝试登录,题目会问“这是什么行为,该怎么处置”。
回答这类题要先定位异常特征:时间维度上有没有集中爆发,源IP是否单一,目标是否集中在某个接口,返回状态码有没有规律。描述清楚这些,再给出处置建议:封禁来源IP、通知业务侧确认账号安全、增加登录频率限制、对已经登录的会话做失效处理。这套回答逻辑我在笔试里用过很多次,基本能覆盖大多数日志分析题。
安全运营题最忌讳的就是只回答“封IP”三个字。阅卷人希望看到你有没有“检测-响应-处置-加固”的完整闭环意识。哪怕你写的步骤很简单,只要你把这个流程走完,分数就会明显不一样。这也是我在整理这份复盘时最有收获的一点。
3. 几道典型题的完整复盘
3.1 流量日志分析:识别SQL注入尝试
当时笔试里有一道题给了一段HTTP访问日志,里面有几个POST请求,请求参数长这样:
192.168.10.7 - - [01/Mar/2019:10:15:23 +0800] "POST /login.php HTTP/1.1" 200 5261 "-" "Mozilla/5.0" 192.168.10.7 - - [01/Mar/2019:10:15:26 +0800] "POST /login.php HTTP/1.1" 200 5380 "-" "Mozilla/5.0" username=admin' OR '1'='1&password=123456题目问:判断请求是否存在攻击行为,说明判断依据和处理建议。
我看到这个参数的第一反应就是SQL注入尝试。判断依据有三个:参数值里出现了SQL关键字OR和恒真表达式;单引号打破了原有SQL语句结构;登录场景下这种输入极大概率是在尝试绕过认证。如果有返回包,还可以补充判断依据:请求返回的长度异常、响应状态码变化、数据库报错信息等。
处置建议要从两个角度写:一是临时防护,在网关或WAF上封禁来源IP,并对登录接口增加频率限制;二是根治修复,代码里改用参数化查询,把用户名和密码作为参数交给数据库预编译,而不是拼接进SQL语句。影响范围要写明:如果注入成功,可能造成登录绕过、用户数据泄露,甚至通过数据库写文件能力进一步控制服务器。
这种题不需要多么高深的知识,但回答要完整,按“发现-判断-影响-处置”四步走,把你看到的现象、依据和后续动作都写出来。即使判断错了方向,只要逻辑清晰,多少也能拿到分。当时群里好几个人讨论说,自己只写了“存在SQL注入,建议修复”,一句话就结束了。这种回答太单薄,阅卷人根本看不出你懂不懂原理。
3.2 代码审计:从参数拼接到预编译
代码审计题是奇安信笔试里比较有区分度的题型。给我印象最深的是这么一段简化代码:
<?php $id = $_GET['id']; $result = mysql_query("SELECT * FROM users WHERE id = $id"); while ($row = mysql_fetch_assoc($result)) { echo $row['username']; } ?>虽然是很老的写法,但思路可以套用到任何语言。第一眼看代码,先找外部输入:$_GET['id']。接着看数据流向:这个变量直接拼到SQL语句里,没有任何过滤或类型校验。最后看执行点:mysql_query执行了这条语句。三步走下来,SQL注入的判断就很明确了。
修复方案怎么写?至少给出两层:第一层是参数化查询,用PDO预处理把$id作为参数传入;第二层是输入校验,比如is_numeric判断id是否为数字,或者按业务规则做白名单校验。答题时把两层都写,比只写一句“过滤单引号”要专业得多。
这段代码对应的工作场景是旧系统改造和安全审计。你去审一套老代码,经常能看到mysql_query这种写法,不可能直接推倒重来,只能在现有基础上用最小改动降低风险。笔试里考代码审计,本质上是在模拟这个场景。我当时复习的做法是每天看5段有漏洞的代码,先自己找问题,再对照修复方案。看得多了,代码里的危险点基本一眼就能扫出来。
3.3 编程题:IP合法性校验与日志统计
在线编程题里,我遇到过的题型包括字符串处理、数组、基础数据结构。有一道题很典型:实现一个函数,判断传入的字符串是否是合法的IPv4地址。这题本身不涉及安全,但很考验边界处理,跟安全日志处理密切相关。
import re def is_valid_ipv4(ip: str) -> bool: if not ip or len(ip) > 15: return False parts = ip.split('.') if len(parts) != 4: return False for part in parts: if not re.fullmatch(r'\d{1,3}', part): return False if len(part) > 1 and part[0] == '0': return False num = int(part) if num < 0 or num > 255: return False return True这道题容易漏的点有几个:字符串为空、包含非法字符、分段数不是4、某段超过255、前导零问题。比如“01.2.3.4”算不算合法,不同题目要求不一样,题目通常会说明;如果没有说明,我倾向于按严谨格式判False。边界条件全考虑清楚,代码才算稳。
另一类编程题更贴近安全运营:给一段日志文件,要求统计每个IP出现的次数,输出Top10。核心就是用正则把IP行提取出来,再用字典或defaultdict计数,最后排序。先写一个能跑通的版本,再考虑日志文件很大时如何流式处理,不至于一次性读入内存。笔试平台限时,代码不一定最优,但必须保证逻辑正确、能跑出结果。
我的经验是,编程题平时刷LeetCode的简单到中等题就够,但一定要自己手写,不能只看题解。因为在线笔试的判题环境对缩进、函数签名、输入输出格式要求很严格,平时不练,考场上很容易因为小问题拿不到分。
3.4 安全配置题:Redis未授权访问
笔试里还有一类题目不给你代码,给你环境配置,让你判断风险。最典型的就是Redis未授权访问。题面可能简化成这样:一台服务器的Redis服务监听在0.0.0.0:6379,没有配置密码,也没有设置protected-mode,问有什么风险。
这道题考察的知识点很集中:Redis默认只监听本机回环地址,如果修改成公网或内网全网段监听,并且没有设置认证,外部主机可以直接连接并执行命令。结合Redis自身的功能,攻击者能往web目录写WebShell、写计划任务、修改配置,影响范围不光是缓存数据,还可能扩散到整个主机。修复建议包括:设置密码、开启protected-mode、监听内网地址、不要用root权限运行Redis服务。
我把它单独拿出来复盘,是因为很多人复习时只关注Web漏洞,却忽略中间件和数据库配置。奇安信笔试既然考了这类题目,说明安全厂商确实看重“基础安全配置”这一块。你在回答时如果能补充一句“需要先判断Redis进程用什么权限运行”,会让阅卷人觉得你考虑到了权限维度,印象分会明显提升。
4. 最容易被扣分的坑
4.1 时间分配策略
我在前面说过客观题不要恋战,这里再展开讲讲具体的坑。我当年做客观题时,遇到一道关于Linux权限的题犹豫了很久,结果后面编程题时间不够,最后一道题只写了个半成品。后来复盘发现,那道权限题就算做对了也就1到2分,但编程题半个题的分值远高于它。两相对比,非常不划算。
进答题页之后,建议先把全部题目快速扫一遍,题目分值一般会标注,没有标注的话就从主观题和编程题的分值反推。先做自己确定能拿分的题,主观题就算不确定也要写思路,至少要把“漏洞点-利用效果-修复建议”这个框架填满。只要框架在,阅卷人大概率会给你过程分。
在线笔试平台通常不允许切屏,所以提前把草稿纸、IDE、文档准备好很有必要。不过笔试过程中的操作规范也要注意,我在校招群里看过有人因为频繁切屏被判违规,虽然不知道具体原因,但可能跟平台监控有关。环境干净一点,对自己只有好处。
4.2 常见答题误区
第一个误区是“答得太短”。主观题只写结论不写过程。比如“有什么风险”只写“严重”,却不说明被攻击后会造成什么影响。你得把攻击者拿到什么权限、能读到什么数据、对业务有什么影响串起来,才能体现你真正理解了风险。
第二个误区是“修复方案太笼统”。写“加强输入过滤”不如写“使用参数化查询,并对上传文件扩展名做白名单校验”。阅卷人看的是可落地性。面试官在后续追问中也一定会问“具体怎么改”,如果你笔试和面试回答不一致,会非常减分。
第三个误区跟编程题有关:不测异常输入。很多同学写完代码只跑正常用例,提交之后才发现边界条件没处理。比如IP合法性那道题,空字符串和超长字符串是常见隐藏用例。平时练习就养成补边界测试的习惯,考试时会省很多冤枉时间。
第四个误区是忽略“影响范围”的描述。安全岗位最核心的能力之一就是评估影响范围。一道题问“这个漏洞有什么危害”,你不仅要答“命令执行”,还要说明执行权限是什么、能访问到什么数据、是否可能横向移动。对这些有意识,才说明你有实战视角,而不是只会背书。
4.3 笔试结束后如何复盘和准备面试
笔试不是交卷就结束了,尤其对安全岗来说,笔试题目往往就是面试提纲。你写了“使用预编译修复SQL注入”,面试官大概率会追问:预编译的原理是什么?MyBatis的#{}和${}有什么区别?Join查询和子查询在预编译下有没有例外情况?这些东西必须在笔试结束后马上整理成一套自己能讲清楚的版本。
我建议做一个“为什么”清单。每一道做过的题,都往下问三个为什么。比如:Web服务为什么要用普通用户运行?因为最小权限;最小权限具体怎么落地?给服务单独建账号、目录权限按需分配、限制Shell登录;那如果这个账号被攻破,攻击者能干什么?能读服务数据,但改不了系统文件,提权还需要找新漏洞。能把这个链条讲清楚,面试基础关基本就过了。
安全行业变化快,2019年的题目和现在的题目肯定有差异,但考察的能力模型没有变:懂协议、懂漏洞、懂权限、懂编码,还要能写代码。把这些基础能力夯实,不管题目怎么变,你都能接得住。
我个人在整理这份复盘时最大的体会是:笔试最大的价值不是那张分数,而是逼你把零散的知识串成体系。把每个考点当成一个锚点,往外延伸出原理、场景、修复方案,这套复习方法我后来推荐给好几个朋友,效果都还不错。希望这篇关于奇安信2019春招笔试题(一)的复盘,也能帮你把复习思路理清楚。