人工智能驱动的网络攻击:如何检测、预防和抵御智能威胁

立即阅读
我们利用人工智能进行网站翻译,虽然我们力求准确,但不一定总是 100%精确。感谢您的理解。

MetaDefender™ 如何防止复杂的多语言图像攻击 

Loc Nguyen,渗透测试团队负责人
分享此贴

促进文件上传的网络应用程序已成为众多组织的必备工具,是客户、合作伙伴和员工共享各类文档和文件的门户。例如,人力资源公司可以让用户上传简历,公司也可以通过专门的网络平台让合作伙伴更方便地共享文件。  

即使采取了强化的安全措施和更严格的验证流程,攻击者仍在使用复杂的方法利用漏洞。图像等看似无害的文件也可能被篡改,从而危及网络服务器的安全。 

多文件是指可同时作为多种类型生效的文件,允许攻击者绕过基于文件类型的安全措施。例如,GIFAR 可同时作为 GIF 和 RAR 文件使用,JavaScript/JPEG 多重文件可同时被解释为 JavaScript 和 JPEG,Phar-JPEG 文件可同时被识别为 Phar 压缩文件和 JPEG 图像。这些多文件可以通过欺骗性或空扩展名而不被发现,这些扩展名 "欺骗 "系统,让系统以为它们是一种良性文件类型(如图像或 PDF),而其中却包含未被发现的恶意代码。 

文件上传验证 

允许用户在未进行适当或全面验证的情况下上传文件会对网络应用程序构成重大威胁。如果攻击者成功上传恶意文件(如 web shell),他们就有可能获得对服务器的控制权,从而危及系统和敏感数据。为了降低这些风险,我们制定了最佳实践来指导开发人员应用有效的验证措施。这些实践有助于确保文件上传的安全处理,从而最大限度地降低被利用的风险。 

确保文件上传安全的重点领域包括 

  • 扩展名验证:实施文件扩展名拦截列表或允许列表,确保只接受允许的文件类型。 
  • 文件名消毒:上传文件时为文件名生成随机字符串。 
  • 内容类型验证:验证上传文件的 MIME 类型,确保其符合预期格式。 
  • 图像头验证:对于图片上传,可以使用 PHP 中的 getimagesize() 等函数,通过检查文件头来确认文件的有效性。 

绕过文件上传过滤器 

尽管实施了这些保护措施,攻击者仍在不断改进绕过验证机制的方法。空字符注入、双扩展名和空扩展名等技术可以破坏扩展名验证:文件可能以 "file.php.jpg"、"file.php%00.jpg"、"file.PhP "或 "file.php/"等名称出现,以逃避检测。修改文件的初始神奇字节可以规避 MIME 类型验证,例如将其更改为 GIF89a(与 GIF 文件相关的标头),从而欺骗系统将文件识别为合法格式。此外,还可以上传恶意 .htaccess 文件来操纵服务器配置,允许执行带有未经授权扩展名的文件。 

说明各种文件上传过滤绕过技术,包括空字节、备用扩展名和空扩展名
绕过文件上传过滤器

多语言文件攻击 

即使实施了结合多种安全措施的严格验证流程来防止文件上传过滤绕过技术,针对多语言文件或多语言图像的复杂攻击仍然是一个重大的安全威胁。这种方法可使攻击者制作出符合图像文件预期二进制结构的文件(如图像),但在不同的上下文中解释时可同时执行恶意代码。这些文件的双重性质使它们能够绕过传统的验证机制,并在特定情况下利用漏洞。 

显示同时作为图像和恶意 JavaScript 代码处理的多语言文件的流程图
Javascript/Jpeg 多语言文件

使用 ExifTool 生成简单的多语言文件

利用 ExifTool 生成多元图像是一项简单的技术。这款功能强大的应用程序可读取、写入和修改 EXIF、XMP、JFIF 和 Photoshop IRB 等各种元数据格式。然而,恶意人员可能会利用 ExifTool 执行有害操作,包括创建具有恶意意图的多图图像。通过使用 ExifTool 在图像的 EXIF 元数据中嵌入恶意代码,特别是在 UserComment 和 ImageDescription 等字段中嵌入恶意代码,攻击者可以生成多图图像,增加成功利用的机会。 

