作者:幻泉

blog:http://hi.baidu.com/woshihuanquan/

在数据库注入中经常有人说这个注入点为字符型的,那个注入点位数字型的,那么到底什么是数字型什么是字符型呢?其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型。例如mssql就有很多自己的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

而在SQL查询语句中,数据类型的语法有三种,也就是我们上面所说的数字型,字符型,搜索型。语法如下:

 数字型: SELECT 列 FROM 表 WHERE 数字型列=

 字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’

 搜索型: SELECT * FROM 表 WHERE where 被搜索的列 like %%

从语法中大家就可以看到其实类型之间的不同是很微小的,虽然有这微小的区别但是查询语句就会各有不同。

打开我们编写的sql.asp漏洞文件我们会看到sql="select * from admin where id="& id 这样的查询语句,其为典型的数字型注入。这时我们就可以利用and 1=1and 1=2判断方法来判断是否存在漏洞。

修改sql.asp代码如下:

<!--#include FILE="conn.asp"-->

<%

id=request("id")

set rs=server.CreateObject("adodb.recordset")

sql="select * from admin where id='"& id &"'"

response.write "sql语句为:"&sql

rs.open sql,conn,1,3

if rs.eof or rs.bof then 

  response.write "<br>暂无记录"

else

     response.write "<br>返回信息是:"&rs("username")

end if

rs.close  

set rs=nothing  

set conn=nothing

%>

这里修改了sql.asp中的查询语句为字符型语句,我们再来试试and 1=1and 1=2会发现都会返回错误信息。

我们会发现查询语句中我们输入的信息被单引号包含起来导致成为一个整体字符串,所以查询语句会查询一个为“1 and 1=1”和 “1 and 1=2”的id,这个id当然不会存在了就导致出现错误。所以针对字符型注入我们需要对单引号进行匹配,就产生了“' and '1'='1”和“'and '1'='2”这样的闭合字符型注入的判断语句。我们输入这样的判断语句就会发现跟数字型注入一样的返回。

而搜索型注入是因为其常用在搜索查询中而命名的。我们继续修改sql.asp为如下代码:

<!--#include FILE="conn.asp"-->

<%

id=request("id")

set rs=server.CreateObject("adodb.recordset")

sql="select * from admin where id like '%"& id &"%'"

response.write "sql语句为:"&sql

rs.open sql,conn,1,3

if rs.eof or rs.bof then 

  response.write "<br>暂无记录"

else

     response.write "<br>返回信息是:"&rs("username")

end if

rs.close  

set rs=nothing  

set conn=nothing

%>

继续利用数字型查询发现又都显示错误。我们发现跟字符型产生的错误一样都被单引号包含成为一串字符串了。

继续对搜索型进行匹配,发现搜索型比字符型仅仅多了一对“%”,那么就产生了“%' and '%1%'='%1”和“%'and '%1%'='%2”这样的闭合字符型注入的判断语句。我们输入这样的判断语句就会发现也跟数字型注入一样的返回信息。(注意:“%”的URL编码为%25,如果发现查询并没有我们输入的“%”那么就需要手工把URL中的%改为其编码%25

总体来说各种注入类型之前唯一不同的就是查询中的闭合方式,而我们在***检测过程中就会根据测试的各种闭合方式来判断属于那种注入类型。