sqlmap版本:1.4.6
借鉴了网上几位大佬的总结,自己也加了一些
选项
-h,--help 显示基本帮助信息并退出
-hh 显示高级帮助信息并退出
--version 显示程序版本信息并退出
-v VERBOSE 信息级别: 0-6 (缺省1)
其值具体含义:
“0”只显示python错误以及严重的信息;
“1”同时显示基本信息和警告信息(默认);
“2”同时显示debug信息;
“3”同时显示注入的payload;
“4”同时显示HTTP请求;
“5”同时显示HTTP响应头;
“6”同时显示HTTP响应页面;
如果想看到sqlmap发送的测试payload最好的等级就是3。
获取目标
-d:直接连接数据库 (-d “mysql://user:passward@地址:端口/数据库名称”)
get方法
-u:指定url (?id=1)
-l:从Brupsuite proxy或WebScarab proxy中读取http请求日志文件
-x:从sitemap.xml站点地图文件中读取目标探测
-m:从多行文本格式文件读取多个目标,对多个目标进行探测
-r:丛文本文件中读取http请求作为SQL注入探测的目标
-c:从配置文件sqlmap.conf中读取目标探测
-g:google搜索出来的结果 (-g “inurl:\”.php?id=1\””)\”只是将双引号内的”特殊字符进行转义post方法
-data:-u “http://xxx.xxx.xxx“ —data=”post请求抓取的源代码”
请求参数
HTTP数据
数据段: -data
get/post都适用
对于post还可以使用链接并将post抓取的源代码用—data,并输入抓取的源代码
sqlmap -u http://"链接“ —data=”post请求抓取的源代码” —dbs,常用于post请求。cookie头
—cookie:-u “url” —cookie=”…” —level 2(需要注意的是,当level默认为1的时候,默认不扫cookie的内容,必须是level大于等于2才能扫cookie里的内容)user-agent头
—user-agent http:头会携带一个值,就是user-agent,表示访问的浏览器的信息,我们可以手动指定伪造一个
—random-agent:随机产生user-agent头,也不是随机,是从/usr/share/sqlmap/txt/user-agents.txt,收集了大量的浏览器信息
sqlmap -u “…” —cookie=”…” —level 3 —random-agent —dbs —user-agent=”aaaaa”
lever>=3才会去检查user-agent头是否存在注入漏洞host头
—host level=5,host存在注入的漏洞情况比较少,同时也不建议把级别设置成5
—host=”aaaaaa”,每次HOST请求时都会变成一串areferer头
—referer level>=3,才会对referer头进行检测
—referer=”aaaa”额外定义的heade头
—HEADER 设置单一的http头
—headers 每个头单独一行,可以使用\n来换行(名称区分大小写)
—headers=”…\n…”
身份验证
HTTP协议认证
Basic 基本身份验证
Digest 摘要式身份认证
NTLM NTLM身份验证(windows)
sqlmap -u “…” —auth-type Basic —auth-cred “user:pass” ,指明验证类型为Basic,并说明用户名和密码http(s)代理
主动请求时会被记录,被发现屏蔽,这时我们需要个代理,就用到了—proxy参数了。
—proxy=”http://127.0.0.1:8087“
—proxy-cred=”name:pass” 需做身份验证时
—proxy-file 用于设置文件中的多条代理
—ignore-proxy 忽略系统级代理,通常用于扫描本地网络目标(若在操作系统设置了代理,后续的一切工作都经过代理)基于客户端证书(比较少见,在以前的网银中比较常见)
当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。
key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。
—auth-cert (name:password)
—auth-file(HTTP authentication PEM cert/private key file)
如:—auth-file=”ca.PEM”,含有私钥的PEM格式证书文件或PEM格式的证书链文件设置忽略401
—ignore-401参数用来忽略为验证错误
如果想测试返回HTTP错误401(未经授权)的站点,在忽略它并不提供适当凭证的情况下继续测试
使用技巧
HTTP请求延迟
发送量过大的话,会引起waf等发现,
—delay 每次http(s)请求之间延迟时间,浮点数,单位为妙,默认无延迟,输入此参数,你会发现每个请求都会延迟3秒,当然数据库还是可以爆出来的设置请求超时时间
若客户端一直未收到服务器返回的值,就一直等着,所以需要个请求超时时间
—timeout 请求超时时间,浮点数,默认30秒设定重试时间
—retries http(s)连接超时重传次数,默认3次设定随记改变的参数值
—randomize 长度、类型与原始值保持一致的前提下,值当每次请求随记取值的参数名
sqlmap -u “http://1.1.1.1/a.php?id=1“ —randomize=”id”利用正则表达式过滤目标网址
—scope 使用brup抓取的日志文件,但日志文件比较大,你只想检测日志中的一个站点或者某一个特征是否存在sql注入
过滤日志内容,通过正则表达式筛选扫描对象
sqlmap -l burp.lpg —scope=”(www)?.baidu.(com|net|org)”
sqlmap -l burp.lpg —scope=”(19)?.168.20.(1|10|100)”关掉URL参数值编码
—skip-urlencode 默认get方法会对传输内容进行编码,某些web服务器不遵循RFC标准编码,使用原始字符提交数据避免过多的错误请求被屏蔽
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。常见情况是在检测盲注阶段会产生大量失败请求,当产生大量错误请求后,服务器端可能因此销毁session
—safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
—safe-post:POST数据发送到安全URL
—safe-req:从文件加载安全的HTTP请求
—safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
性能优化
-o:打开所有优化开关
持久连接
—keep-alive:使用http(s)长连接,性能好,与—proxy参数不兼容检索没有body响应的内容
—null-conection:只获取响应页面的大小值,而非页面具体内容能够
通常用于盲注判断真/假,降低网络带宽消耗
与—text-only参数不兼容(基于页面内容的比较判断真/假)多线程
—threads=THREADS:并发HTTP请求的最大数量(默认1)
盲注时每个线程获取一个字符(7此请求),获取完成后线程结束
默认为1,建议不要超过10,否则可能影响站点可用性
与—predict-output参数不兼容预测输出
—predict-output
根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
版本名、用户名、密码、Prervileges、role、数据库名称、表名、列名
与—threads参数不兼容
统计表路径:/usr/share/sqlmap/txt/common-outputs.txt
注入
指定测试的参数
-p
sqlmap默认测试所有的GET和POST参数,当—level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是也可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”
指定扫描的参数,也可指定变量名称,使—level失效排除测试的参数
—skip / —skip-static
当你使用—level的值很大但是有个别参数不想测试的时候可以使用—skip参数。排错指定的扫描参数,不指定的默认会对全部扫描,然后根据level级别对http头扫描
—skip-static可忽略非动态的参数
如:—level=5 —skip=”id,uesr-agent”忽略探测具体的参数
—param-exclude
例:—param-exclude=”token|session”,可忽略对包含token或session的参数进行探测指定数据库
—dbms 数据库管理系统名称[版本号]
默认情况系sqlmap会自动的探测web应用后端的数据库是什么,但是如果已经知道的目标是什么数据库了,可以使用—dbms指定数据库节省时间了,提高工作效率了
例:—dbms mysql 5.0
—dbms-cres = username:password
设置DBMS认证指定数据库服务器系统
—os
默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows强制设置无效值替换
—invalid-bignum / —invalid-logical / —invalid-string
默认情况下sqlmap使用负值使参数失效 id=1 -> id=-1
bignum使用大数使参数值失效 id=999999关闭负载转换机制
—no-cast
在检索结果是,sqlmap使用一种机制,在这种纸质中,所有的条目都被转换为字符串类型,并在NULL值的情况下用空格字符替换。这样做是为了防止出现任何错误状态(例如,将空格与字符串连接起来),并简化数据检索过程本身。尽管如此,还是有报告的案例(例如MySQL DBMS旧版本)由于数据检索本身的问题(没有返回值)需要关闭这种机制。关闭字符转义机制
—no-escape
关闭使用char替换字符串功能
出于混淆和避免出错的目的,payload中用单引号界定字符串时,sqlmap使用char()编码逃避的方法替换字符串
select ‘foo’ ->select char(102)+char(111)+char(111)自定义注入负载位置
—prefix / —sufix
在某些情况下,只有当用户提供要附加早注入负载的特定位置时,易受攻击的参数才可被利用。当用户一斤知道查询语法并希望通过直接提供注入有效负载的前缀和后缀来检测和利用SQL注入式使用
例如:1
2
3$query = "SELECT * FROM users WHERE id = ('.$_GET['id'].') LIMIT 0,1";
// python sqlmap.py -u "http://xxx.xxx.xxx/?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
$query = "SELECT * FROM users WHERE id = ('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0,1";tamper脚本
—tamper
sqlmap本身不会回校发送的有效负载,出来单引号之间的字符串被CHAR()类似的表示形式所取代之外。
sqlmap通过tamper脚本来绕过WAF等防御措施,可以在tamper文件夹下找到所有sqlmap自带的tamper脚本。
例:—tamper “xxx.py,xx.py”
自定义检测参数
探测等级
—level
此选项需要制定要执行的测试等级参数,共有5个等级。在执行有限数量的测试时,默认值为1,1~5探测复杂度逐步提升。
sqlmap使用的payload可以在/usr/share/sqlmap/xml/payloads中看到,也可以根据相应的格式添加自己的payload。
这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。风险等级
—risk
共有3个风险等级,默认是1会测试大部分的测试语句,2会增加基于时间的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。页面比较参数
—string:指定包含字符串,查询为True
—not-string:指定包含字符串,查询为False
—regexp:指定通过正则表达式匹配字符串,查询为True
—code:指定匹配HTTP状态响应码,查询为True
默认情况下,通过比较注入的请求页面内容和未注入的原始页面内容,可以区分真查询和假查询。这种观念并不总是起作用,是因为在每次刷新页面内容的变化有时甚至没有注入。例如当页面有一个计数器,一个动态广告横幅或者其他HTML的一部分呈现动态和可能改变时间不仅因此用户的输入。为了绕过这个限制,sqlmap努力识别响应体的这些片段并进行相应处理。内容比较参数
—text-only:设置页面内容中包含文本
—titles:设置页面title中包含文本
前提需要知道如何区分查询的真与假,根据返回字符串内容不同。
例:—text-only=”Welcome !!!”
—titles=”Login”
注入技术
注入类型
—technique
检测存在sql注入的技术类型,默认会测试所有的方式。
B:Boolean-based-blind(布尔型型注入)
E:Error-based(报错型注入)
U:Union query-based(联合注入)
S:Starked queries(堆叠注入)
T:Time-based blind(基于时间的盲注)
Q:Inline queries(内联查询注入)设定盲注的延迟时间
—time-sec
基于时间的注入检测响应延迟时间(默认5秒)设定UNION查询字段数
—union-cols
默认联合查询1-10列,随-level增加最多支持50列
例如:—union-cols 6-9,测试6-9个字段数设定UNION查询使用的字符
—union-char
联合查询默认使用NULL,极端情况下NUL可能失败,此时可以手动指定数值
例如:—union-char 123设定UNION查询表
—union-from
在某些情况下,sqlmap需要设定union查询SQL注入的具体数据表才可以得到数据设置DNS攻击
—dns-domain “dns服务器”
针对目标网络很有可能有外部流量进行限制,或者设置WAF
通过设置DNS流量来突破限制,需要用户自身具有一个开放53端口的DNS服务器,通过DNS流量来获得web应用程序中的数据内容。二次注入
—second-url
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。
—second-url后面跟一个判断页面的URL地址。识别指纹
-f,—fingerprint
-b,—banner
数据库管理系统指纹信息
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
枚举信息
-a, --all 获取所有信息
-b, --banner 获取数据库管理系统的标识
--current-user 获取数据库管理系统当前用户
--current-db 获取数据库管理系统当前数据库
--hostname 获取数据库服务器的主机名称
--is-dba 检测DBMS当前用户是否DBA
--users 枚举数据库管理系统用户
--passwords 枚举数据库管理系统用户密码哈希
--privileges 枚举数据库管理系统用户的权限
--roles 枚举数据库管理系统用户的角色
--dbs 枚举数据库管理系统数据库
--tables 枚举的DBMS数据库中的表
--columns 枚举DBMS数据库表列
--schema 枚举数据库架构
--count 检索表的项目数
--dump 转储数据库表项
--dump-all 转储数据库所有表项
--search 搜索列(S),表(S)和/或数据库名称(S)
--comments 获取DBMS注释
--statements 检索在DBMS上运行的SQL语句
-D DB 要进行枚举的指定数据库名
-T TBL 枚举DBMS数据库表
-C COL 枚举DBMS数据库表列
-X EXCLUDECOL 不枚举的DBMS数据库标识符
-U USER 枚举DBMS用户
--exclude-sysdbs 枚举表时排除系统数据库
--pivot-column=P.. Pivot columnname
--where=DUMPWHERE Use WHEREcondition while table dumping
--start=LIMITSTART 获取第一个查询输出数据位置
--stop=LIMITSTOP 获取最后查询的输出数据
--first=FIRSTCHAR 第一个查询输出字的字符获取
--last=LASTCHAR 最后查询的输出字字符获取
--sql-query=QUERY 要执行的SQL语句
--sql-shell 提示交互式SQL的shell
--sql-file=SQLFILE 要执行的SQL文件
暴力破解
对于用sql注入无法爆出的数据库内容,可以使用暴力破解尝试着爆出数据库的内容。
1.暴力破解表名
—common-tables
mysql<5.0,没有information schema库
mysql<=5.0,但无权限读取information schema库
微软的access数据集,默认无权读取mysysobjects库
2.暴力破解列名
—common-columns
(access系统表无列信息)
暴力破解的表在txt/common-tables.txt文件中,列名在txt/common-columns.txt中。可以自行添加。
3.暴力破解文件
—common-files
文件系统访问
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。
读取系统文件
—file-read
—file-read=”文件绝对路径”
把文件上传到数据库服务器中
—file-write
—file-write=”123.txt” —file-dest “文件绝对路径”
--file-read=RFILE 从后端的数据库管理系统文件系统读取文件
--file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
--file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
操作系统访问
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。
那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认止),sqlmap会重新启用它,如果不存在,会自动创建。
—os-shell
—os-cmd
用—os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。
当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门。支持的语言:
1、ASP 2、ASP.NET 3、JSP 4、PHP
--os-cmd=OSCMD 执行操作系统命令(OSCMD)
--os-shell 交互式的操作系统的shell
--os-pwn 获取一个OOB shell,meterpreter或VNC
--os-smbrelay 一键获取一个OOBshell,meterpreter或VNC
--os-bof 存储过程缓冲区溢出利用
--priv-esc 数据库进程用户权限提升
--msf-path=MSFPATH MetasploitFramework本地的安装路径
--tmp-path=TMPPATH 远程临时文件目录的绝对路径
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 sqlmap会话文件保
sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。-t 记录流量文件保存位置
这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存到那里。—batch
用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。强制使用字符编码
—charset 强制字符编码
—charset=GBK / —charset=”0123456789abcde…”
不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定爬行网站URL
sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。
—crawl 从起始位置爬站深度
—batch—crawl=3刷新session文件
—flush-session 清空session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。自动获取form表单测试
—forms
如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过—data参数测试。 但是当使用—forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。忽略在会话文件中存储的查询结果
-fresh-quesries 忽略session查询结果使用DBMS的hex函数
—hex dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原分析和现实数据库内建报错信息
—parse-errors 将会分析和现实数据库内建报错信息
1 | -s SESSIONFILE 保存和恢复检索会话文件的所有数据 |
tamper中部分脚本
名称 | 功能 |
---|---|
apostrophemask.py | 用utf8代替引号 |
apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 |
appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 |
base64encode.py | 用base64编码替换 |
between.py | 用between替换大于号(>) |
bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句,然后替换=为like |
chardoubleencode.py | 双url编码(不处理以编码的) |
charencode.py | url编码 |
charunicodeencode.py | 字符串 unicode 编码 |
equaltolike.py | like代替等号 |
greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 |
halfversionedmorekeywords.py | 关键字前加注释 |
halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论 |
ifnull2ifisnull.py | 绕过对IFNULL过滤,替换类似’IFNULL(A,B)’为’IF(ISNULL(A), B, A)’ |
modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 |
multiplespaces.py | 围绕SQL关键字添加多个空格 |
randomcase.py | 随机大小写 |
randomcomments.py | 用/**/分割sql关键字 |
sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 |
space2comment.py | 用/**/代替空格 |
space2dash.py | 绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’) |
space2hash.py | 空格替换为#号,随机字符串以及换行符 |
space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 |
space2mssqlblank.py | (mssql)空格替换为其它空符号 |
space2mssqlhash.py | 替换空格 |
space2mysqlblank.py | 空格替换其它空白符号(mysql) |
space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) |
space2plus.py | 用+替换空格 |
space2randomblank.py | 代替空格字符(“”)从一个随机的空白字符可选字符的有效集 |
space2comment.py | 替换空格字符串(‘‘) 使用注释‘/**/’ |
unionalltounion.py | 替换UNION ALLSELECT UNION SELECT |
unmagicquotes.py | 宽字符绕过 GPCaddslashes |
versionedmorekeywords.py | 注释绕过 |