下面介绍的是图像的 EXIF 元数据,它提供了与图像相关的全面信息。 

显示从图像文件中提取的详细 Exif 元数据(包括文件类型、分辨率和编码信息)的截图
图像的 Exif 元数据

通过利用 ExifTool,威胁行为者可以在图像的 EXIF 元数据中嵌入恶意代码,从而创建一个可规避验证机制的多重文件。 

在图像 Exif 元数据的用户注释部分添加有害代码的示例
在 Exif 元数据的用户注释部分注入有害代码

尽管 MIME 类型验证可以限制基本网络外壳文件的上传,但这种多语言图像可以绕过这些限制,允许攻击者上传多语言网络外壳。 

请求-响应显示因 MIME 类型限制而拒绝接受恶意 web shell
网络外壳被拒绝,因为其 MIME 类型不允许
使用 Exiftool 创建的多元图像文件绕过限制的请求-响应示例
通过使用 exiftool 创建的多元图像绕过限制

攻击者随后可利用多语言网络外壳控制网络服务器。

显示攻击者通过恶意网络外壳获得网络服务器控制权的截图
攻击者可以利用网络外壳控制网络服务器

Javascript/JPEG 多语言文件 

JavaScript/JPEG 多语言文件的结构可同时作为 JPEG 图像和 JavaScript 脚本使用。为此,恶意行为者必须全面了解 JPEG 文件的内部结构。有了这些知识,就能在图像中准确嵌入恶意二进制数据,确保 JavaScript 引擎能对其进行处理,而不会影响其作为 JPEG 图像的有效性。 

JPEG 图像的结构如下 

字节名称
0xFF, 0xD8图片开始
0xFF、0xE0、0x00、0x10、...默认标题
0XFF, 0XFE, ... 图片评论
0xFF、0xDB、...量化表
0xFF、0xC0、...画面开始
0xFF、0xC4、...

赫夫曼表

0xFF、0xDA、...扫描开始
0xFF, 0xD9图片结束

在 JPEG 图像结构中,头部之后是长度信息。如上例所示,标头以序列0xFF 0xE0 0x00 0x10 开始,其中0x00 0x10具体表示段的长度,即 16 字节。标记0xFF 0xD9标志着图像的结束。 

图像文件的十六进制表示法,展示其结构和编码
图像的十六进制表示法

要创建 JavaScript/JPEG 多语言文件,必须修改图像的十六进制值,以确保 JavaScript 引擎能够识别和处理这些值。 

首先,在 JavaScript 中,序列0xFF 0xD8 0xFF 0xE0可以解释为非 ASCII 数值,但0x00 0x10 无效,必须更改。这些十六进制值的合适替代值是0x2F 0x2A,它是 /* 的十六进制表示,是 JavaScript 中用于打开注释的语法。通过这种替换,剩余的二进制数据将作为注释的一部分被忽略。 

然而,由于0x00 0x10最初代表 JPEG 标头的长度,将其改为0x2F 0x2A(十进制等于 12074)需要重新定义 JPEG 标头以保持其有效性。为此,需要添加空字节,并将 JavaScript 有效载荷放在0xFF 0xFE标记之后,该标记表示 JPEG 结构中的图像注释。 

例如,如果有效载荷为*/=alert(document.domain);/*,长度为 28 字节,则所需的空字节计算如下:12074(新长度)- 16(原始报文头长度)- 2(0xFF 0xFE标记)- 28(有效载荷长度)= 12028 个空字节。 

因此,JPEG 图像中的 JavaScript 代码如下所示: 

在非 ASCII 变量中嵌入 JavaScript 代码以便利用的示例
嵌入 JavaScript 代码
多格式 JPEG 文件的十六进制表示法
修改后图像的十六进制值,显示添加的警告注释
修改后图像的十六进制值

最后,必须将序列0x2A 0x2F 0x2F 0x2F(对应 *///)放在 JPEG 结束标记0xFF 0xD9 之前。这一步将关闭 JavaScript 注释,并确保正确执行有效载荷,而不会破坏 JPEG 文件的结构。 

