【SQL注入】 注入神器sqlmap的使用

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 数据库 SQL注入漏洞 sqlmap

一、SQL注入漏洞

概述

SQL注入漏洞是Web安全领域中一个常见且危害严重的安全问题。SQL注入攻击发生的原因是应用程序没有对用户输入的数据进行正确的验证和过滤,从而让恶意用户有机会在应用的查询中插入或“注入”SQL代码片段。SQL注入漏洞允许攻击者通过向Web表单输入或URL查询字符串、或其他数据库查询字符串中插入恶意SQL命令,欺骗后端数据库执行非授权的查询,进而可能导致数据泄露、数据损坏或更严重的后果。


原理

SQL注入漏洞的原理是利用应用程序对用户输入的不严格验证和过滤,通过提交恶意构造的SQL语句到数据库执行端,进而实现非法访问和操作数据

当涉及到网络安全和数据库交互时,SQL注入是一个常见但极其危险的问题。这种类型的攻击能够发生,主要是因为应用程序在构建SQL语句时,直接将用户输入嵌入到查询中,而没有进行适当的清理或使用安全措施


理解SQL注入的关键在于,黑客如何通过操纵提供给应用程序的输入来改变其后端SQL命令的结构和意图。

例如,一个简单的登录验证SQL命令可能如下:

SELECT * FROM users WHERE username = '[user_input]' AND password = '[pass_input]';


如果应用程序直接将用户提供的用户名和密码值插入到上述查询中,攻击者就可以通过在输入中添加额外的SQL代码片段来修改这个查询。一个常见的例子是在用户名输入框中输入:

' OR '1'='1

这将使得原本的SQL查询变成:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '[pass_input]';


由于'1'='1'永远为真,这条语句会绕过原有的登录逻辑,从而无需正确的用户名和密码即可登录系统。


此外,攻击者还可以利用SQL注入来进行更为复杂的攻击,如数据泄露、权限提升、数据篡改等。通过执行特定的SQL命令,攻击者可以提取敏感数据、删除或修改数据库中的记录,甚至在某些情况下完全控制数据库服务器。

SQL注入的危害

数据泄露:攻击者可以访问并获取敏感信息,如用户个人信息、支付细节等。

权限提升:攻击者可能通过执行恶意SQL语句获得更高权限,甚至完全控制数据库。

数据篡改:攻击者可以修改或删除重要数据,影响业务运行。

系统瘫痪:通过执行资源密集型操作,攻击者可能使数据库或整个应用程序崩溃。


二、sqlmap的使用


什么是 sqlmap?

sqlmap 是一款开源渗透测试工具,它能自动检测并利用 SQL 注入漏洞和接管数据库服务器。它具有强大的检测引擎、许多适用于最终渗透测试阶段的特色功能以及范围广泛的开关,涵盖了数据库指纹识别、从数据库获取数据、访问底层文件系统以及通过带内连接在操作系统。


sqlmap支持的数据库


  1. MySQL:MySQL是广泛使用的开源关系型数据库管理系统,适用于各种规模的应用程序。
  2. Oracle:Oracle数据库是一个功能强大的系统,广泛应用于大型企业级应用中,提供高度的数据完整性、安全性以及可扩展性。
  3. PostgreSQL:这是一个开源的对象-关系型数据库系统,它提供了多版本并发控制,支持复杂的查询操作。
  4. Microsoft SQL Server:这是微软开发的一个关系型数据库管理系统,广泛应用于企业环境中,支持高容量的事务处理。
  5. SQLite:这是一个轻量级的数据库,它不需要单独的服务器进程,常用于嵌入式系统中。
  6. Access:这是微软提供的一个文件型数据库管理系统,适合于小型应用或快速原型开发。
  7. IBM DB2:这是IBM开发的一个高端数据仓库和大规模并行处理系统。
  8. Firebird:这是一个开源的关系型数据库管理系统,以能够运行在多种操作系统上而著称。
  9. Sybase:这也是一个企业级的关系型数据库管理系统,提供高性能和高可靠性。
  10. SAP MaxDB:这是一个企业级数据库系统,由SAP公司开发,支持大数据量和高事务处理能力

sqlmap 可检测的SQL 注入类型

