SQL注入攻击技术,从本质上看,所有SQL注入均可通过观察指定请求的响应来提取至少一位信息,观察是关键,因为当请求的位为1时,响应会有专门的标志,而当请求的位为0时,则会产生不同的响应,响应中的真正差异取决于所选用的推断工具,所使用的方法则大多基于响应时间,页面内容,页面错误或以上这些因素的组合。
推断攻击技术支持向SQL语句注入一个条件分支以使提供两条路径,其中分支条件来自我们所关心的位的状态。换言之,可以向SQL查询插入一条伪正语句,IF,THENYELSE具体来说,x(转换为恰当的SQL)以“某行某列的一个字节的的二位的值是否等于17”这样的方式来叙述一个事情:y和2则是两个行为跑异的边立分支,攻击者可通过它们来推断执行了哪个分支,提交推断利用后,攻击者观察返回了哪个响应,y还是z,如果执行的是y分支,攻击者可推断出该位的值为1,否则读位为0,之后重复相同的请求,直到测试位到达最后为止。
请记住,条件分支并没有明确的条件语法元素,比如IF语句。虽然可以使用“恰当”的条件语句,但这样会增加复杂性和利用的长度,通常可使用接近正式正语句且更简单的SQL来获取相同的结果。所提取的信息位不必是存储在数据库中的数据位(虽然通常是这么用的)。我们可以提这样的问题:“我们是作为管理员连接到数据库的吗?”,“这是SQLServer2008数据库吗?”或“给定字节的值是否大于127?”,这里提取的信息位并不是数据库记录中的位。相反,它们是配置信息或者与数据库中的数据相关的信息,或者是元数据(metadata)。提问这些问题时要求我们能够在漏洞利用中提供一个条件分支以保证问题的答案要么是TRUE,要么是FALSE,因面推断性问题是一段SQL代码,它根据政击者提供的条件返回TRUE或FALSE。
下面结合一个简单的例子来讲解上述内容,我们将关注countchickens.aspx这个示例页面,它用于跟踪产蛋鸡场中健康的鸡蛋。每个鸡蛋都在chikens表中存在一条记录。在所有列中,未孵化鸡蛋的status列值为Ineubating。当浏览下面的URL时,将显示未孵化鸡蛋的数量.
http://www.xxx.com/count_chickens.aspx?statua=Incubating计数页面中存在一个易受SQL.盲注攻击的status参数,请求该页面时,它使用下列SELECT语句查询数据库:SELECTCOUNT(chick_id)FROMchickenaWREREstatus'Incubating'我们想要实现的攻击是提取用户名,页面正是使用该用户名连接到数据库。数据库中有一个名为SYSTEMUSER的函数,它会返回登录用户的用户名,数据库会话正是建立在该用户的语境(context)之中。一般来说,可以使用SELECTSYSTEMUSERSQL语句来查看这些内容,但在本例中结果是不可见的。描绘了使用详细的错误消息技术米提取数据的尝试,但页面只返回了一个标准的错误页面,非常不幸,开发人员采纳了不良的安页面的安全建议,他们不是去努力弄清动态SQL,而是去选择捕获数据库异常并显示一个通用的错误.