False SQL Injection and Advanced Blind SQL Injection

0x00 背景


原文地址:http://www.exploit-db.com/papers/18263/

这篇文章是为介绍一种新的绕过web防火墙或安全解决方案的SQL注入的方法而编写的。我(原文作者,下同)在一些韩国的防火墙上做了测试,大部分都能成功,我不会为减少影响而透露所测试的web防火墙的制造商。

阅读本文档之前你需要先了解基本的MySQL原理。我将“SQL注入”归类为两类。第一类是一般的SQL注入,即我们通常所说的“真SQL注入”,第二类是“假SQL注入”。在本文档中,你将了解到一些“真SQL注入”的特点。

0x01 准备


我的方法(假SQL注入)与“盲注”中提到的真/假SQL注入的方法是真的不同的。测试的环境如下。

测试代码如下。

首先,基本的SQL注入如下

上面的代码是一般的SQL注入代码,我将这类代码归为“真SQL注入”。当你登录网站的时候,在网站的内部程序中,你的ID和密码会被一些语句用"select id, password from table where id='' and password=''"识别,如果你把单引号当做0你可以很容易地理解。空的空间与0是相等的,攻击可以使用‘=’和‘0’。这样一来,下面的语句就能完成登录过程。

我们可以以不同的方式运用它。

因为0>-1,这一句也能成功。

同样的,因为0<1,所以这一句也能成功。

你不必只使用单一的数字。你可以像下面一样使用两个数字攻击。

Comparison operation 0=1 will be 0, the following operation result is true because of id=''=0(0=1). 比较操作“0=1”的结果将会是0,又因为id=''=0,所以以下的操作结果是真。

此外,还可以使用一些比较动作能使得两边的值相等。

像这样,如果你使用比较操作,你可以用额外的方式进行攻击。

0x02 不同的SQL操作


现在,你将开始理解False SQL injection。以下为MySQ操作,不是攻击语句。

毫无疑问,它显示了所有表中的返回内容。 以下是当你不输入任何值在id字段时的返回内容。

因为在id字段没有任何字符串,所以不会有返回结果。 事实上,从这里我已经看到,如果在MySQL字符串字段为0的情况下,返回结果始终为真。根据这个现象,以下语句结果为真。

如果你在ID中输入0,所有内容都将被显示。这就是假SQL注入的原理。无论如何,结果为0(真)将使得登录成功。为了使结果为0(真),你需要一些东西处理整数,如使用位操作和算术运算。

下面是使用位运算的例子。

或位运算为任何程序员所熟知。正如我之前告诉过你的,''等于0。如果你计算“0或0”,结果还是0. 所以下面的假SQL注入能成功登录。

当然,你也可以使用和运算。

这是使用异或运算的攻击方法

同样可以使用移位操作。

如果你喜欢使用位操作,你可以使用多种不同的攻击方法。

下面是使用算术运算的“假SQL注入”。 如果使用带有''的算术运算的结果为0,攻击将会成功。下面是一个使用算术运算的例子。

关键点在于结果必须小于1。你也可以使用如下语句攻击。

下一种攻击方法使用的是函数功能。在这篇文章中,我无法向你们展示所有的函数。这个攻击方式并不难,所以你们可以使用函数进行你们想要的真/假SQL攻击。而这种攻击是“真SQL注入”或是“假SQL注入”取决于函数返回后的最后一个操作。

此外,您还可以将空格做为函数名进行攻击。但你只能在某些函数中使用空格。

这一次,SQL的关键字是方法。这种方法根据情况视作为真或假SQL注入。

在id或password区域中没有额外注释的很可能是真的假SQL注入。一般的web防火墙只过滤#, --, /**/,因此该方法在web防火墙中更有效。

使用文本的攻击比使用括号的攻击在绕过web防火墙时会更有效。

0x03 绕过

让我们来看看一般的SQL注入攻击。

如果被转换为16进制编码,将会是这样的。

像上面的攻击基本都会被过滤。因此它不是好的攻击方法,我将尝试使用tab(%09)代替空格绕过过滤器。事实上。你还可以使用%a0代替%09

也可以使用以下的值。

以下是使用%A0代替%20的例子。

这一次,我将展示盲注的攻击方法,这种攻击可以绕过web防火墙过滤器,但一些攻击者倾向于认为盲注不可能实现登录。所以我决定展示这个例子。

下面的攻击代码能被用来登录页面且页面将显示ID和密码

这个攻击代码将显示/etc/password的内容。

我敢说在盲注中不使用union select也是可以的。

记录的结果有三个。

让我们使用盲注绕过web防火墙。以下是一份有存在盲注漏洞的代码

 

像上面那样的基本的盲注如下。

在Blind SQL Injection可以使用运算符=。

自然也能使用其它的运算符。

攻击示例:

展示所有的攻击过程将会浪费我大量的时间,所以到此为止。手工盲注是很困难的,所以使用工具会更有效。下面是一个python写的工具,这是一个使用异或运算的例子。为了绕过大多数的web防火墙,我将空格换成了%0a。

 

很遗憾,攻击测试很快就停止了。如果有人学过一些额外的攻击代码,他将很容易地升级攻击。

韩文原版http://wh1ant.kr/archives/[Hangul]%20False%20SQL%20injection%20and%20Advanced%20blind%20SQL%20injection.txt