布尔型盲注:sqlmap 会替换或添加 SQL 语句到 HTTP 请求的查询参数里面,相关的 SQL 语句可能是合法的 SELECT 子查询,也可以是任意用于获取输出数据的 SQL 语句。针对每个注入检测的 HTTP 响应,sqlmap 通过对比原始请求响应的 headers/body,从而逐个字符地推导出注入语句的输出。或者,用户可以预先提供一个字符串或正则表达式,用于对正确页面结果进行匹配。


时间型盲注:sqlmap 会替换或者添加相关的 SQL 语句到 HTTP 请求的查询参数里面,相关的 SQL 语句可能是合法的、用于使后端 DBMS延迟几秒响应的查询。


报错型注入:sqlmap 会替换或者添加用于引发特定数据库错误的 SQL 语句到查询参数里面,并通过解析对应的注入结果,判断特定的数据库错误信息是否存在响应的 headers/body 中。这项技术只有在 Web 应用配置开启后端 DBMS 错误信息提醒才有效。


联合查询注入:sqlmap 会在查询参数中添加以 UNION ALL SELECT 开头的合法 SQL 语句。


堆叠查询注入:sqlmap 会测试 Web 应用是否支持堆叠查询,如果支持,则在 HTTP 请求的查询参数中添加一个分号(;),并在后面加上注入的 SQL 语句。


sqlmap下载安装方法


官网下载地址:https://github.com/sqlmapproject/sqlmap


推荐直接从 Git 仓库获取最新的源代码:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统,甚至可以通过带外数据连接的方式执行系统命令。


使用方法:python sqlmap.py -参数,sqlmap可以运行在python2.6、2.7和3.x的任何平台上。


官方使用指南:https://github.com/sqlmapproject/sqlmap/wiki/Usage

         

用法:



python sqlmap.py [选项]


选项:

  -h, --help            显示基本帮助信息并退出
  -hh                   显示高级帮助信息并退出
  --version             显示程序版本信息并退出
  -v VERBOSE            输出信息详细程度级别:0-6(默认为 1)


目标:

至少提供一个以下选项以制定目标

  -u URL, --url=URL   目标 URL(例如:"http://www.site.com/vuln.php?id=1")
  -d DIRECT           可直接连接数据库的地址字符串
   -l LOGFILE          从 Burp 或 WebScarab 代理的日志文件中解析目标地址
   -m BULKFILE         从文本文件中获取批量目标
   -r REQUESTFILE      从文件中读取 HTTP 请求
   -g GOOGLEDORK       使用 Google dork 结果作为目标   
   -c CONFIGFILE       从 INI 配置文件中加载选项



请求:

