在现代数字化时代,企业的应用系统扮演着至关重要的角色,它们承载着企业的核心业务逻辑、敏感数据以及与客户、合作伙伴之间的交互。因此,确保这些应用系统的安全性是至关重要的。为确保企业应用的安全性,许多公司在应用上线前会进行大量详尽的安全测试。然而,令人困惑的是,尽管经过了严格的测试流程,应用上线后依然会出现各种问题。数据库遭到注入攻击、漏洞频繁出现等现象,让企业深感困扰:明明已经进行了如此多的安全测试,为何仍无法确保软件应用的网络安全性呢?
实际上,安全测试的作用不容小觑,但问题在于,许多潜在的漏洞并不易于察觉。它们可能隐藏在代码的深处,或者以非显性的形式存在,这使得常规的安全测试很难全面发现并防范这些风险。接下来,我们先来了解一下一些不为人知的安全漏洞,以便后续可以加强对其防范。
一、二次注入
二次注入的原理涉及到在应用程序中对用户输入数据的不当处理。具体来说,当应用程序在第一次将用户输入的数据存入数据库时,仅使用了简单的转义方法,如addslashes
或者依赖于get_magic_quotes_gpc
这样的魔术引号功能,但这些方法往往不够全面,不能有效防止所有的SQL注入攻击。
addslashes
函数的特点在于它会对单引号('
)、双引号("
)、反斜杠(\
)和NULL字符进行转义,在它们的前面加上反斜杠。然而,这种转义方式对于防止SQL注入来说并不足够,因为它并没有处理其他可能用于SQL注入的特殊字符,比如注释符号(--
)、SQL函数和条件语句等。
更关键的是,addslashes
不会改变右括号()
)这样的字符,而右括号在SQL语句中常常用于闭合字段或条件语句。因此,如果攻击者在输入中巧妙地构造了包含右括号的恶意SQL代码片段,这段代码可能会在后续的查询中被执行,从而实现SQL注入。
在数据存入数据库后,如果开发者认为这些数据已经是“干净”和“可信”的,那么在下一次查询时,他们可能会直接从数据库中取出这些数据,并用于构建新的SQL查询,而没有进行进一步的检验和处理。这时,如果之前存入的数据中包含恶意的SQL代码片段,那么这些代码片段就会在新的查询中被执行,造成所谓的“二次注入”。
例如,如果攻击者在第一次插入数据时,通过某种方式在数据中插入了单引号,并且这个单引号没有被有效地过滤或转义,那么在后续的查询中,当这个带有单引号的数据被用于构建SQL语句时,就可能会破坏原有的SQL结构,并引入攻击者构造的恶意SQL代码,从而实现SQL注入。
二、反序列化
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过序列化,我们可以把对象转换为字节流,使其可以永久地保存在磁盘上,或者在网络中传输到其他任何地方。这种转换的一个重要特点是,序列化后的对象是与平台无关的,即在不同的平台上都可以进行反序列化以恢复成原始的对象。
反序列化(Deserialization)则是序列化的逆过程,即将序列化数据转化成原始数据结构的过程。它可以把储存在磁盘中的文件转换成内存中的数据,或者把网络上传输的字节流转换成内存中的数据。反序列化的本质是根据序列化数据中保存的元信息(如指针、变量类型以及数据类型等)来重新构造对象,恢复出原来的对象结构。
在序列化和反序列化的过程中,需要注意的是,敏感数据序列化之后是潜在对外暴露的。因此,永远不应该被序列化的敏感信息包括密钥、数字证书,以及在序列化时引用敏感数据的类。为了防止敏感数据泄露,程序必须确保敏感数据不被序列化。
三、xml实体注入
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
XML外部实体注入漏洞,是一种安全漏洞,也称XXE漏洞(XML External Entity Injection)它发生在应用程序解析XML输入时,没有正确限制或禁止外部实体的加载。当应用程序未对XML输入进行充分的过滤和验证时,攻击者可以构造恶意的XML文件,其中包含指向外部实体的引用,从而触发XXE漏洞。
一旦XXE漏洞被触发,攻击者可能利用该漏洞执行多种恶意操作,包括但不限于:
- 文件读取:攻击者可能利用XXE漏洞读取服务器上的敏感文件,如配置文件、数据库连接字符串等。
- 命令执行:在某些情况下,攻击者可以利用XXE漏洞执行远程命令,这通常发生在应用程序使用了支持执行系统命令的XML处理库时。
- 内网端口扫描:攻击者可以利用XXE漏洞对内网进行端口扫描,探测并发现其他潜在的安全漏洞。
- 攻击内网网站:通过XXE漏洞,攻击者可能对内网中的其他网站发起攻击,如利用SSRF(Server-Side Request Forgery)漏洞。
- 发起DoS攻击:在某些情况下,通过构造特定的XML请求,攻击者可以发起拒绝服务(DoS)攻击,消耗服务器资源,导致服务不可用。
XXE漏洞的触发点通常位于允许用户上传XML文件的位置。如果应用程序没有对上传的XML文件进行充分的过滤和验证,攻击者就可以上传恶意的XML文件,并利用其中的外部实体引用来触发漏洞。
四、什么是代码审计
代码审计是一种专业的安全服务,旨在深入检查应用系统的源代码,以发现和修复潜在的安全漏洞和规范性缺陷。德迅云安全提供的这项服务,正是为了帮助企业在开发过程中加强应用的安全性,防止潜在的安全风险。
在代码审计过程中,安全专家会对应用系统的所有逻辑路径进行全面测试。这包括分析代码结构、数据流、控制流等,以发现可能存在的安全缺陷。通过这种深入的分析,代码审计能够挖掘出普通安全测试可能无法发现的复杂安全问题,如二次注入、反序列化、xml实体注入等安全漏洞。
五、代码审计的重要性
- 挖掘安全缺陷:在新系统上线初期,由于其对互联网环境的适应性相对较弱,可能存在各种未知的安全风险。通过代码审计,可以对源代码进行全面细致的检查,发现并识别出其中潜在的安全缺陷。这有助于在系统刚上线时就避免遭受重大攻击,确保系统的安全稳定运行。
- 提前预防:通过先于黑客发现系统的安全隐患,企业和团队可以提前部署相应的安全防御措施。这有助于在未知环境下保护系统的每个环节,使其能够经得起黑客的挑战。预防总比治疗来得更为重要,因此代码审计在预防潜在安全威胁方面发挥着至关重要的作用。
- 明确安全隐患点:通过对整套源代码的深入分析,审计团队可以精确定位到某个具体的威胁点,并进行验证。这有助于企业和管理人员更加清晰地了解系统的安全状况,从而有针对性地采取措施来加强安全防护。
- 提高安全意识:在审计过程中,德迅云安全技术人员会向开发团队和管理人员传达安全知识和最佳实践。这有助于提升整个团队的安全意识,使他们在日常工作中更加注重安全问题,降低遗漏缺陷的风险。
- 提升开发人员安全技能:通过审计报告以及与德迅云安全技术人员的沟通,开发人员可以了解到自己的代码中存在的问题和不足,从而完善代码安全开发规范。这有助于提升开发人员的安全技能水平,使他们能够更好地应对未来的安全挑战。