《SQL注入攻击与防御》之高级攻击

SQL盲注利用

寻找并确认SQL盲注

  • 无效数据将返回通用错误页面而非详细错误,这时可通过包含副作用比如时间延迟来确认SQL注入,还可以拆分与平衡参数。如果数字字段为5,就提交3+2或者6-1;如果字符串参数中包含"MadBod",就提交‘Mad’||'Bod'
  • 请思考漏洞的属性:是否强制产生错误以及能否控制无错误页面的内容
  • 可通过在SQL中提问某一位是0或者1来推断某个信息位,有很多推断技术可用于实现该目标

使用基于时间的技术

  • 可使用逐位方法或二分搜索法提取数据并利用延迟表示数据的值,可使用明确的SLEEP类型函数或运行很长的查询类引入延迟
  • 通常在SQL Server和Oracle上采用以时间作为推断的方法,不过这在MySQL上不太可靠,改机制很可能会失败
  • 使用时间作为推断方法在本质上是不可靠的,但却可以通过增加超时或借助其他技巧来进行改进

使用基于响应的技术

  • 可使用逐位方法或二分搜索方法提取数据并利用相应内容表示数据的值。一般来说,现有查询中都包含一条插入子句,它能够根据推断的值来保持查询不变或返回空结果。
  • 基于响应的技术可成功用于多种多样的数据库
  • 某些情况下,一个请求可返回多个信息位

使用非主流通道

  • 带外通信的优点是:可以以块而非位的方式来提取数据,并且在速度上有明显改进
  • 最常用的通道是DNS,攻击者说服数据库执行一次名称查找,该查找包含一个由攻击者控制的域名并在域名前添加了一些要提取的数据。当请求到达DNS名称服务器后,攻击者就可以查看数据。其他通道还包括HTTP和SMTP
  • 不同数据库支持不同的非主流通道,支持非主流通道的工具的数量明显要比支持推断技术的少

自动利用SQL盲注

  • 有一些工具都不是开源的,这里我只记录Sqlmap的好了
  • Sqlmap将漏洞的发现和利用结合在一款强大的工具中,它既支持基于时间的推断方法,也支持基于响应的推断方法,另外还支持ICMP通道方法。该工具的成长速度和开发也很快

利用操作系统

访问文件系统

  • 读取文件有关:
  • 在MySQL中,可以使用LOAD DATA INFILE和LOAD_FILE()命令从主机读取任何文件
  • 在Microsoft SQL Server中,可以使用BULK INSERT或OLE Automation从文件系统读取文件。对于较新的系统(SQL Server 2005以及之后的版本),可以使用CREATE ASSEMBLY方法从文件系统读取文件
  • 在Oracle中,可以使用Oracle目录,Oracle Text或UTL_FILE方法读取文件
  • 写入文件有关:
  • MySQL,使用select into outfile和select into dumpfile命令向文件系统写文件
  • MS SQL,可以使用OLE Automation和简单的重定向(通过命令执行)在目标文件系统中创建文件。可以从命令行使用debug.exe和BCP,进而在目标系统中辅助创建二进制文件
  • Oracle,使用UTL_FILE,DBMS_ADVISOR,DBMS_SXLPROCESSOR,DBMS_XMLDOM,Java或操作系统命令和标准重定向来实现文件写操作

执行操作系统命令

  • MySQL和PostgreSQL中,可以借助SQL创建一个用户自定义函数(UDF)以执行操作系统命令,PostgreSQL支持执行堆叠查询,因此这种攻击很容易实现。推荐使用Sqlmap执行这种攻击。绝大多数Web框架不允许对MySQL执行堆叠查询,因此这种攻击在MySQL中不太有效。为了创建用户自定义函数,数据库用户必须是一个sysadmin用户。
  • 在MicrosoftSQLServer中,可以通过诸如xp_cmdshell这样的存储过程来执行命令,或者通过OLD Automation或新的CLR集成特性来执行命令。为了能够执行OS代码,数据库用户必须具有sysadmin角色。
  • Oracle中,可以通过EXTPROC,Java,DBMS_SCHEDULER,PL/SQL,Oracle Text或者oradebug功能来执行命令。即使数据库用户没有足够的权限来执行代码,当数据库漏掉了安全补丁,也可以使用提升权限攻击来获得权限

巩固访问

  • 可以使用数据库rookit来保证能重复访问受到侵害的服务器
  • 不同的数据库rookit拥有不同的复杂性,从向数据库服务器添加功能到只向系统添加用户(使用常规检测不容易发现)均存在差异

高级话题

避开输入过滤器

  • 通过与简单输入进行系统化交互来理解应用所使用的过滤器
  • 根据所使用过滤器的不同,尝试相关的避开技术以阻止该过滤器(包括使用大小写敏感的变量,SQL注释,标准和有缺陷的URL编码,动态查询执行以及空字节)
  • 寻找多步骤过滤器中的逻辑缺陷,比如无法递归剥离的表达式或不安全的输入截断
  • 如果使用了有效的应用程序级别的过滤器,请尝试寻找过滤器可能忽略的非标准入口点,比如参数名和HTTP请求头部

利用二阶SQL注入

  • 复查应用程序的功能,寻找存储并重用了用户提供的数据的情况
  • 在每个数据项中提交单引号。如果输入被阻止或审查,就使用一些避开技术来尝试战胜过滤器
  • 快速查看使用了数据的有关功能,寻找异常行为
  • 对于检测到的每个异常,尝试开发概念严重攻击来证明应用程序是否真的易受到SQL注入攻击。如果未返回任何错误消息,请尝试使用时间延迟字符串来在相关的响应中引发显著延迟。

客户端SQL注入漏洞

  • 对于任何使用了HTML5客户端SQL数据库的地方,复查客户端的JavaScript代码
  • 表示将被客户端SQL查询处理的,攻击者可以控制的任何数据项。使用自己的客户端应用程序实例测试应用程序对异常输入的处理,特别要注意测试那些并非最初来自屏幕上的普通文本输入字段的数据
  • 如果应用程序以某种非安全方式处理任何攻击者可控制的数据,请确定是否可以使用SQL注入,结合应用程序已有的功能,提取敏感数据或执行未经授权的操作

使用混合攻击

  • 不管何时发现了SQL注入漏洞,都清思考如何将其与其他bug和技术结合起来以便对应用产生更精细的影响
  • 坚持寻找通过使用SQL注入检索到的数据(比如用户名和口令)来提升针对应用的攻击方法
  • 通常可以使用SQL注入来在应用程序中执行跨站脚本攻击,其中最重要的是执行持续攻击,它会影响以常规方式访问应用程序的其他用户
  • 如果在验证过的特权应用程序的功能中发现了SQL注入漏洞,请检查是否可以使用跨站请求伪造以低权限用户身份来发动成功的攻击。