以下选项可以指定连接目标地址的方式

    -A AGENT, --user..  设置 HTTP User-Agent 头部值
    -H HEADER, --hea..  设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
    --method=METHOD     强制使用提供的 HTTP 方法(例如:PUT)
    --data=DATA         使用 POST 发送数据串(例如:"id=1")
    --param-del=PARA..  设置参数值分隔符(例如:&)
    --cookie=COOKIE     指定 HTTP Cookie(例如:"PHPSESSID=a8d127e..")
    --cookie-del=COO..  设置 cookie 分隔符(例如:;)
    --live-cookies=L..  指定 Live cookies 文件以便加载最新的 Cookies 值
    --load-cookies=L..  指定以 Netscape/wget 格式存放 cookies 的文件
    --drop-set-cookie   忽略 HTTP 响应中的 Set-Cookie 参数
    --mobile            使用 HTTP User-Agent 模仿智能手机
    --random-agent      使用随机的 HTTP User-Agent
    --host=HOST         指定 HTTP Host
    --referer=REFERER   指定 HTTP Referer
    --headers=HEADERS   设置额外的 HTTP 头参数(例如:"Accept-Language: fr\nETag: 123")
    --auth-type=AUTH..  HTTP 认证方式(Basic,Digest,NTLM 或 PKI)
    --auth-cred=AUTH..  HTTP 认证凭证(username:password)
    --auth-file=AUTH..  HTTP 认证 PEM 证书/私钥文件
    --ignore-code=IG..  忽略(有问题的)HTTP 错误码(例如:401)
    --ignore-proxy      忽略系统默认代理设置
    --ignore-redirects  忽略重定向尝试
    --ignore-timeouts   忽略连接超时
    --proxy=PROXY       使用代理连接目标 URL
    --proxy-cred=PRO..  使用代理进行认证(username:password)
    --proxy-file=PRO..  从文件中加载代理列表
    --proxy-freq=PRO..  通过给定列表中的不同代理依次发出请求
    --tor               使用 Tor 匿名网络
    --tor-port=TORPORT  设置 Tor 代理端口代替默认端口
    --tor-type=TORTYPE  设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(默认))
    --check-tor         检查是否正确使用了 Tor
    --delay=DELAY       设置每个 HTTP 请求的延迟秒数
    --timeout=TIMEOUT   设置连接响应的有效秒数(默认为 30)
    --retries=RETRIES   连接超时时重试次数(默认为 3)
    --randomize=RPARAM  随机更改给定的参数值
    --safe-url=SAFEURL  测试过程中可频繁访问且合法的 URL 地址(译者注:
                        有些网站在你连续多次访问错误地址时会关闭会话连接,
                        后面的“请求”小节有详细说明)
    --safe-post=SAFE..  使用 POST 方法发送合法的数据
    --safe-req=SAFER..  从文件中加载合法的 HTTP 请求
    --safe-freq=SAFE..  在访问给定的合法 URL 之间穿插发送测试请求
    --skip-urlencode    不对 payload 数据进行 URL 编码
    --csrf-token=CSR..  设置网站用来反 CSRF 攻击的 token
    --csrf-url=CSRFURL  指定可提取防 CSRF 攻击 token 的 URL
    --csrf-method=CS..  指定访问防 CSRF token 页面时使用的 HTTP 方法
    --csrf-retries=C..  指定获取防 CSRF token 的重试次数 (默认为 0)
    --force-ssl         强制使用 SSL/HTTPS
    --chunked           使用 HTTP 分块传输编码(POST)请求
    --hpp               使用 HTTP 参数污染攻击
    --eval=EVALCODE     在发起请求前执行给定的 Python 代码(例如:
                        "import hashlib;id2=hashlib.md5(id).hexdigest()")



优化:

以下选项用于优化sqlmap性能

    -o                  开启所有优化开关
    --predict-output    预测常用请求的输出
    --keep-alive        使用持久的 HTTP(S) 连接
    --null-connection   仅获取页面大小而非实际的 HTTP 响应
    --threads=THREADS   设置 HTTP(S) 请求并发数最大值(默认为 1)




注入:

    以下选项用于指定要测试的参数,提供自定义注入payloads和篡改参数的脚本

    -p TESTPARAMETER    指定需要测试的参数
    --skip=SKIP         指定要跳过的参数
    --skip-static       指定跳过非动态参数
    --param-exclude=..  用正则表达式排除参数(例如:"ses")
    --param-filter=P..  通过位置过滤可测试参数(例如:"POST")
    --dbms=DBMS         指定后端 DBMS(Database Management System,
                        数据库管理系统)类型(例如:MySQL)
    --dbms-cred=DBMS..  DBMS 认证凭据(username:password)
    --os=OS             指定后端 DBMS 的操作系统类型
    --invalid-bignum    将无效值设置为大数
    --invalid-logical   对无效值使用逻辑运算
    --invalid-string    对无效值使用随机字符串
    --no-cast           关闭 payload 构造机制
    --no-escape         关闭字符串转义机制
    --prefix=PREFIX     注入 payload 的前缀字符串
    --suffix=SUFFIX     注入 payload 的后缀字符串
    --tamper=TAMPER     用给定脚本修改注入数据




暴力破解:

以下选项用于暴力测试破解

    --common-tables     检测常见的表名是否存在
    --common-columns    检测常用的列名是否存在
    --common-files      检测普通文件是否存在



枚举:

以下选项用于获取后端DBMS的信息,结构和数据表中的数据

