ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

网易安全校招笔试复盘:从Web安全到备考路线

网易安全校招笔试复盘:从Web安全到备考路线 1. 先聊聊安全工程师笔试的整体轮廓1.1 网易安全校招笔试考什么安全工程师的笔试跟研发岗完全是两个路子。研发岗刷题刷得多LeetCode上找找手感基本能对付但安全岗笔试更“杂”杂到你会怀疑自己到底是在考程序员还是考网管。2018年我参加网易校招安全工程师笔试时拿到卷子的第一反应就是这题出得真有水平。整体来看这份卷子覆盖了Web安全、密码学基础、操作系统、网络协议、Linux常见命令、少量逆向和二进制知识最后还有一两道编程题。题型包括选择题、简答题和编码题选择题里有一部分是纯粹的概念题比如SQL注入和XSS的区别、对称加密与非对称加密的典型算法简答题就更有意思了会给你一个具体业务场景让你分析存在什么风险、怎么修复编程题则是让你手写一个小的安全工具或者做一个简单的算法题。这套题的总体风格是“重原理、重实战、轻死记”。我印象很深的是有一道题问HTTPS握手过程中客户端如何验证服务器证书这题如果只是背过“先验证证书链”但说不清具体校验什么字段、根证书存在哪里很容易暴露底子。1.2 备考优先级先守住大分值的几块很多人备考安全岗笔试容易掉进一个坑什么都想学结果什么都没学透。我自己的体会是安全工程师笔试虽然覆盖面广但分值分布非常不平均把大分值的模块拿下基本就稳了。根据我做过的网易、腾讯、阿里几家安全笔试复盘大致可以列一个优先级表格模块大致分值占比复习优先级Web安全注入/XSS/CSRF/SSRF等30%极高必须吃透密码学基础对称/非对称/哈希15%高概念清晰即可系统与二进制栈溢出/格式化字符串15%中高理解原理为主网络协议TCP/IP/HTTP/HTTPS10%高属于基本功操作系统与Linux命令10%中常见命令要熟练编程题20%极高必须能写代码这套结构其实也反映了安全行业对入门级工程师的期待你不需要在每个方向都有极深的造诣但你必须知道每个方向“大概是什么、什么时候会出现、怎么防护”。尤其是Web安全基本每份安全卷子都是重头戏因为现在绝大多数业务都跑在Web上攻防的主战场也在这里。2. 核心知识点拆解这些题必须拿分2.1 Web安全注入、XSS、CSRF、SSRFWeb安全是整个笔试的核心而且网易出题喜欢把几个漏洞放在同一个场景里考。比如给一段伪代码里面有两处参数拼接、输出没有编码、请求也没有Token校验让你指出有哪些安全问题。这种题就是考察你脑子里有没有一套“漏洞扫描清单”。先说说SQL注入。原理其实一句话程序把用户的输入当成了SQL代码的一部分去执行。但笔试不会只问原理它更可能问你“参数化查询为什么能防注入”。这个问题的关键点在于参数化查询把SQL语句的结构和数据分开了数据库先解析SQL结构再把参数值绑定进去用户输入再特殊也只会被当成字符串不会改变语句的结构。我用一个生活化的类比你点外卖时老板把菜单固定死你只能在“口味”那一栏填备注而不能自己把菜单改了。如果老板直接把你的备注拼进菜单让厨房去做那你说“不要辣另外把厨房改成烧烤摊”厨房可能真就烧烤摊了。再来看XSS。它和SQL注入本质是一样的都是“数据被当成代码执行”只不过一个是数据库里的SQL代码一个是浏览器里的JavaScript代码。网易的题喜欢给三种XSS让你区分存储型、反射型、DOM型。存储型是恶意脚本被存到服务器数据库里每次有人打开页面就触发反射型是恶意脚本通过URL参数反射到页面需要诱导用户点击DOM型则是纯在前端操作DOM节点时触发的根本不经过服务器。应对措施也有层次输入要做校验输出要做编码再加一道CSP内容安全策略作为兜底。这道题答得好不好能看出你是不是真的写过后台系统。CSRF跨站请求伪造是另一个高频考点。它的核心在于浏览器会自动携带Cookie服务器无法区分这个请求是用户主动发的还是恶意网站诱导发的。考试时常见问法是“如何防御CSRF”标准答案三条校验Referer、加Token、设置SameSite Cookie属性。我建议把Token校验放在第一位来说因为它是目前最通用的方案。但要注意有些场景下Token也会被窃取比如XSS存在时所以“防CSRF前先防XSS”算是一个进阶的回答能让你跟其他候选人拉开差距。SSRF服务端请求伪造在2018年前后开始高频出现因为很多业务都有“服务端拉取URL”的需求比如图片抓取、PDF生成、URL预检查。漏洞原理是攻击者控制了这个URL让服务器去请求内网地址从而探测或攻击内网。笔试喜欢考修复方案除了常规的URL白名单之外还有一个细节容易被忽略DNS rebinding。有些系统做了域名白名单但攻击者可以用一个域名先解析成合法地址通过校验请求时再解析成内网地址这种问题需要用“解析后校验IP且绑定请求使用同一解析结果”来防。能答出这一层基本说明你研究过真实的SSRF绕过场景。2.2 密码学不是背算法而是理解“用在哪”密码学是安全笔试里最容易被低估的一块。很多人觉得密码学就是记住几个算法名字AES是加密的RSA是加密的MD5是哈希的然后就去考试。结果一看题目给了一段密文和密钥长度让你判断用了什么加密方式或者给出一个登录流程图让你指出密码存储哪里错了。这种题不会就是不会但偏偏又是送分题。我建议用“场景驱动”的方式复习密码学。对称加密AES、DES典型场景是数据传输加密比如HTTPS里的会话数据加密特点是一个密钥既加密又解密优势是快劣势是密钥怎么安全送到对方手里。非对称加密RSA、ECC典型场景是密钥交换和数字签名公钥加密私钥解密私钥签名公钥验签解决了密钥分发问题但速度慢。哈希算法MD5、SHA-1、SHA-256不是加密它不可逆典型场景是密码明文存储的替代方案、文件完整性校验。但哈希也有问题很多用户密码是弱口令攻击者可以预先算好常用密码的哈希值做成彩虹表所以存储密码还要加盐每个用户不同的随机盐再把哈希结果存库。网易有一道题我记得很清楚给出了一个用户表password字段存的是MD5(password)问你存在什么问题。很多人只回答“MD5不安全应该用SHA-256”这其实是个误区。正确答案是不能用未加盐的简单哈希存密码应该用bcrypt、scrypt这类慢哈希算法或者至少加随机盐再做多次哈希。从这道题能看出出题人想考的不是你会不会背算法而是你知不知道实际系统里密码存储的业界标准做法。密码学里还有一个高频概念叫“中间人攻击”结合HTTPS握手来考。面试官会问客户端怎么知道拿到的公钥就是服务器的答案是数字证书和CA体系。证书里有服务器的公钥、域名、有效期还有CA的签名客户端用内置的根证书公钥验证签名再检查域名和有效期确认没问题才继续。这套体系虽然不完美CA被攻破、证书私钥泄露的前例都有但理解了这套信任链密码学模块的大头就稳了。2.3 系统与二进制安全栈溢出和格式化字符串系统与二进制这块对校招来说不会考太深但基本概念必须清楚。最常出现的是栈溢出题目通常给一个C语言代码片段局部变量定义了一个缓冲区用gets或strcpy往里拷贝数据问会产生什么问题。栈溢出的原理可以这样理解程序运行时每一个函数调用都会在栈上分配一块空间里面存放局部变量、函数参数、返回地址等。如果拷贝数据时没有检查长度数据会从低地址往高地址把函数栈里的其他内容覆盖掉最终覆盖到返回地址。当函数执行完需要返回时CPU从栈上取出被覆盖的返回地址跳转到了一个攻击者指定的位置。防御手段也经常考栈保护canary、地址空间布局随机化ASLR、数据执行保护NX、PIE。能把这几个术语说清楚并且知道各自防的是哪一步得分就不难。格式化字符串漏洞是笔试的另一道常客。简单来说如果程序员把用户输入直接当作printf的第一个参数比如printf(user_input)用户就可以用%x、%n这类转换符去读取或修改内存地址。考试一般考察原理问你为什么%n能写内存修复方案就是永远用printf(%s, user_input)这种固定格式字符串。我这里说一个做题技巧遇到二进制安全的填空题优先往“边界检查缺失、长度未校验、输入不可信”这三个方向想绝大多数漏洞的原理都归结到其中一条。3. 笔试题里的编程与算法3.1 编程题考察什么安全岗笔试的编程题通常和研发岗有两处明显不同。第一语言不限定但强烈建议用Python因为脚本语言处理字符串、网络请求、文本分析都方便笔试环境一般也支持。第二题目场景会带安全色彩很少让你写一个LRU缓存或者排序算法更多是实现一个检测逻辑、处理一份日志、写一个小爬虫。以我见过的高频题目为例大致有这几类写一个函数判断一个URL是否含有SQL注入特征比如检测引号、or 11等常见模式。给一份Nginx访问日志统计某个IP在指定时间窗口内的请求次数找出超过阈值的结果。实现一个简单的登录接口要求密码不能明文落库用加盐哈希存储。模拟登录状态下的越权访问检测判断一个用户请求是否在访问其他人的资源。这些题考察的是“能不能把安全思维写进代码里”。你写的代码不仅要能跑还要考虑异常输入、边界情况这恰恰是安全工程师日常做的工作。我在笔试时吃过大亏第一版代码能跑通正常case但输入里一旦带特殊字符就直接崩了那在阅卷人眼里基本就凉了。3.2 一道典型越权检测题的简化实现我记不清网易原题的具体表述了但不影响我们复盘一类的解法。给你一个很典型的场景系统有一个订单查询接口用户登录后可以查看自己的订单要求写一个权限校验逻辑。很多第一次写的同学会直接按请求参数里的user_id查询结果就是水平越权漏洞——登录用户A改一下请求里的user_id变成B就能看到B的订单。一个合格的实现思路是不要信任前端传过来的user_id而是从服务端会话里取出当前登录用户的身份再拿这个身份去校验资源归属。用Python带Flask写一个简化版示例from flask import Flask, request, session, abort app Flask(__name__) app.secret_key replace-with-a-random-secret # 模拟订单数据库每个订单属于某个用户 orders_db { 1: {user_id: 1001, product: AirPods, price: 999}, 2: {user_id: 1002, product: MacBook, price: 12999}, } app.route(/api/order/int:order_id, methods[GET]) def get_order(order_id): # 从服务端会话获取当前登录用户不信任外部参数 current_user_id session.get(user_id) if current_user_id is None: abort(401, {message: 未登录}) order orders_db.get(order_id) if order is None: abort(404, {message: 订单不存在}) # 关键校验当前登录用户必须等于订单归属用户 if order[user_id] ! current_user_id: abort(403, {message: 无权访问该订单}) return {order_id: order_id, product: order[product], price: order[price]}这段代码有几个点值得放在笔试里专门说明。第一登录用户身份通过session获取而不是通过请求参数传入这是一切权限校验的基础。第二即使越权请求传了别的user_id也根本用不到那个参数。第三权限校验失败时返回403还是401有讲究未登录是401已登录但无权限是403能主动区分这两者是加分项。写这类题的时候我建议在注释里简单写清楚“为什么不信任前端的user_id”阅卷人一眼就能看出你有安全意识。笔试不只是让你写业务逻辑也是在考察你会不会暴露安全漏洞这比代码本身跑不跑得通更重要。4. 面试环节的延伸考察4.1 从笔试到面试面试官爱追问什么笔试通过之后还有个环节容易让人翻车面试官拿着你的笔试卷一个模块一个模块追问。尤其是简答题你当时怎么答的面试官会顺着你的答案往下挖两层。如果你只是背了答案没有真正理解这一关很容易露馅。举个例子卷子上有一道“如何防御CSRF”的简答题你写了“通过Token校验”。面试官可能会追问Token放在哪里如果前端是App而不是浏览器Token还有必要吗如果全站都用了HTTPS要不要校验Referer这些问题没有标准答案考的是你有没有真的处理过这类问题。我当时被问到“Token是怎么生成和校验的”还好之前写过一个简单的Token工具就把随机数生成、存到Session、渲染进表单、提交时比对这一串流程讲了一遍面试官才点头。另一个容易被追问的点是“你说说XX漏洞的原理”一定要能做到三层递进第一层讲清楚是什么第二层讲清楚触发条件第三层讲清楚对抗手段。比如XSS你不仅要会说“把用户输入当HTML脚本执行了”还得能说“反射型需要诱导用户点链接存储型影响所有访问者DOM型绕过了后端检测”你还得说“输出编码要按上下文分HTML里用HTML实体编码JS里要转义反引号双引号尖括号”。能说到这种颗粒度面试官才会觉得你是真的懂。4.2 常见面试场景与应对心法网易安全工程师的面试一般会包含几个固定环节自我介绍、项目经历或CTF经历、技术基础、场景题、反问环节。这里说几个我踩过的坑。第一个坑是“只说自己做过说不清细节”。比如有人会说自己搭过扫描器但问用到了哪些规则、怎么减少误报、误报怎么处理答不上来。面试前一定要把自己写在简历上的每个项目都拆到细节至少能回答“技术选型是什么、为什么这么做、遇到的最大问题是什么、怎么解决的”这四连问。第二个坑是“遇到不会的问题嘴硬”。安全方向的知识面太宽面试官非常清楚你不可能全都会。我当时被问到一个关于Windows内核提权的过程我其实只知道大致思路细节不清楚我就直接说“这个我没有实际分析过只了解思路不太确定具体实现”面试官反而点点头换了个方向继续问。装懂才是大忌因为下一个追问如果你继续编就完全没法看了。第三个坑是“简历上写了某个漏洞平台账号或者SRC排名但没准备案例”。只要写了面试官一定会让你讲一个你上报过的真实漏洞案例。不要只讲“我发现一个XSS”要讲完整的故事链目标是什么系统、怎么发现入口、构造了什么请求、为什么这个请求能绕过现有过滤、影响面有多大、怎么修复的。这个讲好了比任何面试题都加分。应对心法归纳起来就三条把知识体系串成“原理-场景-修复”的链条准备3个可以深讲的真实案例凡是拿不准的问题坦诚说边界再给一个推断思路。面试官真正想看到的是你怎么思考一个未知问题的过程而不是标准答案本身。5. 备考路线与避坑指南5.1 系统化备考路线从基础到实战如果时光倒流我会按下面这条路线来准备安全工程师校招笔试而不是像当年那样东一榔头西一棒子。这条路线适合已经有一些编程基础、但对安全方向还没有系统认识的同学。第一步是打基础重点补齐计算机网络和操作系统。网络要重点理解HTTP请求响应的结构、Cookie和Session机制、TCP三次握手和四次挥手、DNS解析过程。操作系统要了解进程内存布局、栈与堆的区别、Linux常用命令和权限模型。这一步不需要做攻击实验但必须做到看到一个名词能说出它是干什么的。第二步是学Web安全推荐从经典的“开放式Web应用程序安全项目”OWASP Top 10入手。不需要每个漏洞都跑一遍靶场但要对前几个核心漏洞——注入、失效的身份认证、敏感信息泄露、XML外部实体、访问控制失效、安全配置错误——达到“能说出原理、能描述攻击场景、能给出修复方案”的水平。我当时花时间最多的就是这层因为它性价比最高。第三步是动手做练习。有两个方向一是去CTF竞赛平台刷Web方向题目从简单的“查看源代码找到flag”开始慢慢接触注入类型、文件上传、反序列化等真实考点二是在本地搭一个靶场环境跟着已知漏洞流程走一遍看请求包和响应包的变化。这一步非常关键只看资料不动手考前很容易心虚。第四步是做真题和模拟题。笔试前两周把能找到的安全笔试真题都做一遍重点不是对答案而是总结出题人偏好哪些考点。做完之后把错题涉及的知识点整理成自己的知识库考前最后一天只看知识库不看大块资料。5.2 备考中的踩坑记录我也替大家踩过不少坑写下来帮你们避开。第一个坑是“复习面铺太广核心没吃透”。安全技术栈实在太宽了逆向、二进制、移动安全、云安全、IoT安全每个方向都能深挖几本书。但笔试时间有限一定要记住那句话Web安全是保命项密码学是送分项二进制是拉分项。如果你时间有限把Web和密码学吃得足够透编程题能写出来整套卷子分数就不会难看。第二个坑是“只背修复方案说不清原理”。有些复习材料特别喜欢整理“XSS修复方案1234”很多人就背着去考试结果笔试问法稍微变一下比如“为什么输出编码能防XSS”立刻就懵了。我的建议是复习任何漏洞先自己试图描述一遍原理再看看标准答案而不是反着来。第三个坑是“编程题不练”。我当年犯过这个错觉得前面的题都答得差不多了结果编程题写得磕磕绊绊。笔试环境一般没有IDE提示平时练习尽量用普通文本编辑器写代码特别是Python这种靠缩进区分的语言手写很容易出错。第四个坑是“没有准备自我介绍和项目复盘”。笔试全过了最后卡在面试这是最可惜的。建议在投简历之前就把自己简历里每个项目写一份“五句话复盘”项目背景、我的角色、核心技术点、遇到的最大问题、最终结果。面试前对着镜子练一遍自我介绍控制在1分半以内重点讲你最贴合安全工程师岗位的经历。这段准备好了面试自信心会稳很多。如果你也正在准备安全方向的校招希望这份复盘能帮你少走一些弯路。安全这条路笔试只是第一道门槛真正拉开差距的是你有没有把每一项技术都理解到“能讲给另一个人听懂”的程度。平时多动手验证多写点小工具积累自己的排查思路比考前突击背书有用得多。
返回列表