挖洞经验 | 用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发
字数 1520 2025-08-15 21:30:57
利用多态图片实现XSS漏洞攻击:以Google Scholar为例
1. 多态图片基础概念
多态图片(Polymorphic Image)是指包含或被嵌入代码的图片,这些代码可以位于:
- 图片文件头部
- 图片文件尾部
- 元数据区域(如EXIF)
- 熵编码数据段(ECS)等区域
2. Google Scholar漏洞背景
2.1 漏洞发现点
Google Scholar存在一个设计缺陷:
- 使用location.hash参数和XHR请求方式呈现Web界面
- 在模板片段显示时,会提取URI并以未转义方式加载到网页中
- 允许用户上传图片并能以同源方式渲染加载
2.2 漏洞利用难点
虽然看起来简单,但Google Scholar后端对上传图片进行了多种处理:
- 元数据剥离
- 图片重新处理
- 图片格式转换
3. 多态图片嵌入XSS Payload的技术
3.1 隐藏在EXIF中的Payload
JPEG/JFIF图片:
- 元数据存储在特定应用标记(APPX)中
- 大多数图片处理库未充分考虑这些标记的安全性
测试方法:
- 创建包含1.2k通用EXIF标记的测试图片
- 在每个通用元数据区域嵌入alert() XSS Payload
- 使用Exiftool或手动插入Payload
局限性:
- 某些EXIF字段会被Web平台过滤
- PNG转JPG时元数据会丢失
3.2 Payload嵌入到图片末尾
技术实现:
- JPG:嵌入到0xFFD9后
- PNG:嵌入到IEND后
适用场景:
- 上传图片不做转化的Web平台
- Google Scholar不适用此方法
3.3 Payload嵌入到PNG的iDAT区域
- iDAT块存储pixel像素信息
- 可尝试绕过调整大小或重新采样操作
- Google Scholar仅生成JPG图片,此技术不适用
3.4 Payload嵌入到JPG的ECS区域
技术细节:
- ECS(熵编码数据段)包含霍夫曼压缩位流
- 代表图像数据的最小编码单位(MCU)
成功方法:
- 创建与转化后图片质量相同的原始JPG
- 使用0长度字符可更改EXIF信息的图片
- 发现用0x00和0x14字节分隔ECS可保留前几个字节
- 找到正确的Payload安置点
最终效果:
- 上传后Payload不被图片转化机制破坏
- 成功触发XSS弹窗(alert(1))
4. 漏洞利用工具
Standardized Image Processing Test Suite:
- 测试图片处理库(Imagemagick, GraphicsMagick, Libvips)的安全性
- 可发现隐藏webshell或绕过CSP的漏洞
- 开源地址:Github上的StandardizedImageProcessingTest
5. 漏洞上报与奖励
时间线:
- 2019-09-28:上报给Google安全团队
- 2019-09-30:要求提供PoC
- 2019-10-04:提供PoC #1
- 2019-10-10:要求提供其他PoC
- 2019-10-11:提供PoC #2
- 2019-11-05:确认漏洞,奖励$6267.40
- 2019-11-19:发现同类漏洞,追加奖励$3133.70
总奖励:$9400.10
6. 防御建议
- 对所有用户上传内容进行严格过滤和转义
- 实现内容安全策略(CSP)
- 图片处理时彻底清除所有元数据
- 对图片内容进行完整性验证
- 使用沙箱环境渲染用户上传内容
7. 总结
该案例展示了如何利用多态图片的高级技术绕过现代Web应用的安全防护,特别强调了在图片处理过程中容易被忽视的安全盲点。通过深入研究图片文件格式和Web应用处理逻辑,安全研究人员可以发现并利用这类隐蔽的漏洞。