-a, --all           获取所有信息、数据
    -b, --banner        获取 DBMS banner
    --current-user      获取 DBMS 当前用户
    --current-db        获取 DBMS 当前数据库
    --hostname          获取 DBMS 服务器的主机名
    --is-dba            探测 DBMS 当前用户是否为 DBA(数据库管理员)
    --users             枚举出 DBMS 所有用户
    --passwords         枚举出 DBMS 所有用户的密码哈希
    --privileges        枚举出 DBMS 所有用户特权级
    --roles             枚举出 DBMS 所有用户角色
    --dbs               枚举出 DBMS 所有数据库
    --tables            枚举出 DBMS 数据库中的所有表
    --columns           枚举出 DBMS 表中的所有列
    --schema            枚举出 DBMS 所有模式
    --count             获取数据表数目
    --dump              导出 DBMS 数据库表项
    --dump-all          导出所有 DBMS 数据库表项
    --search            搜索列,表和/或数据库名
    --comments          枚举数据时检查 DBMS 注释
    --statements        获取 DBMS 正在执行的 SQL 语句
    -D DB               指定要枚举的 DBMS 数据库
    -T TBL              指定要枚举的 DBMS 数据表
    -C COL              指定要枚举的 DBMS 数据列
    -X EXCLUDE          指定不枚举的 DBMS 标识符
    -U USER             指定枚举的 DBMS 用户
    --exclude-sysdbs    枚举所有数据表时,指定排除特定系统数据库
    --pivot-column=P..  指定主列
    --where=DUMPWHERE   在转储表时使用 WHERE 条件语句
    --start=LIMITSTART  指定要导出的数据表条目开始行数
    --stop=LIMITSTOP    指定要导出的数据表条目结束行数
    --first=FIRSTCHAR   指定获取返回查询结果的开始字符位
    --last=LASTCHAR     指定获取返回查询结果的结束字符位
    --sql-query=SQLQ..  指定要执行的 SQL 语句
    --sql-shell         调出交互式 SQL shell
    --sql-file=SQLFILE  执行文件中的 SQL 语句




检测:

以下选项用于自定义检测方法

    --level=LEVEL       设置测试等级(1-5,默认为 1)
    --risk=RISK         设置测试风险等级(1-3,默认为 1)
    --string=STRING     用于确定查询结果为真时的字符串
    --not-string=NOT..  用于确定查询结果为假时的字符串
    --regexp=REGEXP     用于确定查询结果为真时的正则表达式
    --code=CODE         用于确定查询结果为真时的 HTTP 状态码
    --smart             只在使用启发式检测时才进行彻底的测试
    --text-only         只根据页面文本内容对比页面
    --titles            只根据页面标题对比页面




访问文件系统:

以下选项用于访问后端 DBMS 的底层文件系统

    --file-read=FILE..  读取后端 DBMS 文件系统中的文件
    --file-write=FIL..  写入到后端 DBMS 文件系统中的文件
    --file-dest=FILE..  使用绝对路径写入到后端 DBMS 中的文件




访问操作系统:

     以下选项用于访问后端 DBMS 的底层操作系统

    --os-cmd=OSCMD      执行操作系统命令
    --os-shell          调出交互式操作系统 shell
    --os-pwn            调出 OOB shell,Meterpreter 或 VNC
    --os-smbrelay       一键调出 OOB shell,Meterpreter 或 VNC
    --os-bof            利用存储过程的缓冲区溢出
    --priv-esc          数据库进程用户提权
    --msf-path=MSFPATH  Metasploit 框架的本地安装路径
    --tmp-path=TMPPATH  远程临时文件目录的绝对路径




访问 Windows 注册表:

       以下选项用于访问后端 DBMS 的 Windows 注册表

    --reg-read          读取一个 Windows 注册表键值
    --reg-add           写入一个 Windows 注册表键值数据
    --reg-del           删除一个 Windows 注册表键值
    --reg-key=REGKEY    指定 Windows 注册表键
    --reg-value=REGVAL  指定 Windows 注册表键值
    --reg-data=REGDATA  指定 Windows 注册表键值数据
    --reg-type=REGTYPE  指定 Windows 注册表键值类型




