首先是基础讲解
盲注Blind SQL
在进行SQL注入的时候,通常开发者隐藏了报错例如爆出404等信息,那么这时候我们就需要进行盲注。
通常有两种盲注方式
1.布尔注入,根据回显的信息,例如True和false判断自己与自己输入的值是否一致。从而才出他的完整性。
2.时间注入,页面返回的值只有一种的时候(即为无论输入什么结果都按照正常的进行处理0),那么这时候我们就需要通过时间函数进行时间注入,通过页面的相应时间进行判断语句是否输入正确。
首先要明白 and or 1=1等这些基本概念
####
1.首先我们需要找到数据库的注入点
2.猜解数据库名称 (有些网站的数据库和域名有关)
3.猜表名(长度)
4.猜字段(字段名、数量、长度)
5.猜数据(重要的信息)
基于布尔的盲注!!!
函数方法
length()
例如length(database());会爆出数据库的长度
之后我们就需要使用and进行逻辑判断
select username,password from user where id=1 and (length(database())=8);
由于and必须两边的条件都要满足,左边id=1肯定是真值,那么如果length函数猜错不等于8的时候就会没有回显
不仅可以输入=还可以输入<>之后利用二分法进行判断数据库名称的长度
了解到基本的内容之后我们开始靶场
构建我们的语句
http://192.168.6.127/sqli-labs-master/Less-1/?id=1' and (length(database=())=8);
左边id=1必定成立,若右边不成立则没有反应,若为正确的返回不同的结果
####
新函数
substr(database(),a,b)
database()是要截取的字符串名称
a为从第几个字符开始截取
b为截取几个字符
注意ab均为十进制的数字,ab只是为了抽象展示
#######
知道了上述的之后,我们就可以开始继续猜数据库名字了
仍然用刚才演示的
id=1 and (substr(database(),1,1))=s
左边恒成立,右边错误不显示信息
同时我们还可以将subsrt(database()1,1)转化为ascii表
即为ascii(subsrt(database()1,1))
之后可以利用二分法或者一段一段的去猜测
实战演示
任意变换100,直到快接近目标了,然后开始写等于号
#########
在了解这些之后,我们开始了解一些新的函数
right(database()1,1)
从右侧读取字符
left(database(),1,1)
从左侧读取字符
mid(database(),1,1)
从中间截取字符
#####
基于时间盲注
使用if和sleep函数,if用来判断,sleep用来休眠
先上一段简单代码方便理解
MariaDB [security]> select * from users where id=1 and if(1=1,1,sleep(3))
若if后的判断语句成立那么执行if(1)则通过什么都不执行
若if侯的判断语句不成立,那么执行if(sleep(3))页面休眠三秒
select * from users where id=1 and if(ascii(substr(database(),1,1))=116,1,sleep(3));
同理若ascii(substr(database(),1,1))=116中成立则执行1即通过,如果不成立则休眠
实战演示
很清晰的看见延迟明显的上升了
这种情况下我们注入通常在没有回显点的地方
###########
这种方式通常也称为报错注入
我们打开靶场的第八关
没有回显
那么我们可以使用报错注入
那么就说明了报错了,我们需要重新写当我们猜对数据的时候
还是那个思路
1.首先我们需要找到数据库的注入点
2.猜解数据库名称 (有些网站的数据库和域名有关)
3.猜表名(长度)
4.猜字段(字段名、数量、长度)
5.猜数据(重要的信息)
###########
SQL注入导出到文本中
select * from users into outfile "/var/lib/mysql/mysql1.txt";
最好就写到mysql下的目录中