网络信息安全从业者面试指南
互联网是计算机行业中薪酬最高的,而技术工程师是互联网中薪酬最高的,而安全工程师又是技术工程师中最高的。安全行业井喷式的爆发,使得每家互联网企业的安全部门成为标配并逐渐蔓延开来,而由于高校的安全专业才开始普及,安全从业人员紧缺且入门门槛较高从而导致了薪酬水涨船高。
好处是会有更多的人投身于安全,当然坏处也很明显,着急的岗位和紧缺人员导致存在大量良莠不齐的人在其中浑水摸鱼,明显的特征是你跟他聊技术细节他跟你聊推进落地,你跟他聊推进落地他跟你聊方向把控,你跟他聊方向把控他跟你聊团队管理,你跟他聊团队管理他跟你聊行业空间,如果这些方面都能聊一点那也行,更多的人是答非所问又或者句句有理但空洞没有屁用,又或者是今天这里听到一个理论还没弄明白呢明天就来跟你拽个概念,虽然这么说会得罪一部分人。
安全是一个小圈子,圈内的事情传播的非常快,比如谁家数据库泄露了、谁家被薅羊毛了、谁被抓了、谁被处罚了,这也是小圈子最大的好处,圈内的人很快能知道这个行业的新技术、新方向、新政策。你也可以很容易的知道每家公司的安全建设情况,比如你可以和阿里的人聊他们的线下配合公安的手段有多强,也可以和腾讯的人聊他们的SRC如何运营的这么好,也可以和百度的安全人聊如何让机器学习赋能安全产品的,这一切在安全圈内非常的容易。也有很多的安全会议可以学习到每家公司的经验,不用所有的事情都自己摸索也用闭门造车。
弊端也很明显,搞所谓的”圈子文化“,混迹于各种会议去主动认识各种圈内的人(当然这里不是指各家SRC运营的同学,这些是运营同学的工作一部分),认识的各种人如果是交流技术那也行,加了微信除了打招呼的自我介绍那句话就再也没说过有意义的东西,以为这样就进入了圈中心,可笑可悲。
具备基础的工程师素质是一切的基础,在这个基础之上如果在攻防渗透和软件开发、兴趣驱动和适应能力上比较亮眼,则能很好的适应工作挑战。
首先要明确一个概念,术业有专攻在安全行业不是常态。安全本身就是一个覆盖了客户端、前端、网络、后端、服务器等涉及JavaScript、Python、PHP、Java等各语言的工作,如果非要讲究术业有专攻就没法做了,当你可以有擅长的方向,但前提是你都懂,这个懂不应该停留在了解的层面,如果你是安全开发工程师除了研发技能外还必须知道常见漏洞的形成原因、利用方式和修复方案,如果你是渗透工程师除了理解各种漏洞的攻击细节外,还必须有基本的开发能力。
同时拥有攻防渗透和软件开发的人,在后面做事的方方面面会体现出极大的优势。
我们有过很资深研发工程师,但安全产品不同于用户产品,往往是都没有经验也没有参照物的,摸黑前行最好的情况是你曾住过这个房子,所以往往需要有很强的安全背景/不断的试错调整才能开发最好的产品。甚至在很多时候,沟通交流/思维上都需要进行转变才能更好的协作,减少代沟和沟通成本。这个要求并不是非要精通各种。
现状是安全行业更多的人是偏向于攻防渗透,而如果同时拥有很强的开发技能,优势将非常明显。在安全产品开发/漏洞挖掘/代码审计上。
不同岗位间的互补显得非常重要,做漏洞扫描器的如果在SRC挖过漏洞、做代码审计如果会软件开发、做合规审计的如果有CISP证书就会得心应手。
像安全产品开发一样,渗透测试也需要不断的试错,不断的将各种可能存在漏洞的地方一一测试,往往测试数百个请求才有所收获,这需要很好的坚持,但坚持这种品质无法立刻学会,但往往有很多东西能促使我们坚持,比如兴趣。我对于安全的坚持就是兴趣所驱动的,我会遇到一个线索从早上折腾到凌晨,会因为一个突破点从晚上摸索到下午。 我见过太多优秀的白帽子都是因为热爱,他们能跨行业的热爱。
软件工程师是三年换一轮新技术,而安全工程师则是每年都有新的方向。每天都会有新的漏洞/新的攻击方式/新的语言漏洞,每年也会有新的安全技术、安全防御手段、安全方向,而应对别无他法唯学习,良好的自驱自学能力是一切的基础。
如何有效的甄别一些滥竽充数的人,最重要的肯定是面试这道坎。安全圈的东西行业内的人谁都能聊一点,所以一轮面试一定得安全技术负责人亲自把关,深入的问细节来判断。
- 提前约好面试时间和面试方式(电话/现场)
- 准时参与面试,有事情应提前电话沟通到位
- 面试时把握好节奏,及时阻止话多的,多留停顿给话少的
- 面试时不问/不透露公司敏感信息
- 即使只聊一分钟就觉得面试者不合适,也不应该立即挂断,面试应不少于20分钟
- 自我介绍下个人情况、做过的项目和技能
- 观察谈吐,看思维逻辑是否有条理,沟通交流是否顺畅
- 性格类型是否合适
- 围绕做过的项目进行细节提问,提问的问题根据岗位不同可以从3.2中抽取
- 考察项目真实性、项目角色及分工
- 对项目的理解程度、掌握程度、思考等
- 遇到解决不了的问题怎么做?
- 考察学习能力和动手解决能力
- CTF、乌云、翻墙、写技术博客、技术书籍、参与GitHub开源项目、常浏览的网站、游戏、电视剧、业余时间干嘛、业内牛人
- 综合体现出其技术热度
- 算法、前端、服务器的掌握程度
- 一些基础算法,比如快速排序、冒泡排序、选择排序、插入排序
- 一些机器学习算法,CNN、RNN、Tensorflow、验证码识别等等
- 前端JavaScript、HTML、CSS掌握程度,调试工具,编码等
- 服务器常用命令、配置、文件权限、进程栈、端口占用、异常日志等
- 自认为自己比身边人的优势
- 挖掘亮点,如何客观看待自己
- 自认为的缺点
- 客观的自我评价,讲自己没有缺点的基本可以不要了
- 最有成就感的事情
- 考察价值观,尤其对于一些未授权渗透甚至黑灰产事情的态度
- 未来职业规划?
- 请否有清晰的职业规划,对自己未来有长远思考
- 和当前岗位对匹配度
- 还有什么要问我的吗?
- 了解面试者所关心的侧重点
- 挑选两到四个不同方向常见和不常见的漏洞,就漏洞原理、利用方式和修复方案进行提问,然后根据回答的情况进行详细深入的二次提问
- Redis未授权访问漏洞如何入侵利用?
- SSRF漏洞原理、利用方式及修复方案?Java和PHP的SSRF区别?
- 宽字节注入漏洞原理、利用方式及修复方案?
- 简述JSONP的业务意义,JSONP劫持利用方式及修复方案?
- CRLF注入原理?
- URL白名单绕过?
- XSS持久化?
- 渗透全流程
- 就漏洞的检测发现进行提问
- 越权问题如何检测?
- 黑盒如何检测XSS漏洞?
- 如果爬取更多的请求?
- 应急思考
- 有哪几种后门实现方式?
- webshell检测有什么方法思路?
- Linux服务器中了木马后,请简述应急思路?
- 遇到新0day(比如Struts2)后,应该如何进行应急响应?
- 新业务上线前可以从哪些方向进行安全评估?
- 现有系统可以从哪些方向进行审计发现其中的安全风险?
- 基础开发
- 简述Python装饰器、迭代器、生成器原理及应用场景?
- 简述Python进程、线程和协程的区别及应用场景?
- Java基础
- Java虚拟机区域如何划分?
- HashMap和HashTable、ConcurrentHashMap的区别?
- 进程和线程区别,进程间、线程间通信有哪几种方式?
- Java BIO/NIO/AIO是什么?适用哪些场景?
- 算法基础
- 快速排序的过程和复杂度?
- 冒泡排序的过程和复杂度?
- CNN对比RNN区别?
- 业务基础
- 调试工具及异常排查流程?
- 数据库索引结构,什么情况下应该建唯一索引?
- 数据库分页语句如何写?
- 业务安全
- HTTPS交互过程
- OAuth2.0交互过程及其中可能存在的配置不当安全风险
- 对称加密和非对称加密的区别及优缺点
- 获取一个入参url,请求url地址的内容时应注意什么?
- 参数入库前应该如何过滤?
- 过滤器和拦截器原理和应用场景?
- SESSION ID如何不被Javascript读取?
- CSRF的Token如何设计?
- 同源策略?如何实现跨域请求?
- 对于内控、合规、审计的理解
- 考察其对于要做的事情和岗位要求、公司环境是否匹配
- 考察其大局上考虑是否周全或是片面
- 传统行业和互联网行业的安全建设的区别及各自的优劣势
- 是否能准确的抓住核心原因
- 信息安全等级保护、网络安全法、GDPR
- 挑选一到两个问其对其的来源理解以及落地程度取舍
- 数据安全治理可以用什么思路做?
- 如何通过技术手段实现对异常操作的自动化监控?
- 如何对一个应用进行安全评估?
- 如何对一个应用进行安全审计?
- 如何理解权限分离、最小化权限?
- 考察一些CISP、CISSP的知识点
- 流程的设计
- 挑选一些较为复杂的流程,比如转岗、离职等,如何设计考虑其中的细节
- 渗透测试、安全研发、安全运营的问题可以挑选的问一些,以确保在各个方向上比较均衡
- 对于企业不同时期、不同阶段、不同体量的安全建设的方法、区别以及侧重
- 你所做过的安全架构图和所期望的安全架构
- 安全与其他团队(运维、研发、测试、GR/PR、内控、高管及三方安全公司)的关系
- 安全建设的理念/方法论理解
- 纵深防御
- 木桶原理
- 由外而内
- 先低后上
- 能口不点
- 最小权限
- 权限分离
- 白名单和黑名单
- 漏洞和误报
- 规则经验和机器学习
- 漏洞危害证明
- 技术管控与意识提升的关系
- 安全推进方法
- 自研OR外采?
- 找到总的核心目标和各个项目的主要目标
- 创新和极致
- 责任分担
- 黑天鹅和灰犀牛
- 衡量企业安全建设的水平
- 不同公司间的安全区别或差别是什么?比如腾讯和阿里,百度和京东
- 如何制定公司安全建设的三年甚至五年计划
- 未来安全行业的发展方向?
面试题目往往大同小异,而由于圈子小的原因很容易传播出去,如果做过准备哪怕深入的问也可能有漏网之鱼。而笔试往往能很好的看出来其动手能力,所以应尽可能的出一些无法提前预知、无法网上查询的专属题目,题目可以侧重于开发、调试、数据操作等方面。
- 给定一个漏洞靶场,在一定时间内找出最多漏洞数
- 给定一个匿名访问Redis,请GET SHELL
- 给一个项目场景进行安全评估(e.g.与三方厂商进行API交互)
- 读取一个文件第100-200行并发送到一个指定的API接口(着重考察对于各种异常情况的考虑)
- 最快的方式获取100万个子域名请求的响应内容并找出其中真实存在的子域名
- 给一个数组
[3,4,5,6,2,1,8]
,输入所有二元组其和为8。- 每个数字只能用一次
- 数组长度不定
- 考虑时间复杂度和空间复杂度,以最高效率
- 存在一个list结构(表1),请转换为树状结构(表2)
- pid和id关系为父子关系
- name为无规律随意命名
表1:list结构(list length>1000)
[
{
'id': '111',
'pid': '0',
'name': 'A1'
},
{
'id': '222',
'pid': '111',
'name': 'A-B1'
},
{
'id': '223',
'pid': '111',
'name': 'A-B2'
},
{
'id': '224',
'pid': '111',
'name': 'A-B3'
},
{
'id': '333',
'pid': '223',
'name': 'A-B2-C1'
},
{
'id': '444',
'pid': '333',
'name': 'A-B2-C1-D1'
}
]
表2:最终的结构
{
'id': '111',
'pid': '0',
'name': 'A1',
'child': [
{
'id': '222',
'pid': '111',
'name': 'A-B1'
},
{
'id': '223',
'pid': '111',
'name': 'A-B2',
'child': [
{
'id': '333',
'pid': '223',
'name': 'A-B2-C1',
'child': [
{
'id': '444',
'pid': '333',
'name': 'A-B2-C1-D1'
}
]
}
]
},
{
'id': '224',
'pid': '111',
'name': 'A-B3'
}
]
}
内推是优于招聘网站或猎头的,和找女朋友一样,熟人介绍的比媒婆介绍的要好,更不用说相亲网站的质量了。对于中高端岗位公司需要支付较高的猎头费用,所以内推渠道优于其它所有。
- 找到自己倾向的公司以及对应的招聘岗位
- 注意岗位和个人技能及职业发展的匹配度
- 找到对应公司员工请求内部推荐简历
- 优先安全岗位的,其次同公司的
- 优先熟悉自己的,其次自检写好
没有合适心仪的目标就上招聘网站。
顺便说下好的简历是什么样的,当然一切的前提是有真才实干。
整体要简洁明了,逻辑结构清晰。要能体现出知识、技能、经历、天赋、人脉。
- 基本信息清晰:姓名、ID、性别、年龄、毕业院校·专业、电话、邮箱、居住地
- 工作&项目经验:注意空档期、担任的角色与分工、公司行业知名度
- 体现技术能力:主要的技术栈以及能佐证的事情
- 其它优势:职业证书、奖项、会议分享、开源项目等
- 工作期望和方向:希望得到一个什么样的工作或自己专注的方向
- 个人评价:全方位的总结,展示出自己的专业技能掌握程度、亮点、优势等等。
- 加分项
- 使用PDF格式,简洁不花哨
- 有GitHub并参与过开源项目,可以写一些自己做过的小项目放上去
- 有个人博客,会写一些经验和问题的解决思路
- 邮箱使用gmail、foxmail或技术类邮箱(php.net)、私人域名邮箱等
- 询问面试官对于自己的评价和可以改进的地方