通用选项:

       以下选项用于设置通用的参数

    -s SESSIONFILE      从文件(.sqlite)中读入会话信息
    -t TRAFFICFILE      保存所有 HTTP 流量记录到指定文本文件
    --answers=ANSWERS   预设回答(例如:"quit=N,follow=N")
    --base64=BASE64P..  表明参数包含 Base64 编码的数据
    --base64-safe       使用 URL 与文件名安全的 Base64 字母表(RFC 4648)
    --batch             从不询问用户输入,使用默认配置
    --binary-fields=..  具有二进制值的结果字段(例如:"digest")
    --check-internet    在访问目标之前检查是否正常连接互联网
    --cleanup           清理 DBMS 中特定的 sqlmap UDF 与数据表
    --crawl=CRAWLDEPTH  从目标 URL 开始爬取网站
    --crawl-exclude=..  用正则表达式筛选爬取的页面(例如:"logout")
    --csv-del=CSVDEL    指定输出到 CVS 文件时使用的分隔符(默认为“,”)
    --charset=CHARSET   指定 SQL 盲注字符集(例如:"0123456789abcdef")
    --dump-format=DU..  导出数据的格式(CSV(默认),HTML 或 SQLITE)
    --encoding=ENCOD..  指定获取数据时使用的字符编码(例如:GBK)
    --eta               显示每个结果输出的预计到达时间
    --flush-session     清空当前目标的会话文件
    --forms             解析并测试目标 URL 的表单
    --fresh-queries     忽略存储在会话文件中的查询结果
    --gpage=GOOGLEPAGE  指定所用 Google dork 结果的页码
    --har=HARFILE       将所有 HTTP 流量记录到一个 HAR 文件中
    --hex               获取数据时使用 hex 转换
    --output-dir=OUT..  自定义输出目录路径
    --parse-errors      从响应中解析并显示 DBMS 错误信息
    --preprocess=PRE..  使用给定脚本做前处理(请求)
    --postprocess=PO..  使用给定脚本做后处理(响应)
    --repair            重新导出具有未知字符的数据(?)
    --save=SAVECONFIG   将选项设置保存到一个 INI 配置文件
    --scope=SCOPE       用正则表达式过滤目标
    --skip-heuristics   不对 SQLi/XSS 漏洞进行启发式检测
    --skip-waf          不对 WAF/IPS 进行启发式检测
    --table-prefix=T..  指定临时数据表名前(默认:"sqlmap")
    --test-filter=TE..  根据 payloads 和/或标题(例如:ROW)选择测试
    --test-skip=TEST..  根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
    --web-root=WEBROOT  指定 Web 服务器根目录(例如:"/var/www")




杂项:

       以下选项不属于前文的任何类别

    -z MNEMONICS        使用短助记符(例如:“flu,bat,ban,tec=EU”)
    --alert=ALERT       在找到 SQL 注入时运行 OS 命令
    --beep              在问题提示或在发现 SQL 注入/XSS/FI 时发出提示音
    --dependencies      检查 sqlmap 缺少(可选)的依赖
    --disable-coloring  关闭彩色控制台输出
    --offline           在离线模式下工作(仅使用会话数据)
    --purge             安全删除 sqlmap data 目录所有内容
    --results-file=R..  指定多目标模式下的 CSV 结果输出路径
    --shell             调出交互式 sqlmap shell
    --tmp-dir=TMPDIR    指定用于存储临时文件的本地目录
    --unstable          为不稳定连接调整选项
    --update            更新 sqlmap
    --wizard            适合初级用户的向导界面
目录
相关文章
|
4天前
|
SQL Web App开发 安全
【less-1】基于SQLI的SQL字符型报错注入
【less-1】基于SQLI的SQL字符型报错注入
14 2
|
4天前
|
SQL 安全 PHP
基于PHPCMS的SQL注入(Havij)
基于PHPCMS的SQL注入(Havij)
14 1
|
17天前
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
|
23天前
|
SQL 安全 关系型数据库
SQL 注入神器:SQLMap 简单使用
SQL 注入神器:SQLMap 简单使用
|
4天前
【干货】sql-labs、请求方式、注入类型、拼接方式
【干货】sql-labs、请求方式、注入类型、拼接方式
8 0
|
1月前
|
SQL 存储 Java
如何避免SQL注入攻击?
如何避免SQL注入攻击?
|
3天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
4天前
|
SQL Web App开发 前端开发
【less-11】基于SQLI的POST字符型SQL注入
【less-11】基于SQLI的POST字符型SQL注入
17 2
|
4天前
|
SQL 开发框架 安全
【干货】如何判断 Sql 注入点
【干货】如何判断 Sql 注入点
11 1
|
18天前
|
SQL 监控 安全
sql注入取数据库
SQL注入是一种攻击技术,用于在SQL查询中注入恶意代码,从而绕过安全措施,获取、修改或删除数据库中的数据。这种行为是非法的,并且严重违反了网络安全和隐私原则。我不能提供关于如何进行SQL注入的指导或