在图像中隐藏 javascript
在您链接到的文章中,Javascript 代码本身并未包含在图像文件本身中,而是在引用图像的 HTML 页面中体现。未经充分验证或清理,在图像标签内返回不受信任的输入。这是持久的跨站点脚本,因为每次有人查看包含此图像的页面时都会返回恶意输入(即,它可能作为用户配置文件的一部分存储在数据库中)。
按照惯例,包含个人资料图片的 HTML 标记可能如下所示:
<img src="/imagename.jpg">
但是,对于每个用户来说,它必须是不同的,所以生成它的应用程序代码可能看起来像这样(例如 PHP):
<img src="/<?=$imagename?>">
因此,如果用户 Alice 上传alicespic.jpg,例如,用户在访问她的个人资料时会看到该图像。但是,如果未正确验证或清理映像名称,则可能会出现漏洞。
例如,如果 Mallory 可以将她的个人资料的图像名称设置为inncoent.jpg" onload="alert(1),则会生成以下 HTML 标记:
<img src="/inncoent.jpg" onload="alert(1)">
利用 onload 事件意味着一旦图像完成加载,将执行任意脚本。本质上,每次有人查看受影响的个人资料时都会执行这段 Javascript 代码,但它会在他们的浏览器中运行。
如果开发人员只允许在图像名称中包含安全字符,则不会发生这种情况。
有两种方法可以做到这一点,第一种是简单地在文本文件中编写脚本并将其保存为 jpg。这显然不是图像,但它会起作用。如果您想要一个真实的图像,您可以获取您的图像并使用十六进制编辑器将您的脚本添加到图像元数据中。这是因为浏览器在尝试将图像呈现为 HTML 时会解释代码。
图像使用一个名为 EXIF 的标头,其中包含有关图像的信息,例如相机型号、分辨率、闪光灯等。您可以将脚本插入此标头,如果应用程序正在显示图像元数据,它将显示该脚本。检查此链接以获取更多信息,它正在注入 PHP 代码而不是 javascript,但想法是相同的。
编辑:在我看来,itscooper 的回答是对与问题相关的 THN 文章中的漏洞的正确解释。下面的答案是关于如何隐藏 js 并让它在图像对象中执行的一般问题。
从历史上看,您可以通过插入“javascript:”URL 作为图像源来对某些浏览器进行 XSS,因为它们会自动运行脚本 ( https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Image_XSS_using_the_JavaScript_directive )。令人惊讶的是,尽管 javascript 被沙盒化并且无法访问页面对象,但在 Firefox 中仍然是这种情况。尽管如此,它仍然可以通过运行一个冻结主线程的未终止循环来用于 DOS 页面加载。我已向 Mozilla 报告此错误,但尚未修复:https ://bugzilla.mozilla.org/show_bug.cgi?id=924252 。