成功利用一个SQL注入漏洞往往可完全控制应用程序的所有数据。大多数应用程序仅使用一个账户访问数据库,并且依赖应用程序层控制在不同的用户间实施访问隔离。如果能够无限制地使用应用程序的数据库账户,就可以自由访问其中的数据。
因此,可以假设,拥有应用程序的所有数据是SQL注入攻击的最终目的。然而,许多原因表明,利用数据库中的漏洞,或者控制它的一些内置功能以达到目的,从而进一步实施攻击,可能会取得更大的成效。通过扩大数据库攻击范围可实施的其他攻击如下。
如果数据库被其他应用程序共享,可以通过提升数据库的使用权限访问其他应用程序的数据。
可以攻破数据库服务器的操作系统。
可以访问其他系统。通常,数据库服务器是一个在几层网络边界防御保护下的网络中的主机。如果能够控制数据库服务器,攻击者就处在一个可信的位置上,可以访问其他主机上的关键服务,进一步对其加以利用。
可以在主机基础架构与自己的计算机之间建立网络连接。这样,攻击者就可以完全避开应用程序的防御,轻易传送从数据库收集到的大量敏感数据,并且可穿透许多入侵检测系统。
可以通过创建用户定义的功能任意扩充数据库的现有功能。有些时候,可以通过这种方式重新执行已被删除或禁用的功能,避开数据库实施的强化保护措施。只要已经获得数据库管理员(DBA)权限,就有办法在每种主流数据库中执行这种操作。
错误观点
许多数据库管理员认为,数据库没有必要防御需要通过验证才能加以利用的攻击。他们以为,只有相同组织拥有的可信应用程序才能访问数据库。这种观点忽略了恶意第三方利用应用程序中存在的缺陷,在应用程序认为安全的背景下与数据库交互的可能性。刚刚描述的每一种可能的攻击证明,数据库必须防御通过验证的攻击者。
攻击数据库是一个内容广泛的主题,它不在本书的讨论范围之内。本节将分析几种关键方法,说明如何通过它们利用主要数据库的漏洞和功能扩大攻击范围。我们得出的主要结论是:每种数据库都有提升权限的可能性。应用当前发布的安全补丁和可靠的强化措施能够帮助避免许多(但并非全部)这种攻击。
1.MS-SQL
最常被攻击者滥用的数据库功能可能是xp_cmdshell存储过程,它是MS-SQL默认内置的一 项功能。这个存储过程允许数据库管理员用户以和cmd.exe命令提示符相同的方式执行操作系统命令。例如:
攻击者可在众多情况下滥用这项功能。他们可以执行任意命令,将结果指向本地文件,然后读取文件内容。他们可以打开一个连通自己计算机的带外网络连接,并建立一条秘密的命令和通信渠道,从服务器复制数据并上传攻击工具。由于MS-SQL默认以LocalSystem运行,攻击者一般能够完全攻破基本的操作系统,执行任意操作。MS-SQL中还有许多其他存储过程,如xp_regread或xp_regwrite,也可用于在Windows操作系统注册表中执行强大的操作。
处理默认锁定
互联网上的大多数MS-SQL为MS-SQL 2005或更高版本。这些版本提供各种安全功能,可以在默认情况下锁定数据库,以防止各种攻击。
但是,如果数据库中的Web应用程序用户账户拥有足够高的权限,则通过重新设置数据库,该用户就可以突破上述功能实施的限制。例如,可以使用sp_configure存储过程重新启用被禁用的xp_cmdshell。以下4行SQL代码用于实现这一目的:
这样,xp_cmdshell就被重新启用,并可以通过以下命令运行:
2.Oracle
人们已在Oracle数据库软件中发现了大量安全漏洞。如果找到一个允许执行任意查询的SQL注入漏洞,那么就可以利用这种漏洞提升到数据库管理员权限。
Oracle包含许多可在数据库管理员权限下运行的内置的存储过程,并已发现在这些存储过程中存在SQL注入漏洞。在2006年7月发布重要补丁前,存在于默认包SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES中的缺陷就是一个典型的示例。攻击者可以利用这个缺陷,在易受攻击的字段中注入grant DBA to public查询来提升权限。
这种类型的攻击可通过利用Web应用程序中的SQL注入漏洞,在易受攻击的参数中注入函数来实现。
除这些漏洞外,Oracle还含有大量默认功能,这些功能可被低权限用户访问,并可用于执行各种敏感操作,如建立网络连接或访问文件系统。除了前面描述的用于建立带外连接的功能强大的包以外,UTL_FILE包可用于在数据库服务器文件系统上读取和写入文件。
2010年,David Litchfield演示了如何在Oracle 10g R2和11g中利用Java来执行操作系统命令。 该攻击首先利用DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY中的缺陷授予当前用户java.io.filepermission权限,然后使用DBMS_JAVA.RUNJAVA 执行运行操作系统命令的Java 类(oracle/aurora/util/Wrapper)。例如:
请访问以下链接了解相关详情:
www.databasesecurity.com/HackingAurora.gdf
www.notsosecure.com/folder2/2010/08/02blackhat-2010/
3.MySQL
与前面讨论的其他数据库相比,MySQL中包含的可被攻击者滥用的内置功能相对较少。其中一个示例是任何拥有FILE_PRIV许可的用户都可以读取并写入文件系统。
LOAD_FILE命令可用于获取任何文件的内容。例如:
SELECT …INTO OUTFILE 命令可用于将任何一个查询的输出指向一个文件。例如:
除读取并写入关键的操作系统文件外,这些命令还可用于执行其他攻击。
因为MySQL将数据保存在明文文件中,数据库必须拥有读取这些文件的权限。拥有FILE_PRIV许可的攻击者可以打开相关文件并读取数据库中的任何数据,避开数据库实施的任何访问控制。
MySQL允许用户通过调用一个包含函数执行过程的编译库文件(compiled library file)创建一个用户定义的函数(UDF)。这个文件必须位于MySQL加载动态库的正常路径内。攻击者可以使用前面描述的方法在这个路径中创建任意二进制文件,然后建立使用这个文件的UDF。请参阅Chris Anley的论文“Hackproofing MySQL”了解这种技巧的详情。
我们介绍的许多利用SQL注入漏洞的攻击技巧都需要提交大量请求,以逐次提取少量的数据。幸运的是,我们可以使用各种工具来自动完成上述过程;同时,这些工具还能够识别成功实施攻击所需的数据库特定的语法。
当前,多数工具通过以下方法来利用SQL注入漏洞。
对目标请求中的所有参数实施蛮力攻击,以查找SQL注入点。
通过附加各种字符,如闭括号、注释字符和SQL关键字,确定后端SQL查询中易受攻击的字段的位置。
通过蛮力猜测请求的列数,然后确定包含varchar数据类型的列(可用于返回结果),尝试实施UNION攻击。
注入定制查询来检索任意数据——如果需要,将多个列中的数据串连成一个字符串,以便于从单独一个varchar数据类型的结果中进行检索。
如果无法使用UNION检索结果,可以在查询中注入布尔型条件(AND 1=1、AND 1=2等),以确定是否可以使用条件响应来检索数据。
如果无法通过注入条件表达式来检索结果,可以尝试使用条件时间延迟来检索数据。
这些工具通过在目标数据库中查询相关元数据表来查找数据。通常,它们能够执行一定程度的权限提升,如使用xp_cmdshell获得操作系统级访问权限。它们还使用各种优化技巧,并利用各种数据库中的诸多功能和内置函数,以减少基于推测的蛮力攻击所需提交的查询数,避开可能对单引号实施的过滤,等等。
注解
这些工具是主要的注入工具,最适于通过利用已确定并熟悉的注入点,从数据库中提取数据。但是,在查找并利用SQL注入缺陷方面,它们也不是万能的。实际上,在通过这些工具注入数据之前或之后,通常需要提供其他一些SQL语法,以确保这些工具的硬编码攻击生效。