vlambda博客
学习文章列表

网络安全-SQL注入系列03

SQL盲注

实际场景中,SQL的许多注入实例都是盲注漏洞,应用程序不会在其响应内返回SQL查询的结果或任何数据库错误的详细信息。盲注可以被利用来访问未授权的数据,但是所涉及的技术通常更加复杂且难以执行。

利用SQL盲注技术可以实现:

  • 更改查询的逻辑。根据单个条件的真实性触发应用程序,在响应中返回数据的差异。例如:向某个布尔逻辑中注入新条件,或有条件的触发零除之类的错误

  • 有条件的触发查询处理中的时间延迟,根据应用程序响应的时间推断,查询条件的真相

  • 使用网络交互技术,实现数据外带。可以在其他技术无法实现的情况下使用。通常可以直接通过外通道窃取数据。例如:常用的技术DNS查询,将数据放入控制的域的DNS查询。

一、SQL盲注概念

当应用程序容易受到SQL注入攻击,但其HTTP响应不包含相关SQL查询的结果,或任何数据库错误的详细信息时,就会出现SQL盲注。

二、SQL盲注利用

例如,对某网站抓包处理,跟踪cookie的信息,收集相关使用情况并分析引用程序的响应。

当一个请求包含一个cookie被处理后,应用程序将使用以下SQL语句,查询该用户是否是已知用户。

select cookie from cookieusers where cookie="xxxxxxxxxxx"

该查询容易受到SQL注入的影响,但是查询的结果不会返回给用户。但是应用程序的行为会有所不同,具体取决于是否返回任何数据。如果返回数据,页面显示“欢迎xx用户”的信息,则此行为足以被SQL盲注利用。

SQL盲注利用的核心就是根据注入条件,有选择地触发不同的响应来检索信息

例如,触发上述SQL盲注

...abc' and '1'='1
...abc' and '1'='2

因为语句1结果为TRUE,应用程序会返回“欢迎xx用户”。语句2结果为FALSE,应用程序则不会返回“欢迎xx用户”,这为通过注入获取信息提供了条件。

三、触发SQL错误诱导条件响应

假设应用程序执行相同的SQL语句查询,没有返回任何数据。其行为表现没有任何不同,在这种情况下,通常可以修改注入条件,有选择的触发SQL查询错误来促使应用程序返回条件信息。核心是,在条件为true时引起数据库错误,而在条件为false时不会导致数据库错误。通常数据库引发的未处理错误将导致应用程序响应有所不同,能够根据条件注入数据。

列如:假设发送了两个请求,其中包含以下内容

...abc' and (select case when (1=2) then 1/0 else 'a' end)='a
...abc' and (select case when (1=1) then 1/0 else 'a' end)='a

case关键字根据表达式是否为真,选择执行不同语句。类比if语句。

根据应用程序的响应,语句1应用程序不会有错误显示。语句2因为1=1为TRUE,SQL语句会执行除零导致错误。假设应用程序的HTTP会因此有相响应,则可以推断此处是注入点。

触发条件错误的方式有很多种,并且不同的技术在不同的数据库类型上有不同效果,根据实际情况分析。

四、通过响应时间延迟利用SQL盲注

以上都是针对应用程序的返回信息为判断依据。假设应用程序在捕获了数据库的错误后,并妥善处理。则在SQL查询时触发数据库错误不再导致应用程序的任何响应,在这种情况下还是可以根据注入条件判断注入点。就是利用应用程序的响应时间。

原理:由于SQL查询通常由应用程序同步处理,因此延迟执行SQL查询也会延迟HTTP响应,这直接导致接收到HTTP响应会花费同样的时间来响应。根据响应的时间判断注入点。触发时间延迟与数据库类型高度相关.

五、DNS外带数据

假设应用程序执行相同SQL语句查询,但是是异步处理。这样执行延时查询就失效了,因为应用程序在执行原始线程中处理用户的请求,并会创建新的线程跟踪cookie执行SQL查询。虽然该语句仍然容易受到SQL注入攻击但是,应用程序的响应不取决于查询是否返回任何数据,数据库是否发生错误或执行需要花费的时间。

在此条件下,通常可以通过触发应用程序与控制的系统进行网络交互来利用SQL注入点。可以直接在网络交互中实现数据获取。各种网络协议都可用于此目的,最常用的通常是DNS(域名服务)。这是因为生产网络普遍都允许DNS查询的自由出口,因为这对生产系统的正常运行至关重要。

后续有相关总结,与SQL注入的防护。