CTF实战:绕过SQL注入过滤的进阶技巧与文件读取方法
在CTF比赛中,SQL注入类题目往往不会直接让你轻松使用union select这样的标准语法。出题者通常会设置各种过滤规则,比如拦截空格、注释符或者特定关键词。面对这种情况,很多中级玩家容易陷入思维定式,反复尝试被拦截的payload而不得其解。今天我们就来系统性地探讨几种绕过union select过滤的方法,并最终实现文件读取的高级技巧。
1. 理解题目环境与过滤机制
首先我们需要明确一点:在真实的CTF比赛中,盲目尝试各种payload不仅效率低下,还容易被系统记录异常行为。正确做法是先全面分析题目环境,找出可能的注入点和过滤规则。
以fakebook这道经典题目为例,通过基础测试我们可以发现:
- 注入点位于
view.php的no参数 union select被直接过滤- 空格字符可能被限制
- 错误回显信息有限
关键发现:通过简单的布尔测试(如?no=1 and 1=1和?no=1 and 1=2),我们确认了注入存在,并且获取到了网站目录结构信息:/var/www/html。这个信息对后续文件读取至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 绕过union select过滤的几种方法
当标准语法被过滤时,我们需要寻找替代方案。以下是几种经过验证的有效方法:
2.1 使用注释符分割关键词
最直接的绕过方式是利用SQL注释符分割被拦截的关键词:
sql复制?no=-1 union/**/select 1,2,3,4--+
?no=-1 union//select 1,2,3,4--+
这两种方式都能有效绕过简单的关键词过滤:
/**/是SQL中的多行注释符//在某些数据库环境中也被识别为注释--+用于注释掉后续语句
2.2 大小写混合与特殊编码
某些简单的WAF可能只检查小写形式的敏感词:
sql复制?no=-1 UniOn SeLeCt 1,2,3,4--+
或者使用URL编码:
sql复制?no=-1 %75%6e%69%6f%6e %73%65%6c%65%63%74 1,2,3,4--+
2.3 内联注释与特殊语法
MySQL特有的内
