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

📅 2026/8/20 12:51:37
一张 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 只应用于你有明确授权的目标项目作者的原话是 Dont 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),仅供参考