asp+access sql手工注入步骤

来源:互联网 发布:猎头行业 知乎 编辑:程序博客网 时间:2024/04/30 01:33

理论介绍

数据库结构


access数据库

 表

     列

         单元数据




实例

目标网址:http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513

网站域名:http://127.0.0.1:81/0/0/

文件目录:Production

网站文件:PRODUCT_DETAIL.asp

文件参数名:id

文件参数值:1513


sql查询实现原理


#include的功能和c语言差不多,asp是一种脚本语言,.asp文件类似于.cpp文件。不过在asp当中,没有.h和.cpp之分,都是asp。

疑问0:不知道这样的理解对不对,求解?

conn.execute(sql)是对前面包含的conn.asp文件里面的功能的调用,功能是连接数据库。

这里看到sql语句的意思是在product表中查询id=接收的值(这里是1513)那一行的数据

已解决 疑问1:一个asp里会不会有多个查询语句?

答:会,比如http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513&f=125



这里看到conn.asp连接的是#data.mdb

access只有一个数据库,但可能有多个数据库文件


所以,PRODUCT_DETAIL.asp的意思就是说:在连接的数据库(这里是#data.mdb,里面有很多表)中,去查询product这个表里id为传入值(这里是1513)那一行的数据。


已解决 疑问3:正常情况是select 列名 from 表名 where  id=xxx得到单元数据,而这里是select * from product where id=,* 的意思是不是指选择的是所有的列?然后在页面上显示的是那一行所有的数据?答:是。


实战开始


sql注入原理未对语句进行过滤


寻找网站方法   搜索栏输入inurl:asp?id=


 http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513


检验是否有注入漏洞

先在id=1513后面加上and 1=1,理想情况是返回正常的页面。然后在id=1513后面加上and 1=2(2 、 3 、4……什么乱七八糟的都可以,只要不等于1 就行),变成http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513 and 1=2。这里1=2明显逻辑错误,前面用的又是且连接词,所以这个世界上永远找不到id=1513 and 1=2,页面找不到这个东西,所以会报错。一旦报错,说明他就执行了这条命令,说明没有过滤语句,说明有注入漏洞。这里把id=1513改成id=1513‘(什么乱七八糟的都行,只要id里没这个参数就行)也能达到目的,因为id的参数里没有1513’这一项。


如果这里是id=abc的话,这里的参数就是字符型了,而不是1513那样的数字型。对于字符型参数,查询的时候系统会自动在参数前后加上 ‘   ’,如果我们还是在后面写and 1=2的话,就变成了http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id='abc and 1=2',这样和原sql语句不符合,应该写成http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=abc' and '1'='2。


猜字段(字段=列):

在id=1513后面加上order by 数字,如http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513 order by 10

原理:order by xxx是指 对sql语句中带入查询的表(这里是product)中的xxx个列进行排序,如果xxx小于表中的列数,那肯定是可以排序成功的,如果xxx超过了表中的列数,那哪来那么多列给你排呢?根本就不存在啊。所以xxx<=表中列数的时候页面正常(因为它能正常执行排序操作);如果xxx>列数,那么就会报错。由此,我们可以得到sql语句中代入查询的那个表的列数。

疑问4:字典序?这里是排10列的序,那么这10列是哪10列?前10列吗?如果疑问1成立,那么这里order是对哪一个表排序?怎么指定?

已解决:order by 是怎么排序的?答:默认升序,后面可以加升序降序限制条件,order by 10 desc为降序,order by 10 asc为降序

猜表名

先检测有没有admin这个表,用union select * from admin,这里页面返回正常,说明有admin这个表。字段猜出来是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和15)。

疑问5:这里的22列是product表里的列数,这和admin有什么关系呢?两个完全没联系的表啊?为什么这样就能查到显位?显位和隐位是什么东西?为什么存在显位隐位之分?union查询到底是怎么实现的?


猜列名

得到显位后,我们构造以下猜列名语句union select1,2,username,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin,这里都说了是猜,username和password是我们猜的列名,因为一般的管理员账户表里都用户名和密码所在的列名都是这两个。如果管理员改了的话就gg了,尝试在网站其他地方看看有没有什么前缀或者统一格式,比如我遇到过adminname和adminpassword,或者直接丢到工具里去跑。

然后得到单元数据。



希望如果有大神能看到求回答一下这些问题,感激不尽!


0 0
原创粉丝点击