【BUUCTF系列】[SUCTF 2019]EasySQL1
本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
文章目录
- 一、题目关键特征分析
- 二、两种绕过方案的技术原理
- 方案一:修改SQL模式(`PIPES_AS_CONCAT`)
- 方案二:利用`SELECT *`与临时列
- 三、关键知识点解析
- 四、防御建议与漏洞修复
- 总结
一、题目关键特征分析
拿到题目又是熟悉的表单结构,根据题目提示,是考察sql注入,输入1
,1"
,1'
,进行测试
发现只有输入1的时候有回显,且url里没有观察到参数传递
可是考察的是后端存在数字型注入点
尝试1' or 1=1 #
万能密码
返回nonono
,说明存在关键字过滤,过滤掉了我们的输入内容
尝试联合注入查询,1' union select 1,2#
依然是nonono,说明这里的输入验证比较严格
小总结
- 输入限制
- 仅数字输入有回显,字符输入无响应,暗示后端存在数字型注入点。
- 尝试
1' or 1=1 #
返回nonono
,说明存在关键字过滤(可能过滤or
、#
等)。 order by
和联合注入被拦截,验证过滤规则较严格。
- 堆叠注入突破点
1;show databases;
成功执行 → 堆叠注入可用,但show columns from Flag;
被拦截,说明过滤了columns
等敏感词。
- 后端SQL语句推测
- 输入数字有回显、字符无回显 → 存在
||
结构(短路逻辑)。 - 原始语句可能为:
SELECT [输入] || flag FROM Flag
当输入非零数字时,[输入]||flag
短路返回1
(真);输入0
时返回0
(假)。
二、两种绕过方案的技术原理
方案一:修改SQL模式(PIPES_AS_CONCAT
)
- 核心逻辑:
通过set sql_mode=PIPES_AS_CONCAT
将||
从逻辑或运算符转为字符串连接符。
原语句变为:SELECT CONCAT([输入], flag) FROM Flag
- Payload构造:
1;set sql_mode=PIPES_AS_CONCAT;select 1
select 1
触发查询 → 因||
转为连接符,返回1
与flag
拼接的结果(即完整flag)。
- 适用场景:MySQL数据库,且堆叠注入可用时。
方案二:利用SELECT *
与临时列
- 核心逻辑:
输入*,1
时,语句变为:SELECT *, 1 FROM Flag
SELECT *
返回所有字段(含flag列)。,1
增加临时列,值为1
(确保非零触发回显)。
- Payload构造:
*,1
- 优势:无需堆叠注入,直接输入即可触发。
三、关键知识点解析
||
运算符的两种含义- 默认行为:逻辑或(如
0||1=1
)。 PIPES_AS_CONCAT
模式:字符串连接(如'a'||'b'='ab'
)。
- 默认行为:逻辑或(如
SELECT *
与SELECT 列名
的区别SELECT *
返回所有字段,无需知道列名,适用于未知表结构场景。SELECT 1
创建临时列,常用于探测注入点或占位。
- 短路逻辑(Short-Circuit)
[非零]||flag
→ 直接返回1
(真),忽略flag
。0||flag
→ 返回flag
的值(假或真)。
四、防御建议与漏洞修复
- 禁用堆叠注入
- 配置数据库拒绝多语句查询(如PHP中
mysqli
禁用multi_query
)。
- 参数化查询
- 使用预编译语句(Prepared Statements)分离指令与数据:
String sql = "SELECT * FROM Flag WHERE id = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, input); // 输入强制转为数字 ```。
- 最小化权限
- 应用数据库账户仅需
SELECT
权限,禁用SET
等管理命令。
- 过滤输入
- 数字参数校验:
if(!is_numeric($input)) { reject(); }
。 - 过滤特殊符号(如
;
、#
、||
)。
总结
- 注入突破口:堆叠注入 + SQL模式修改或
SELECT *
构造临时列。 - 核心技巧:利用
||
的运算符重载和短路逻辑绕过过滤。 - 防御关键:参数化查询 + 输入验证 + 权限最小化。
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。