扩展查看修改后十六进制图像中的 JavaScript 代码
关闭 JavaScript 注释

修改后,图像仍可被解释为有效图像,同时包含可执行的 JavaScript 代码。

在查看器中显示为标准图像的多语言 JPEG
多语言图像显示为标准图像

当 HTML 文件将此图像作为 JavaScript 源代码加载时,它仍然有效,并能执行嵌入的 JavaScript 代码: 

以脚本形式嵌入多格式 JPEG 的 HTML 代码
浏览器输出展示可作为 JavaScript 代码执行的多语言图像
可作为 JavaScript 代码执行的多语言图像
PHAR/JPEG 多语言文件 

多语言图像文件不仅存在被客户端利用的风险,而且在特定情况下还存在被服务器端攻击的风险。Phar/JPEG 多元文件就是一个例子,它既可被解释为 PHP 档案 (Phar),也可被解释为 JPEG 图像。Phar 文件结构允许在元数据中嵌入序列化数据,这就构成了反序列化漏洞的潜在风险,尤其是在某些 PHP 版本中。因此,Phar/JPEG 多重文件可被用来绕过文件上传验证和利用易受攻击的服务器。 

Phar 文件格式的布局为存根/清单/内容/签名,并在清单中存储 Phar 存档中包含的重要信息:  

  • 存根:存根是在可执行上下文中访问文件时执行的一段 PHP 代码。存根的内容没有限制,但要求以 __HALT_COMPILER(); 结尾。 
  • Manifest:该部分包含有关存档及其内容的元数据,其中可能包括以 serialize() 格式存储的序列化 Phar 元数据。 
  • 文件内容:存档中包含的原始文件。 
  • 签名(可选):包含用于完整性验证的签名信息。 
显示存根、清单、文件内容和签名段的 Phar 文件格式结构
Phar 文件格式

由于存根除了__HALT_COMPILER()的规定外没有施加任何内容限制,因此威胁行为者可以将图像的十六进制值注入存根。将这些值放在 PHAR 文件的开头,就可以将其识别为有效的图像。因此,在文件开头添加 JPEG 图像的十六进制字节,就能轻松构建 PHAR/JPEG 多重文件,如下例所示: 

PHP 脚本创建带有元数据和恶意内容的多语言 Phar/JPEG 文件
生成 Phar/JPEG 多语言文件

通过这种方法,生成的多语言文件既是有效的图像,又是合法的 PHAR 文件,因此可以用来绕过某些文件上传验证机制。

PHAR/JPEG 多文件的十六进制值
PHAR/JPEG 多文件的十六进制值
PHP 输出将多语言 PHAR 文件识别为有效图像
PHP 编译器将其识别为有效图像

虽然这种多重文件可以绕过文件上传过滤器,但目前还无法利用网络服务器。要利用 PHAR 文件或 PHAR 多文件成功入侵网络服务器,必须在文件清单中注入恶意序列化元数据。  

