以下为alert()代码嵌入到IEND后的PNG图片:
Payload嵌入到PNG的iDAT区域
在PNG图片中,iDAT块常用来存储一些pixel像素信息,根据Web平台采用的转化机制,我们可以直接在iDAT块中插入XSS Payload,或是想办法绕过一些调整大小或重新采样操作。这里,谷歌学术仅只是生成了JPG图片而非PNG图片,所以这种技术在此也不适用。
Payload嵌入到JPG的ECS区域在标准的JPEG文件交换格式(JFIF)中,熵编码数据段(entropy-coded data segment,ECS)包含了原始霍夫曼压缩位流的输出,该输出代表了包含图像数据的最小编码单位(MCU)。理论上说,可以将Payload嵌入到该区域中,但也不能保证Web后端在实施图片转化时会破坏Payload。所以,这就需要反复测试,创建一个在ECS区域嵌入Payload且不被图片转化机制破坏的JPG。
首先,我创建了与转化后图片质量相同的一个原始测试JPG图片,然后,基于这张0长度字符可更改EXIF信息的图片进行代码嵌入测试。经过反复实验,我发现把Payload放到距ESC不同偏移量的位置均不奏效,但是我发现一种方法:谷歌学术在处理图片时,如果用夹杂0×00 和 0×14字节把ESC分隔后,则ESC中的前几个字节信息将会得以保留,如下:
基于上述测试,我终于找到了正确的Payload安置点,可以保证其中的Payload在上传到谷歌学术后,不会被图片转化机制破坏。最终,也成功地在加载图片请求时触发了XSS弹窗alert(1):
另外,我们也提供了更多的XSS代码嵌入图片,如以下的onclick():
以下的ver-xss-ecs.jpeg">mouseover():
当然了,你也可以访问我们放在Github上的开源测试工具StandardizedImageProcessingTest,用它来进行把玩研究。