深入了解SQLMAP API
字数 2679 2025-08-18 11:38:45
SQLMAP API 使用详解
一、SQLMAP API 概述
SQLMAP API 提供了程序化调用 SQLMAP 功能的接口,解决了传统命令行模式下的一些限制:
- 无需为每个扫描任务开启新的命令行窗口
- 可以并行管理多个扫描任务
- 便于集成到自动化测试流程中
API 分为两种模式:
- 命令行接口模式(交互式)
- HTTP 协议接口模式(REST-JSON)
二、环境准备
安装要求
- Python 2.7.x(SQLMAP 基于 Python 2.7 开发)
- 下载地址:https://www.python.org/downloads/release/python-2715/
- SQLMAP 工具
- 下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master
验证安装
python sqlmap.py -h
三、API 服务端启动
基本启动
python sqlmapapi.py -s
远程访问配置
python sqlmapapi.py -s -H "0.0.0.0" -p 8775
启动后输出示例:
[19:53:57] [INFO] Running REST-JSON API server at '127.0.0.1:8775'..
[19:53:57] [INFO] Admin (secret) token: 1acac56427f272e316fceabe5ddff5a5
[19:53:57] [DEBUG] IPC database: '/tmp/sqlmapipc-zOIGm_'
固定 Admin Token
修改文件 lib/utils/api.py 第 661 行:
DataStore.admin_token = hexencode(os.urandom(16)) # 修改为固定值
四、命令行接口模式
连接服务端
python sqlmapapi.py -c
# 或远程连接
python sqlmapapi.py -c -H "192.168.1.101" -p 8775
可用命令
| 命令 | 描述 |
|---|---|
help |
显示帮助信息 |
new ARGS |
开启新扫描任务 |
use TASKID |
切换任务ID |
data |
获取当前任务返回数据 |
log |
获取当前任务的扫描日志 |
status |
获取当前任务的扫描状态 |
option OPTION |
获取当前任务的选项 |
options |
获取当前任务的所有配置信息 |
stop |
停止当前任务 |
kill |
杀死当前任务 |
list |
显示所有任务列表 |
flush |
清空所有任务 |
exit |
退出客户端 |
使用示例
- 检测 GET 型注入:
new -u "http://example.com/vuln.php?id=1"
- 检测 POST 型注入:
new -r data.txt # data.txt 中包含带*标记的请求
五、HTTP 协议接口模式
API 接口列表
辅助接口
GET /error/401- 未授权访问GET /task/new- 创建新任务GET /task/<taskid>/delete- 删除任务
Admin 命令
GET /admin/list- 列出所有任务GET /admin/<token>/list- 使用 token 列出所有任务GET /admin/flush- 清空所有任务GET /admin/<token>/flush- 使用 token 清空所有任务
核心交互命令
GET /option/<taskid>/list- 列出任务选项POST /option/<taskid>/get- 获取选项值POST /option/<taskid>/set- 设置选项值POST /scan/<taskid>/start- 开始扫描GET /scan/<taskid>/stop- 停止扫描GET /scan/<taskid>/kill- 终止扫描GET /scan/<taskid>/status- 获取扫描状态GET /scan/<taskid>/data- 获取扫描结果GET /scan/<taskid>/log- 获取扫描日志GET /scan/<taskid>/log/<start>/<end>- 获取部分日志GET /download/<taskid>/<target>/<filename>- 下载文件
使用流程
- 创建新任务:
import requests
r = requests.get("http://127.0.0.1:8775/task/new")
taskid = r.json()['taskid']
- 开始扫描(GET 型注入):
headers = {'Content-Type': 'application/json'}
data = {'url': 'http://example.com/vuln.php?id=1'}
r = requests.post(f'http://127.0.0.1:8775/scan/{taskid}/start',
data=json.dumps(data),
headers=headers)
- 开始扫描(POST 型注入):
data = {
'url': 'http://example.com/login.php',
'data': 'username=admin&password=123456'
}
r = requests.post(f'http://127.0.0.1:8775/scan/{taskid}/start',
data=json.dumps(data),
headers=headers)
- 检查扫描状态:
r = requests.get(f"http://127.0.0.1:8775/scan/{taskid}/status")
status = r.json()['status'] # 'running' 或 'terminated'
- 获取扫描结果:
r = requests.get(f"http://127.0.0.1:8775/scan/{taskid}/data")
result = r.json()
结果字段说明
| 字段 | 描述 | 可能值 |
|---|---|---|
dbms |
数据库类型 | MySQL, Oracle, SQL Server 等 |
suffix |
注入后缀 | SQL 注释或条件语句 |
prefix |
注入前缀 | 特定字符组合 |
clause |
生效语句 | 0: Always, 1: WHERE, 2: GROUP BY 等 |
where |
注入方式 | 1: ORIGINAL, 2: NEGATIVE, 3: REPLACE |
ptype |
参数类型 | 1: 未转义数字, 2: 单引号字符串等 |
dbms_version |
数据库版本 | >= 5.0 等 |
place |
请求位置 | GET, POST, Header 等 |
title |
注入技术 | AND boolean-based blind 等 |
vector |
攻击向量 | AND [INFERENCE] 等 |
payload |
有效负载 | id=1 AND 8693=8693 等 |
parameter |
注入参数 | username, id 等 |
六、Python 客户端实现
import requests
import json
import time
class SQLMAPClient:
def __init__(self, server_ip, server_port, admin_token=""):
self.server = f"http://{server_ip}:{server_port}"
self.admin_token = admin_token
self.taskid = ""
self.headers = {'Content-Type': 'application/json'}
def create_task(self):
"""创建新任务"""
r = requests.get(f"{self.server}/task/new")
self.taskid = r.json().get('taskid')
return self.taskid
def start_scan(self, url, options=None):
"""开始扫描"""
if not options:
options = {
'url': url,
'getCurrentUser': True,
'getBanner': True,
'getCurrentDb': True
}
r = requests.post(
f"{self.server}/scan/{self.taskid}/start",
data=json.dumps(options),
headers=self.headers
)
return r.json().get('engineid')
def get_status(self):
"""获取扫描状态"""
r = requests.get(f"{self.server}/scan/{self.taskid}/status")
return r.json().get('status')
def get_result(self):
"""获取扫描结果"""
r = requests.get(f"{self.server}/scan/{self.taskid}/data")
return r.json()
def scan(self, url, interval=5):
"""完整扫描流程"""
self.create_task()
print(f"Task ID: {self.taskid}")
self.start_scan(url)
print("Scan started...")
while True:
status = self.get_status()
if status == 'terminated':
break
time.sleep(interval)
result = self.get_result()
if result.get('data'):
print("Vulnerability found!")
print(json.dumps(result, indent=2))
else:
print("No vulnerability found.")
return result
七、高级用法
1. 检测 Cookie 注入
在扫描参数中添加 cookie 字段:
options = {
'url': 'http://example.com/',
'cookie': 'sessionid=12345*' # *标记注入点
}
2. 检测 User-Agent 注入
options = {
'url': 'http://example.com/',
'headers': {'User-Agent': '*'} # *标记注入点
}
3. 获取数据库信息
options = {
'url': 'http://example.com/vuln.php?id=1',
'getBanner': True, # 获取数据库版本
'getCurrentUser': True, # 获取当前用户
'getCurrentDb': True, # 获取当前数据库
'getDbs': True, # 获取所有数据库
'getTables': True, # 获取表
'getColumns': True # 获取列
}
4. 使用代理
options = {
'url': 'http://example.com/vuln.php?id=1',
'proxy': 'http://proxy.example.com:8080'
}
八、安全注意事项
-
生产环境中应设置认证:
python sqlmapapi.py -s --username=admin --password=123456 -
限制访问IP:
- 使用防火墙规则限制8775端口的访问
-
定期更新SQLMAP:
- 从官方GitHub仓库获取最新版本
-
扫描完成后及时清理任务:
requests.get(f"{server}/task/{taskid}/delete")
九、常见问题解决
-
连接问题:
- 确保服务端已启动并监听正确IP
- 检查防火墙设置
-
扫描不工作:
- 检查任务状态
/scan/<taskid>/status - 查看日志
/scan/<taskid>/log
- 检查任务状态
-
性能问题:
- 调整
threads参数 - 减少不必要的扫描选项
- 调整
-
结果不准确:
- 尝试调整
level和risk参数 - 使用
--technique指定特定注入技术
- 尝试调整
十、最佳实践
- 为每个扫描任务创建独立taskid
- 合理设置扫描超时时间
- 优先使用批量扫描模式
- 定期清理已完成的任务
- 记录完整的扫描日志
- 对敏感目标使用低强度扫描选项
- 集成到CI/CD流程时添加速率限制
通过以上详细的API使用指南,您可以灵活地将SQLMAP集成到自动化安全测试流程中,提高SQL注入检测的效率和可管理性。