当通过某些与文件操作(如 file()、file_exists()、file_get_contents()、fopen()、rename()或 unlink())相关的 PHP 函数(PHP ≤7.x)中的 PHAR 封装器 (phar://) 访问 PHAR 文件时,会触发 unserialize() 函数来处理序列化元数据。最终,通过利用 PHPGGC(一种广泛用于构建 PHP 小工具链的工具),威胁行为者可以通过 PHAR 聚合文件利用反序列化漏洞,从而入侵网络应用程序服务器。 

PHAR/JPEG 多语言文件和反序列化漏洞的结合使攻击者有能力渗透到网络应用程序服务器中,即使实施了文件上传过滤器。值得注意的是,即使在处理图像文件的过程中,也可能出现这种漏洞。 

将 phar.readonly 设置为 0 的 PHP 配置文件片段
PHP 配置文件
容易因文件路径处理不当而被利用的网络应用程序代码示例
网络应用程序中的漏洞代码

攻击者可利用多语言文件绕过文件上传过滤器,并在文件位置附加 PHAR 封装程序 (phar://),从而操纵网络服务器将文件视为 PHAR 存档。这种操作随后会触发反序列化漏洞,导致通过文件操作功能执行远程代码。 

通过 PHAR/JPEG 多文件执行远程代码的攻击演示了利用恶意多文件执行远程代码的攻击
通过 PHAR/JPEG 多语言文件的远程代码执行攻击
利用 PHAR/JPEG 多文件模拟真实世界的攻击 

为了说明应用程序中与多语言文件相关的风险,我们模拟了一种环境,在这种环境中,应用程序采用了严格的文件上传过滤器,以防止上传恶意文件或 web shell。尽管有这些防护措施,多语言图像仍可绕过验证过程,并在某些情况下可能导致远程代码执行,最终危及易受攻击的网络应用程序服务器。 

本示例展示了一个可在客户、合作伙伴和组织之间共享文件的传统网络应用程序: 

使用MetaDefender Core™ 和MetaDefender ICAP Server™ 保护您的网络应用程序

MetaDefender Core 和MetaDefender ICAP Server 保护您的网络应用程序免受这些威胁,并增强网络和基础设施的安全性。  

MetaDefender ICAP Server 和MetaDefender Core 通过以下方式共同抵御涉及恶意 PHAR/JPEG 多文件的复杂攻击: 

当 PHAR/JPEG 多文件上传到网络应用程序时,首先会通过MetaDefender ICAP Server 转发到MetaDefender Core ,利用我们的Deep CDR ™ 技术进行全面的净化处理。与简单的文件类型检查程序不同,Deep CDR 会彻底分析上传文件的结构,删除脚本、宏和超出政策范围的内容,重构 JPEG 文件,使其只包含必要的数据。

这个过程会删除附加在 JPEG 结束标记(0xFF 0xD9)之后的有害 PHAR 内容,确保经过净化的文件严格来说是一个 JPEG 文件。这样,网络应用程序就不会受到 PHAR/JPEG 多重攻击;即使攻击者能改变文件处理方案以注入 PHAR 封装程序,他们也无法利用网络服务器。

处理后的文件十六进制值OPSWAT MetaDefender

拥有成熟网络安全基础架构的组织--无论是使用 WAF(网络应用防火墙)、代理还是入口控制器--现在都可以通过MetaDefender ICAP Server 来增强其防御机制。该解决方案在现有网络服务器和MetaDefender Core 之间创建了一个接口,为所有传入文件建立了一个透明的安全检查点。通过ICAP 接口路由的任何内容在到达网络服务器之前都会被扫描和处理,从而确保只有安全合法的内容才能进入网络并到达终端用户。 

ICAP Server  与 Kubernetes 管理的 NGINX 集成示意图
MetaDefender ICAP Server 与 NGINX 集成

这种方法意味着企业可以充分利用现有的安全投资,同时增加一个额外的、强大的保护层。使用 NGINX 入口控制器的企业可通过代理配置将MetaDefender ICAP Server 与现有基础设施集成。

配置文件显示了使用Deep CDR
通过Deep CDR (MetaDefender Core ) 对恶意 PHAR/JPEG 多文件进行了消毒。

OPSWAT的方法超越了传统的威胁检测。MetaDefender Core 并非简单地标记可疑文件,而是主动消除潜在威胁,将危险文件转化为安全可用的内容。与网络服务器集成后,MetaDefender ICAP Server 可提供全面保护,防止零时差威胁和多重攻击。 

不信任文件,不信任设备。Trust no device.™"的理念,OPSWAT 在全球范围内利用专利技术解决客户面临的挑战,在基础设施的各个层面保护网络、数据和设备的安全,防止已知和未知威胁、零日攻击和恶意软件。 

通过OPSWAT 了解最新信息!

立即注册,即可收到公司的最新动态、 故事、活动信息等。