SQLmap---自动化SQL注入攻击神器

SQLmap自动化SQL注入攻击神器

声明
B 站UP主泷羽sec

笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣幸成为一名分享者,最终目标是成为一名开拓者,很有趣也十分有意义
🤵‍♂️ 个人主页: ***@One_Blanks***
欢迎评论 💬点赞👍🏻 收藏 📂加关注+

  • 关注公众号:泷羽Sec-Blanks

一、介绍

sqlmap 是一款自动化检测与利用 SQL 注入漏洞的免费开源工具。

sqlmap 官方站点

官方网站:sqlmap.org

GitHub 仓库:github.com/sqlmapproject/sqlmap

用户手册:sqlmap Wiki

SQLmap中文用户手册获取

SQLmap中文手册

二、下载

在Kali中自带sqlmap

如果需要WIndows或其他系统版本
下载链接

三、帮助

用法:	sqlmap [选项]
选项:
  -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     用给定脚本修改注入数据
  检测:
    以下选项用于自定义检测方式
    --level=LEVEL       设置测试等级(1-5,默认为 1)
    --risk=RISK         设置测试风险等级(1-3,默认为 1)
    --string=STRING     用于确定查询结果为真时的字符串
    --not-string=NOT..  用于确定查询结果为假时的字符串
    --regexp=REGEXP     用于确定查询结果为真时的正则表达式
    --code=CODE         用于确定查询结果为真时的 HTTP 状态码
    --smart             只在使用启发式检测时才进行彻底的测试
    --text-only         只根据页面文本内容对比页面
    --titles            只根据页面标题对比页面
  技术:
    以下选项用于调整特定 SQL 注入技术的测试方法
    --technique=TECH..  使用的 SQL 注入技术(默认为“BEUSTQ”,译者注:
                        B: Boolean-based blind SQL injection(布尔型盲注)
                        E: Error-based SQL injection(报错型注入)
                        U: UNION query SQL injection(联合查询注入)
                        S: Stacked queries SQL injection(堆叠查询注入)
                        T: Time-based blind SQL injection(时间型盲注)
                        Q: inline Query injection(内联查询注入)
    --time-sec=TIMESEC  延迟 DBMS 的响应秒数(默认为 5)
    --union-cols=UCOLS  设置联合查询注入测试的列数目范围
    --union-char=UCHAR  用于暴力猜解列数的字符
    --union-from=UFROM  设置联合查询注入 FROM 处用到的表
    --dns-domain=DNS..  设置用于 DNS 渗出攻击的域名(译者注:
                        推荐阅读《在SQL注入中使用DNS获取数据》
                        http://cb.drops.wiki/drops/tips-5283.html,
                        在后面的“技术”小节中也有相应解释)
    --second-url=SEC..  设置二阶响应的结果显示页面的 URL(译者注:
                        该选项用于 SQL 二阶注入)
    --second-req=SEC..  从文件读取 HTTP 二阶请求
  指纹识别:
    -f, --fingerprint   执行广泛的 DBMS 版本指纹识别
  枚举:
    以下选项用于获取后端 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 语句
暴力破解:
以下选项用于暴力破解测试
	--common-tables 检测常见的表名是否存在
	--common-columns 检测常用的列名是否存在
	--common-files 检测普通文件是否存在
用户自定义函数注入:
以下选项用于创建用户自定义函数
	--udf-inject 注入用户自定义函数
	--shared-lib=SHLIB 共享库的本地路径
访问文件系统:
以下选项用于访问后端 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 适合初级用户的向导界面

四、使用

(一)直连数据库(连接数据库)

使用-d选项

例如:

sqlmap -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --bann\er --dbs --users

解释:

  • -d 表示指定目标数据库的连接信息。

  • mysql://admin:admin@192.168.21.17:3306/testdb 数据库连接字段

mysql:// 表示数据库类型是 MySQL,admin:admin 是数据库的用户名和密码,这里的用户名为 admin,密码为 admin,192.168.21.17:3306 是数据库服务器的 IP 地址和端口号,testdb 是要连接的数据库名称.

  • -f:参数用于测试数据库服务器的指纹信息。

  • --banner:用于获取数据库服务器的版本、操作系统等信息

  • --dbs:用于枚举数据库服务器上的所有数据库名称。

  • --users:尝试枚举数据库服务器上的用户信息。

(二)检验URL

使用-u选项

例如:

c
  • -u 表示指定一个 URL 作为目标,其会检验id=这个传参点出是否存在SQL注入漏洞

  • --batch参数表示自动回答,执行的时候就不用来回输入Y了,全自动执行

  • --dump参数自动提取数据库内容,然后显示输出出来

--batch--dump这两个参数用着还是比较舒服的,比较全自动就搞定了

(三)多目标扫描检验

使用-m选项

通过文本文件提供一个URLs列表或直连都可以进行混用,SQLmap会逐个进行扫描验证。

例如:

sqlmap -m targets.txt -f --banner --dbs --users --batch --dump

targets.txt中格式为

http://example1.com/page.php?id=1
http://example2.com/vuln.php?param=value
mysql://user:pass@host:port/database
(四)载入HTTP请求头

使用-r选项

例如:

sqlmap -m targets.txt -r http.txt -f --banner --dbs --users --batch --dump

http.txt中的内容为:

POST /vuln.php HTTP/1.1
Host: www.sqllab.com
User-Agent: Mozilla/4.0

id=1

通过这种方式,能够免于设置cookies,POST 数据等参数

(五)请求构造
  1. --method选项构造请求方法
--method=PUT
  1. --data构造请求的数据
sqlmap -u "http://www.sqllab.com/vuln.php" --data="id=1" --method=POST

这里为POST请求方式并且请求数据为id=1

  1. --cookie--cookie-del--live-cookies--load-cookies--drop- set-cookie选项用来设置COOKIE头部

其之前通常使用进行分隔,这是一个注意的点

  1. --user-agent--random-agent选项用来设置User-Agent请求头部

默认情况下,sqlmap 使用以下 User-Agent 请求头值执行 HTTP 请求:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
  • 这个时候我们就可以修改User-Agent请求头部,进行sqlmap特征修改,以更加隐蔽的方式进行SQL注入检测
  1. --host选项,设置Host请求头

  2. --regerer选项,设置Regerer请求头

  3. --headers选项,设置Headers 请求头

  4. 绕过反CSRF防护

使用--csrf-token--csrf-url选项

选项 --csrf token 用于设置包含随机 token 的隐藏字段的名称。这在网站对这些字段使用非标准名称的情况下是非常有用的。

选项 --csrf-url 用于从任意有效的 URL 地址获取 token 值。

(六)细节参数
  1. 设置每个HTTP请求之间的延迟

使用--delay选项,默认无延迟,若=0.5,表示延迟为0.5s

  1. 超时连接等待秒数

使用--timeout选项,设置同上

  1. 连接超时最大重试次数

使用--retries选项,默认最大重连次数为3,设置同上

  1. 级别与范围的划定

使用--level选项,

总共有五个级别。默认的级别是 1,该级别
只会进行简单的检测(请求)。级别 5 会更详细地对更大范围 payloads 和 boundaries(作
为 SQL payload 的前缀和后缀)进行检测。级别大于等于 2 则会测试 HTTP Cookie 头部,级别大于等于 3 则会测试 HTTP UserAgent/Referer 头部值。
总而言之, 如果 SQL 注入检测的难度越高,则需要设定越高的 --level值。

(七)技术调整
  1. 指定测试的SQL注入类型

--technique选项

默认情况下 sqlmap 会测试它支持的 所有类型/技术。

当然也可以去指定、使用B、E、U、S、T、Q参数

B :布尔型盲注(Boolean-based blind)

E :报错型注入(Error-based)

U :联合查询注入(UNION query-based)

S :堆叠查询注入(Stacked queries)

T :时间型盲注(Time-based blind)

Q :内联查询注入(inline Query)

  1. 设置时间型盲注中延时响应秒数

--time-sec提供一个整数,可以设置时间型盲注响应的延迟时间。默认情况下,它的值为 5 秒。

  1. 指定联合查询注入中的列数

--union-cols选项

默认情况下,sqlmap 进行联合查询注入时使用 1 到 10 列。当然,可以通过提供更高的 --level 值将该范围增加到最多 50 列。

(八)进阶玩法

更多进阶玩法,参考SQLmap手册,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值