深入了解SQLMAP API
字数 2679 2025-08-18 11:38:45

SQLMAP API 使用详解

一、SQLMAP API 概述

SQLMAP API 提供了程序化调用 SQLMAP 功能的接口,解决了传统命令行模式下的一些限制:

  • 无需为每个扫描任务开启新的命令行窗口
  • 可以并行管理多个扫描任务
  • 便于集成到自动化测试流程中

API 分为两种模式:

  1. 命令行接口模式(交互式)
  2. HTTP 协议接口模式(REST-JSON)

二、环境准备

安装要求

  1. Python 2.7.x(SQLMAP 基于 Python 2.7 开发)
    • 下载地址:https://www.python.org/downloads/release/python-2715/
  2. 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 退出客户端

使用示例

  1. 检测 GET 型注入:
new -u "http://example.com/vuln.php?id=1"
  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> - 下载文件

使用流程

  1. 创建新任务:
import requests
r = requests.get("http://127.0.0.1:8775/task/new")
taskid = r.json()['taskid']
  1. 开始扫描(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)
  1. 开始扫描(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)
  1. 检查扫描状态:
r = requests.get(f"http://127.0.0.1:8775/scan/{taskid}/status")
status = r.json()['status']  # 'running' 或 'terminated'
  1. 获取扫描结果:
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'
}

八、安全注意事项

  1. 生产环境中应设置认证:

    python sqlmapapi.py -s --username=admin --password=123456
    
  2. 限制访问IP:

    • 使用防火墙规则限制8775端口的访问
  3. 定期更新SQLMAP:

    • 从官方GitHub仓库获取最新版本
  4. 扫描完成后及时清理任务:

    requests.get(f"{server}/task/{taskid}/delete")
    

九、常见问题解决

  1. 连接问题

    • 确保服务端已启动并监听正确IP
    • 检查防火墙设置
  2. 扫描不工作

    • 检查任务状态 /scan/<taskid>/status
    • 查看日志 /scan/<taskid>/log
  3. 性能问题

    • 调整 threads 参数
    • 减少不必要的扫描选项
  4. 结果不准确

    • 尝试调整 levelrisk 参数
    • 使用 --technique 指定特定注入技术

十、最佳实践

  1. 为每个扫描任务创建独立taskid
  2. 合理设置扫描超时时间
  3. 优先使用批量扫描模式
  4. 定期清理已完成的任务
  5. 记录完整的扫描日志
  6. 对敏感目标使用低强度扫描选项
  7. 集成到CI/CD流程时添加速率限制

通过以上详细的API使用指南,您可以灵活地将SQLMAP集成到自动化安全测试流程中,提高SQL注入检测的效率和可管理性。

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 验证安装 三、API 服务端启动 基本启动 远程访问配置 启动后输出示例: 固定 Admin Token 修改文件 lib/utils/api.py 第 661 行: 四、命令行接口模式 连接服务端 可用命令 | 命令 | 描述 | |------|------| | help | 显示帮助信息 | | new ARGS | 开启新扫描任务 | | use TASKID | 切换任务ID | | data | 获取当前任务返回数据 | | log | 获取当前任务的扫描日志 | | status | 获取当前任务的扫描状态 | | option OPTION | 获取当前任务的选项 | | options | 获取当前任务的所有配置信息 | | stop | 停止当前任务 | | kill | 杀死当前任务 | | list | 显示所有任务列表 | | flush | 清空所有任务 | | exit | 退出客户端 | 使用示例 检测 GET 型注入: 检测 POST 型注入: 五、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> - 下载文件 使用流程 创建新任务: 开始扫描(GET 型注入): 开始扫描(POST 型注入): 检查扫描状态: 获取扫描结果: 结果字段说明 | 字段 | 描述 | 可能值 | |------|------|--------| | 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 客户端实现 七、高级用法 1. 检测 Cookie 注入 在扫描参数中添加 cookie 字段: 2. 检测 User-Agent 注入 3. 获取数据库信息 4. 使用代理 八、安全注意事项 生产环境中应设置认证: 限制访问IP: 使用防火墙规则限制8775端口的访问 定期更新SQLMAP: 从官方GitHub仓库获取最新版本 扫描完成后及时清理任务: 九、常见问题解决 连接问题 : 确保服务端已启动并监听正确IP 检查防火墙设置 扫描不工作 : 检查任务状态 /scan/<taskid>/status 查看日志 /scan/<taskid>/log 性能问题 : 调整 threads 参数 减少不必要的扫描选项 结果不准确 : 尝试调整 level 和 risk 参数 使用 --technique 指定特定注入技术 十、最佳实践 为每个扫描任务创建独立taskid 合理设置扫描超时时间 优先使用批量扫描模式 定期清理已完成的任务 记录完整的扫描日志 对敏感目标使用低强度扫描选项 集成到CI/CD流程时添加速率限制 通过以上详细的API使用指南,您可以灵活地将SQLMAP集成到自动化安全测试流程中,提高SQL注入检测的效率和可管理性。