主页 > 网络知识 > 用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

 

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

 

本文讲述了作者利用多态图片触发谷歌学术网站( Google Scholar)XSS漏洞的测试,漏洞最终获得了谷歌$9400的奖励。此前作者也曾分享过名为《Funky_File_Formats》的演讲,其中分析了可以用多态图片构造基于JavaScript的XSS,可对客户端浏览器安全形成威胁。

多态图片(Polymorphic Image):指包含或被嵌入了代码的图片,嵌入代码可以在图片文件头部、尾部、元数据或ECS等区域。

漏洞发现

几个月前,我在上谷歌学术网站( Google Scholar)时发现了其一个奇怪的设计模式, 它在Web应用界面的获取呈现过程中,使用了location.hash参数和XHR请求方式,尤其是在一些模板片段显示时,会提取相关URI并以未转义方式加载到网页中,如下:

 

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

本身来说这应该是安全的,除非允许用户上传任意内容并能以同源方式渲染加载,但不巧的是,谷歌学术网站在其图片上传机制中确实如此,存在问题。

 

基于上述描述,有经验的渗透测试人员可能会觉得这种利用非常简单,然而谷歌学术平台后端在对上传图片的处理中采用了多种转化方式,如元数据剥离后重新处理图片等。在最开始我上报该漏洞时,谷歌安全团队也仅只是要求我提供PoC验证,并未考虑多态图片包含XSS Payload的可能。

在图片中嵌入代码的技术也可谓是一项老把戏了,我研究了过去的一些“众所周知”的技术以生成了各种多态图片,之后针对当前一些流行的图片处理库(如Imagemagick, GraphicsMagick, Libvips),开发了一个测试套件工具Standardized Image Processing Test Suite,以测试其图片处理过程中的安全性。利用工具Standardized Image Processing Test Suite可以在一些图片处理过程中发现很多有意思的bug问题,如隐藏webshell或javascript实现内容安全策略(CSP)的绕过。这里,就我测试的几种图片代码嵌入技术做一些讨论总结,然后应用“Payload嵌入到JPG的ECS区域”方法实现谷歌学术网站的XSS漏洞触发。

隐藏在EXIF中的Payload

这里,最简单的方法就是在图片元数据(metadata)中嵌入Payload了。在JPEG/JFIF类型图片中,元数据(metadata)都存储在一些特定应用标记(APPX)中,然而大多数图片处理库都未把这些标记的安全性考虑在内。Exiftool就是编辑此类图片属性的一个流行工具,但是它针对某些字符却做了转义,所以,我只好手动进行了插入。但愿谷歌学术能有相对宽松的白名单EXIFs,所以我在测试图片中嵌入了1.2k的通用EXIF标记,包括了标准的CIPA标记和一些非标准的标记。

如下JPG测试图片,我在其中的每个通用元数据区域都嵌入了alert()的XSS Payload:

 

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

如下PNG测试图片,同样在每个通用元数据区域都嵌入了alert()的XSS Payload:

 

 

用多态图片实现谷歌学术网站(Google Scholar)XSS漏洞触发

以上两张测试图片中,在所有元数据区域都嵌入了alert()代码,尽管有些EXIF字段是很多流行Web平台都在用的属性,但经测试发现,它们在上述谷歌学术网站服务端上却无法有效触发XSS。一些Web平台的图片处理库在进行图片转化时会有异常发生,如PNG转PNG时,原始的PNG元数据可以保留,但从PNG转JPG时,原始的元数据就会发生丢失。

 

Payload嵌入到图片末尾方式(JPG中嵌入到0xFFD9后,PNG嵌入到IEND后)

由于图片在上传到Web应用平台后会被执行转化,所以这里这种把代码嵌入到图片末尾的Payload仅对一些上传图片不做转化的场景适用。

以下为alert()代码嵌入到0xFFD9后的JPG图片:

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!