Sqlmap是什么
完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。
完全支持:
基于布尔的盲注:根据返回页面判断条件真假的注入
基于时间的盲注:增加注入时间延迟语句,根据页面返回时间判断注入语句是否执行
基于错误信息的注入:根据返回页面的报错信息判断注入
基于联合查询的注入:使用
union联合查询注入基于堆查询的注入:可以同时执行多条语句的注入
在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。
支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。
支持自动识别密码哈希格式并通过字典破解密码哈希。
支持完全地下载某个数据库中的某个表,也可以只下载某个表中的某几列,甚至只下载某一列中的部分数据,这完全取决于用户的选择。
支持在数据库管理系统中搜索指定的数据库名、表名或列名
当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持下载或上传文件。
当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持执行任意命令并回现标准输出。
Sqlmap全部参数
杂项
显示帮助信息并退出
1 | -h,--help |
显示详细的帮助信息并退出
1 | -hh |
显示版本信息并退出
1 | --version |
输出级别(默认输出级别为1)
0:只显示Python的tracebacks信息、错误信息ERROR和关键信息CRITICAL
1:同时显示普通信息INFO和警告信息WARNING
2:同时显示调试信息DEBUG
3:同时显示注入使用的攻击荷载
4:同时显示HTTP请求
5:同时显示HTTP响应头
6:同时显示HTTP响应体
1 | -v VERBOSE(0-6) |
目标
直连数据库
1 | -d DIRECT |
1 | 当数据库管理系统是MySQL、Oracle、Microsoft SQL Server或PostgreSQL等时格式为: |
指定一个URL作为目标
1 | -u URL,--url=URL |
从Burp或WebScarab代理日志文件中解析目标
该参数后跟一个表示日志文件的路径
1 | -l LOGFILE |
从远程站点地图(.xml)文件中解析目标
1 | -x SITEMAPURL |
扫描文本文件中给出的多个目标
1 | -m BULKFILE |
从文件加载HTTP请求
1 | -r REQUESTFILE |
将Google搜索结果作为攻击目标
Sqlmap能自动获取Google搜索的前一百个结果,对其中有GET参数的URL进行注入测试
1 | -g GOOGLEDORK |
从配置文件中加载选项
Sqlmap会解析该配置文件,按照该配置文件的配置执行动作。配置文件中可以指定攻击目标,实际上除了攻击目标外,配置文件还可以指定各种参数的值
1 | -c CONFIGFILE |
请求
强制使用给定的HTTP方法(例如PUT)
1 | --method=METHOD |
POST数据
该参数指定的数据会被作为POST数据提交
1 | --data=DATA |
指定参数分隔符
默认地以&作为分隔符
1 | --param-del=PARA.. |
HTTP Cookie头的值
1 | --cookie=COOKIE |
指定用于分割cookie值的字符
1 | --cookie-del=COO.. |
从文件中载入Netscape或wget格式的cookie
1 | --load-cookies=L.. |
Sqlmap忽略响应头中的“Set-Cookie”
1 | --drop-set-cookie |
指定一个User-Agent值
1 | --user-agent=AGENT |
使用随机选择的HTTP User-Agent头值
1 | --random-agent |
指定HTTP头中的Host值
1 | --host=HOST |
指定HTTP头中的Referer值
Sqlmap发送的HTTP请求头部默认无Referer字段
1 | --referer=REFERER |
指定一个额外的头
1 | -H HEADER |
指定多个额外的头
若添加多个字段,用\n分隔
1 | --headers=HEADERS |
指定HTTP认证类型(Basic, Digest, NTLM , PKI)
1 | --auth-type=AUTH.. |
指定HTTP身份验证凭证
格式是username:password
1 | --auth-cred=AUTH.. |
基于证书的身份认证
若Web服务器要求客户端提供证书则可以使用此参数指定一个PEM格式的证书文件
1 | --auth-file=AUTH.. |
忽略HTTP错误代码
1 | --ignore-code=IG.. |
忽略系统默认代理设置
1 | --ignore-proxy |
忽略重定向的尝试
1 | --ignore-redirects |
忽略连接超时
1 | --ignore-timeouts |
设置一个HTTP(S)代理连接到目标URL
格式是http(s)://url:port
1 | --proxy=PROXY |
指定代理身份验证凭证
格式是username:password
1 | --proxy-cred=PRO.. |
从文件中加载代理列表
1 | --proxy-file=PRO.. |
使用tor匿名网络
1 | --tor |
设置Tor代理端口而不是默认
1 | --tor-port=TORPORT |
设置Tor代理类型(HTTP、SOCKS4或SOCKS5)
默认SOCKS5类型
1 | --tor-type=TORTYPE |
检查Tor是否正确使用
1 | --check-tor |
每次HTTP请求之间添加延迟
1 | --delay=DELAY |
设置超时时间
默认30秒
1 | --timeout=TIMEOUT |
设置超时后最大重试次数
默认3次
1 | --retries=RETRIES |
随机化参数值
随机生成每次HTTP请求中参数的值,值的类型和长度依照于原始值
1 | --randomize=RPARAM |
避免错误请求过多而被屏蔽
有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量错误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。
Sqlmap不会对安全URL进行任何注入测试
设置隔一会就访问一下的安全
URL1
--safe-url=SAFEURL
设置访问安全
URL时携带的POST数据1
--safe-post=SAFEURL
从文件中载入安全
HTTP请求1
--safe-req=SAFEURL
每次测试请求之后都会访问一下的安全
URL1
--safe-freq=SAFEURL
关闭URL编码
Sqlmap默认会对URL进行URL编码1
--skip-urlencode
用于指定包含token的隐藏字段名
1 | --csrf-token=CSRFURL |
从任意的URL中回收token值
1 | --csrf-url=CSRFURL |
强制使用SSL
1 | --force-ssl |
使用HTTP参数污染法
HTTP参数污染是绕过WAF/IPS/IDS的一种技术
1 | --hpp |
在每次请求前执行特定Python代码
1 | --eval=EVALCODE |
优化
打开所有优化开关
1 | -o |
预测常见的查询输出
1 | --predict-output |
使用持久HTTP(s)连接
该参数与-proxy矛盾
1 | --keep-alive |
HTTP空连接
直接获得HTTP响应的大小而不用获得HTTP响应体
这在布尔型盲注中可以节约很大的带宽。当然这一技术是需要服务器端支持的
与--text-only矛盾
1 | --null-connection |
HTTP(s)最大并发数
默认为1
1 | --threads=THREADS |
注入
指定一个以逗号分隔的,要测试的参数列表
该列表中的参数不受level限制
1 | -p TESTPARAMETER |
跳过指定的测试参数
1 | --skip=SKIP |
跳过那些看起来不动态的测试参数
1 | --skip-static |
从测试中排除参数
1 | --param-exclude=.. |
指定数据库管理系统
1 | --dbms=DBMS |
指定DBMS身份验证凭据
格式:user:password
1 | --dbms-cred=DBMS |
指定运行数据库管理系统的操作系统
1 | --os=OS |
生成无效参数值时强制使用大数
1 | --invalid-bignum |
生成无效参数值时强制使用逻辑操作符
1 | --invalid-logical |
生成无效参数值时强制使用字符串
1 | --invalid-string |
关闭payload转换
1 | --no-cast |
关闭字符串编码
1 | --no-escape |
设置payload的前置字符串
1 | --prefix=PREFIX |
设置payload的后缀字符串
1 | --suffix=SUFFIX |
使用给定的脚本来修改注入数据
除了用CHAR()编码字符串外Sqlmap没有对payload进行任何混淆。
该参数用于对payload进行混淆以绕过IPS或WAF。
该参数后跟一个tamper脚本的名字。
多个tamper脚本之间用空格隔开。
1 | --tamper=TAMPER |
检测
指定检测级别,1-5级
默认为1级
检测级别不仅会影响payload的使用,还会影响注入点的检测,GET和POST参数是一直会被检测的,
检测级别大于等于2时会检测cookie是否有注入,检测级别大于等于3时会检测User-Agent和Referer是否有注入。
1 | --level=LEVEL |
指定风险等级,1-3级
默认为1级
风险等级2添加了基于时间的注入测试,等级3添加了OR测试
1 | --risk=RISK |
页面对比
默认情况下在布尔型注入中Sqlmap通过比较返回页面内容来判断True或False
指定代表
True的页面会包含而代表False的页面不会包含的字符串以供Sqlmap判断True或False1
--string=STRING
指定一个正则表达式去匹配这样的字符串
1
--regexp=REGEXP
指出代表
False的页面会包含而代表True的页面不会包含的字符串以供Sqlmap判断True或False1
--not-string=NOTSTRING
指定被认为是
True时的HTTP代码1
--code=CODE
若是
HTTP响应体中有许多诸如JavaScript之类的活动内容,可以使用此参数让Sqlmap只专注于纯文本内容。1
--text-only
就可以使用此参数让
Sqlmap依据title来判断True或False1
--titles
技术
指定检测注入时所用技术
默认情况下Sqlmap会使用自己支持的全部技术进行检测(BEUSTQ)
此参数后跟表示检测技术的大写字母,其值为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 queries(嵌套查询注入)
1 | --technique=TECH |
基于时间延迟注入中延时设置
默认为5秒
1 | --time-sec=TIMESEC |
联合查询注入中列数设置
在进行联合查询注入时,Sqlmap会自动检测列数,范围是1到10。
当level值较高时列数检测范围的上限会扩大到50。
1 | --union-cols=UCOLS |
联合查询注入中字符设置
默认情况下Sqlmap进行联合查询注入时使用空字符(NULL)。
当level值较高时Sqlmap会生成随机数用于联合查询注入。因为有时使用空字符注入会失败而使用随机数会成功。
1 | --union-char=UCHAR |
联合查询注入中表名设置
1 | --union-from=UFROM |
DNS泄露攻击
1 | --dns-domain=DNS.. |
二阶注入攻击
有时注入结果显示在别的页面,此时需要用此参数指明显示注入结果的页面,该参数后跟一个URL
1 | --second-order=S.. |
指纹
默认Sqlmap会自动对注入目标进行数据库管理系统指纹识别。
执行更广泛的数据库管理系统指纹识别可以添加此参数
1 | -f, --fingerprint |
枚举
列举所有可访问的数据
1 | -a, --all |
列举数据库管理系统信息
1 | -b, --banner |
列举当前数据库用户
1 | --current-user |
列举当前数据库
1 | --current-db |
列举服务器主机名
1 | --hostname |
检测当前管理员用户是否是管理员
若是管理员则返回True,否则返回False
1 | --is-dba |
列举数据库管理系统中的用户
1 | --users |
列举并破解数据库管理系统用户密码Hash值
1 | --passwords |
列举数据库管理系统的用户权限
1 | --privileges |
列举数据库管理系统的用户角色
1 | --roles |
列举数据库管理系统中的所有数据库
1 | --dbs |
列举-D指定数据库的所有表
1 | --tables |
列举-D指定数据库-T指定表的所有列
1 | --columns |
列举数据库管理系统的模式
1 | --schema |
列举表中数据条数
1 | --count |
列举表中数据
用参数-D指定数据库,用参数-T指定数据表,用参数-C指定目标列
1 | --dump |
列举所有数据库所有表中所有数据
1 | --dump-all |
在数据库、表、列中搜索
1 | --search |
列举数据库管理系统中的注释
1 | --comments |
在列举表时排除数据库管理系统中的系统数据库
1 | --exclude-sysdbs |
主列名称
1 | --pivot-column=P.. |
限制列举的数据
此参数会被Sqlmap转换成WHERE子句
1 | --where=DUMPWHERE |
列举指定开始位置后的数据(不包含指定位置)
1 | --start=LIMITSTART |
列举指定结束位置前的数据(包含指定位置)
1 | --stop=LIMITSTOP |
第一个查询输出字字符
1 | --first=FIRSTCHAR |
最后一个查询输出字字符
1 | --last=LASTCHAR |
指定要执行的SQL语句
1 | --sql-query=QUERY |
提供一个交互式的SQL语句执行环境
支持Tab键补全和命令历史记录
1 | --sql-shell |
从给定文件执行SQL语句
1 | --sql-file=SQLFILE |
用参数-D指定数据库,用参数-T指定数据表,用参数-C指定目标列,用参数-U指定数据库用户
暴力破解
检查公共表的存在
1 | --common-tables |
检查公共列的存在
1 | --common-columns |
用户定义函数注入(UDF注入)
注入自定义用户定义函数
1 | --udf-inject |
指定共享库的本地路径
1 | --shared-lib=SHLIB |
文件系统访问
读取文件
1 | --file-read=RFILE |
写入文件
1 | --file-write=WFILE |
写入文件至绝对路径
1 | --file-dest=DFILE |
操作系统访问
执行操作系统命令
1 | --os-cmd=OSCMD |
模拟一个可以执行任意命令的系统shell
可以用Tab键补全,支持历史记录
1 | --os-shell |
模拟一个OOB shell,Meterpreter或VNC
1 | --os-pwn |
一次点击提示用于OOB shell,Meterpreter或VNC
1 | --os-smbrelay |
存储过程缓冲区溢出
1 | --os-bof |
数据库过程用户权限升级
1 | --priv-esc |
指定安装Metasploit框架的本地路径
1 | --msf-path=MSFPATH |
指定临时文件目录的远程绝对路径
1 | --tmp-path=TMPPATH |
Windows注册表访问
阅读Windows注册表的键值
1 | --reg-read |
写入一个Windows注册表键值数据
1 | --reg-add |
删除一个Windows注册表的键值
1 | --reg-del |
指定Windows注册表键值的路径
1 | --reg-key=REGKEY |
指定Windows注册表键值的键
1 | --reg-value=REGVAL |
指定Windows注册表键值的值
1 | --reg-data=REGDATA |
指定Windows注册表键值的值的数据类型
1 | --reg-type=REGTYPE |
通用选项
从SQLite文件中载入Sqlmap会话
Sqlmap会自动地为每一个目标创建长久保存的会话SQLite文件,该文件统一存储在特定目录中,其中保存着恢复会话所需的所有数据。
1 | -s SESSIONFILE |
将HTTP(S)流量记录到日志文件中
1 | -t TRAFFICFILE |
非交互模式
使用该参数可以让Sqlmap以非交互模式运行,所有要求的输入都会取默认值。
1 | --batch |
指定结果字段具有二进制值
1 | --binary-fields=.. |
在评估目标之前检查互联网连接
1 | --check-internet |
从目标URL开始爬取目标站点
1 | --crawl=CRAWLDEPTH |
排除不想爬取的URL
支持正则
1 | --crawl-exclude=.. |
设置输出CSV文件中的分隔符
默认以,分隔
1 | --csv-del=CSVDEL |
设置字符编码
1 | --charset=CHARSET |
设置数据输出格式
支持CSV (默认), HTML 或 SQLITE
1 | --dump-format=DU.. |
设置用于数据检索的字符编码
1 | --encoding=ENCOD.. |
显示估计的完成时间
1 | --eta |
为当前目标刷新会话文件
以避免Sqlmap默认的缓存机制可能造成的一些问题
1 | --flush-session |
测试表单数据是否存在注入点
1 | --forms |
忽略会话文件中的查询结果重新执行查询
1 | --fresh-queries |
将所有HTTP流量记录到一个HAR文件中
1 | --har=HARFILE |
对返回结果以十六进制返回
1 | --hex |
指定输出目录路径
1 | --output-dir=OUT.. |
从响应中解析DBMS的错误信息
1 | --parse-errors |
保存选项到配置文件中
该文件可编辑并且可以使用参数-c加载
配置文件是INI格式的
1 | --save=SAVECONFIG |
从提供的代理日志中过滤目标
1 | --scope=SCOPE |
通过关键词选择使用的payload或titles
1 | --test-filter=TE.. |
通过某关键词不使用某些payload或titles
1 | --test-skip=TEST.. |
升级sqlmap
1 | --update |
杂项
使用简写
1 | -z MNEMONICS |
在成功检测到注入点时报警
后跟一个用于发出警报的命令
1 | --alert=ALERT |
设置问题的回答
使用–batch以非交互模式运行时所有问题都以按默认值作为回答。有时不想以默认值为答案又想使用非交互模式,此时可以使用此参数对特定问题进行回答,若回答多个问题,以逗号分隔。
1 | --answers=ANSWERS |
在成功检测到注入点时发出“嘟”声
1 | --beep |
清除Sqlmap创建的临时表和自定义函数
1 | --cleanup |
检查依赖
用此参数可以检查依赖的第三方库是否安装
1 | --dependencies |
关闭彩色输出
1 | --disable-coloring |
指定使用Google dork结果的某页
1 | --gpage=GOOGLEPAGE |
彻底检测WAF/IPS/IDS
1 | --identify-waf |
模仿智能手机
1 | --mobile |
离线模式(仅仅使用会话数据)
Sqlmap将仅仅使用以前存储的会话数据做测试而不向目标发送任何数据包
1 | --offline |
从输出目录中安全移除所有内容
1 | --purge-output |
对waf/ip/ids保护,跳过启发式检测
默认地Sqlmap会发送虚假的SQL注入playload以试探目标是否有保护措施
1 | --skip-waf |
快速扫描
目的是尽快找出其中存在的某些注入点而有所遗漏也没有关系时可以使用此参数进行正向启发式扫描。此时只有让数据库管理系统报错的参数才会做进一步测试,其余URL均被跳过。
1 | --smart |
交互式Sqlmap Shell
打开一个交互式的Sqlmap Shell,支持历史记录
1 | --sqlmap-shell |
指定用于存储临时文件的本地目录
1 | --tmp-dir=TMPDIR |
指定Web服务器文档根目录
1 | --web-root=WEBROOT |
为初学者准备的简单向导
1 | --wizard |
Sqlmap常用脚本
apostrophemask.py
将引号替换为UTF-8,用于过滤单引号的情况
base64encode.py
替换为base64编码
multiplespaces.py
围绕SQL关键字添加多个空格
space2plus.py
用+替换空格
nonrecursivereplacement.py
用双重叠写语句替换预定义的SQL关键字
space2randomblank.py
将空格替换为其他有效字符
unionalltounion.py
将union all select替换为union select
securesphere.py
追加特制的字符串
space2hash.py
将空格替换为#,并添加一个随机字符串和换行符
space2mssqlblank.py
针对mssql数据库,将空格替换为其他空符号
space2mssqlhash.py
针对mssql数据库,将空格替换为#,并添加一个换行符
between.py
用not between 0 and 替换>,用between and替换=
percentage.py
ASP中,允许在每个字符前添加一个%
sp_password.py
从DBMS日志的自动模糊处理的payload中追加sp_password
charencode.py
对给定的payload全部字符使用URL编码(不处理已经编码的字符)
randomcase.py
随机大小写
charunicodeencode.py
字符串unicode编码
space2comment.py
将空格替换为/**/
equaltolike.py
将=替换为like
greatest.py
用于绕过对>的过滤,用greatest替换>
ifnull2ifisnull.py
用于绕过对ifnull的过滤,替换类似ifnull(A,B)为if(isnull(A),B,A)
modsecurityversioned.py
过滤空格,使用mysql内联注释的方式进行注入
space2mysqlblank.py
针对mysql,将空格替换为其他空白符号
modsecurityzeroversioned.py
使用mysql内联注释的方式注入
space2mysqldash.py
将空格替换为--,并添加一个换行符
bluecoat.py
在SQL语句之后用有效的随机空白符替换空格符,随后用like替换=
versionedkeywords.py
注释绕过
halfversionedmorekeywords.py
用于数据库为mysql时绕过防火墙,在每个关键字之前添加mysql版本的注释
space2morehash.py
将空格替换为#,并添加一个随机字符串和换行符
apostrophenullencode.py
用非法双字节unicode字符替换单引号
appendnullbyte.py
在有效payload的结束位置加载零字节字符编码
chardoubleencode.py
对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
unmagicquotes.py
用一个多字节组合(%bf%27)和末尾通用注释一起替换空格
randomcomments.py
用/**/分割SQL关键字