SqlMap概述及基础命令参数

1.1 任务描述

​ 如何提高进行SQL注入的效率?利用工具是一个很好的选择。SQLMap就是进行SQL注入的工具。

1.2 课程目标

➢了解SQLMap的原理、主要特点。

➢掌握SQLMap的安装。

1.3 SQLMap简介

1.3.1 SQLMap定义

​ SQLMap是开源的自动化SQL注入工具,由Python写成。它可以自动探测和利用SQL注入漏洞来接管数据库服务器,它配备了一个强大的探测引擎,为最终渗透测试人员提供很多功能,可以访问底层的文件系统,还可以通过带外连接执行操作系统上的命令。

1.3.2 SQLMap特点

1.3.2.1 支持的数据库类型

​ sqlmap完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。

1.3.3 SQLMap的可以测试的几个参数

​ sqlmap可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。

​ sqlmap可以测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

​ sqlmap也可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

1.3.3.1 支持的注入模式

​ sqlmap支持五种不同的注入模式:

​ 1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。

​ 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

​ 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

​ 4、联合查询注入,可以使用union的情况下的注入。

​ 5、堆查询注入,可以同时执行多条语句的执行时的注入。

1.3.3.2 其他

⚫在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。

⚫支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。

⚫支持自动识别密码哈希格式并通过字典破解密码哈希。

⚫支持多种下载模式,比如完全地下载某个数据库中的某个表,或者只下载某个表中的某几列,甚至只下载某一列中的部分数据均可以进行,这完全取决于用户的选择。

⚫支持在数据库管理系统中搜索指定的数据库名、表名或列名。

⚫部分情况下,即当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时,支持下载或上传文件。

⚫部分情况下,即当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时,支持执行任意命令并回现标准输出。

1.4 SQLMap参数说明

1.4.1 输出级别(Output verbosity)的参数

参数:-v。

​ Sqlmap的输出信息按从简到繁共分为7个级别,依次为0、1、2、3、4、5和6。使用参数“-v <级别>”来指定某个等级,如使用参数“-v 6”来指定输出级别为6。默认输出级别为1。各个输出级别的描述如下:

​ 0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];

​ 1:同时显示普通信息[INFO]和警告信息[WARNING];

​ 2:同时显示调试信息[DEBUG];

​ 3:同时显示注入使用的攻击荷载;

​ 4:同时显示HTTP请求;

​ 5:同时显示HTTP响应头;

​ 6:同时显示HTTP响应体。各个级别输出的信息详细到什么程度,还需要自己尝试下,亲眼见到,才会有明确的认识。

1.4.2 指定目标的参数

Sqlmap运行时必须指定至少一个目标,支持一次指定多个目标。有以下几种指定目标的方式:

1.4.2.1 直接连接数据库

参数:-d

​ 使用参数“-d”直接连接数据库,该参数后跟一个表示数据库的字符串,该字符串有以下两种格式:

​ (1).当数据库管理系统是MySQL、Oracle、Microsoft SQL Server或PostgreSQL等时格式为:DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME

​ (2).当数据库管理系统是SQLite、Microsoft Access或Firebird等时格式为:DBMS://DATABASE_FILEPATH

1.4.2.2 指定目标URL

参数:-u 或–url

​ 使用参数“-u”或“–url”指定一个URL作为目标,该参数后跟一个表示URL的字符串,可以是http协议也可以是https协议,还可以指定端口,如:python sqlmap.py -u “http://192.168.56.102:8080/user.php?id=0”

1.4.2.3 从Burp或WebScarab的代理日志中解析目标

参数:-l

​ 使用参数“-l”指定一个Burp或WebScarab的代理日志文件,Sqlmap将从日志文件中解析出可能的攻击目标,并逐个尝试进行注入。该参数后跟一个表示日志文件的路径。Burp默认不记录日志,想要记录日志需要手动开启,设置方法如下图所示:

image-20201021161832410

​ 只用勾选代理中的请求数据就足够了,日志文件路径可随意设置,这里我设置日志文件名为proxy.log,放在用户主目录中。

​ 设置浏览器的代理为Burp,随便浏览几个网页后发现proxy.log竟然已经有70多K大,查看其内容,部分输出如下:

image-20201021162150784

​ 可以看到该日志文件不仅记录了GET参数,还记录了cookie和POST参数。现在使用如下命令让Sqlmap解析该日志文件,自动寻找目标,检测注入漏洞:python sqlmap/sqlmap.py -l…/proxy.log

注意日志文件的路径要写正确。执行该命令时,每找到一个可能的攻击目标,Sqlmap都会询问是否要检测该目标,默认回答为“Y”,想要测试该目标,直接按回车键就行。

​ 当日志较大时会有很多可能目标,虽然有询问机制但依旧麻烦,因为不能一路按回车而要进行判断。若是可以对日志进行过滤就好了,sqlmap的确可以做到,参数为“–scope”。

1.4.3 指定HTTP请求细节的参数

​ HTTP是一个复杂的协议。HTTP请求有很多种方法(method),可以在不同位置(GET、POST、cookie和User-Agent等)携带不同参数。往往只有在特定位置携带了特定参数以特定方法发起的请求才是合法有效的请求。Sqlmap运行时除了需要指定目标,有时还需要指定HTTP请求的一些细节。下面这些参数都用于指定HTTP请求细节。

1.4.3.1 HTTP方法

参数:–method

​ 一般来说,Sqlmap能自动判断出是使用GET方法还是POST方法,但在某些情况下需要的可能是PUT等很少见的方法,此时就需要用参数“–method”来指定方法。如:“–method=PUT”。

1.4.3.2 POST数据

参数:–data

​ 该参数指定的数据会被作为POST数据提交,Sqlmap也会检测该参数指定数据是否存在注入漏洞。如:

​ python sqlmap.py -u “http://192.168.56.102:8080/user.php” --data=“id=0&name=werner”

1.4.3.3 指定分隔符

参数:–param-del

​ 上一个例子中“–data”的数据“id=0&name=werner”其实由两个部分组成:“id=0”和“name=werner”,默认地以“&”作为分隔符。我们可以使用“–param-del”来指定分隔符,如:

1.4.3.4 User-Agent

参数:–user-agent和–random-agent

​ 默认情况下Sqlmap发送的HTTP请求中的User-Agent值为:sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

​ 使用参数“–user-agent”可以指定一个User-Agent值。但正常的User-Agent值长什么样我们可能并不记得,所以有了参数“–random-agent”,使用该参数,Sqlmap会从文件./txt/user-agents.txt中随机地取一个User-Agent。

​ 注意,在一次会话中只有使用同一个User-Agent,并不是每发一个HTTP请求包,都随机一个User-Agent。当“–level”设置为3或更高时,Sqlmap会检测User-Agent是否存在注入漏洞。

1.4.3.5 Host

参数:–host

​ 使用该参数可以手动指定HTTP头中的Host值。当“–level”设置为5或更高时,Sqlmap会检测Host是否存在注入漏洞。

1.4.3.6 Referer

参数:–referer

​ 使用该参数可以指定HTTP头中的Referer值。Sqlmap发送的HTTP请求头部默认无Referer字段。当“–level”设置为3或更高时,Sqlmap会检测Referer是否存在注入漏洞。

1.4.3.7 cookie

参数:–cookie、–cookie-del、–drop-set-cookie和–load-cookies

有两种情况会用到这些参数:要测试的页面只有在登录状态下才能访问,登录状态用cookie识别。想要检测是否存在cookie注入当“–level”设置为2或更高时,Sqlmap会检测cookie是否存在注入漏洞。

1、“–cookie”和“–cookie-del”

​ 在浏览器中登录目标网站后复制出维持登录状态的cookie,用参数“–cookie”来指定这些cookie,如:python sqlmap.py -u “http://192.168.56.102:8080/user.php” --cookie "JSESSIONID=E5D6C8C81;NAME=werner;"与POST参数不同,cookie默认的分隔符为“;”,想要指定cookie中的分隔符,使用参数“–cookie-del”。

2、“–drop-set-cookie”

​ 若HTTP响应头中有“Set-Cookie”,Sqlmap会自动设置“Set-Cookie”设置的cookie,并对这些cookie进行检测。若不想让Sqlmap这么做,添加参数“–drop-set-cookie”即可,这样,Sqlmap会忽略“Set-Cookie”。

3、“–load-cookies”

​ 该参数用于从文件中载入Netscape或wget格式的cookie。wget可以保存和载入cookie,示例如下:

# Log in to the server.    
This can be done only once.wget--save-cookies cookies.txt \--post-data 'user=foo&password=bar' \http://server.com/auth.php# Now grab the page or pages we care about.wget--load-cookies cookies.txt \-p http://server.com/interesting/article.php
1.4.3.8 额外的HTTP头

参数:–headers

​ 使用该参数可以在Sqlmap发送的HTTP请求报文头部添加字段,若添加多个字段,用“\n”分隔。如命令:python sqlmap.py -u “http://192.168.56.101:8080/” -v 5 --headers “X-A:A\nX-B: B”

​ 发送的HTTP请求包为:

image-20201021174856268

​ 加参数“-v 5”是为了让Sqlamp输出发送的HTTP请求包,便于我们观察。

1.4.3.9 HTTP(S)代理

参数:–proxy、–proxy-cred、–proxy-file和–ignore-proxy

​ 使用参数“–proxy”来设置一个HTTP(S)代理,格式是“http(s)😕/url:port”。若代理需要认证,使用参数“–proxy-cred”来提供认证凭证,格式是“username:password”。

​ 使用参数“–proxy-file”指定一个存储着代理列表的文件,Sqlmap会依次使用文件中的代理,当某个代理有任何连接问题时就会被弃用而换下一个代理。

​ 使用参数“–ignore-proxy”忽略本地代理设置。

1.4.3.10 Tor匿名网络

参数:–tor、–tor-type、–tor-port和–check-tor

​ 不管出于什么原因,如果想要保持匿名状态与其使用单个的HTTP(S)代理,不如安装类似Privoxy这样的软件按照Tor的安装指导配置一个Tor客户端。设置好后使用参数“–tor”让Sqlmap自动设置使用Tor代理。

​ 如果想要手动指定Tor的类型和端口可以使用参数“–tor-type”和“–tor-port”,如:–tor-type=SOCKS5 --tor-port 9050

​ 如果要求高度的匿名性可以使用参数“–check-tor”,加上该参数后Sqlmap会确保所有流量都走Tor代理,若Tor代理失效,Sqlmap会发出警告并退出。检测方法是访问Are you using Tor?。

1.4.3.11 HTTP请求之间添加延迟

参数:–delay

​ 过于频繁地发送请求可能会被网站察觉或有其他不良后果。使用参数“–delay”来指定HTTP请求之间的延迟,单位为秒,类型是浮点数,如“–delay 1.5”表示延迟1.5秒。默认是没有延迟的。

1.4.3.12 超时

参数:–timeout

​ 超时时间默认为30秒,可以用参数“–timeout”指定超时时间,如“–timeout 44.5”表示设置超时时间为44.5秒。

1.4.3.13 超时后最大重试次数

参数:–retries

​ 超时后Sqlmap会进行重试,最大重试次数默认为3,可以用参数“–retries”指定最大重试次数。

1.4.3.14 用正则表达式过滤代理日志

参数:–scope

​ 指定一个Python正则表达式对代理日志进行过滤,只测试符合正则表达式的目标,如:python sqlmap.py -l burp.log --scope="(www)?.target.(com|net|org)"

1.4.3.15 避免错误请求过多而被屏蔽

参数:–safe-url、–safe-post、–safe-req和–safe-freq

​ 有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量错误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。有以下四个参数与这一机制有关:

​ –safe-url: 隔一会就访问一下的安全URL

​ –safe-post: 访问安全URL时携带的POST数据

​ –safe-req: 从文件中载入安全HTTP请求

​ –safe-freq: 每次测试请求之后都会访问一下的安全URL

​ 这里所谓的安全URL是指访问会返回200、没有任何报错的URL。相应地,Sqlmap也不会对安全URL进行任何注入测试。

1.4.3.16 绕过CSRF保护

参数:–csrf-token和–csrf-url

​ 现在有很多网站通过在表单中添加值为随机生成的token的隐藏字段来防止CSRF攻击,Sqlmap会自动识别出这种保护方式并绕过。但自动识别有可能失效,此时就要用到这两个参数。

​ “–csrf-token”用于指定包含token的隐藏字段名,若这个字段名不是常见的防止CSRF攻击的字段名Sqlmap可能不能自动识别出,需要手动指定。如Django中该字段名为“csrfmiddlewaretoken”,明显与CSRF攻击有关。

​ “–csrf-url”用于从任意的URL中回收token值。若最初有漏洞的目标URL中没有包含token值而又要求在其他地址提取token值时该参数就很有用。

1.4.4 优化SQLMap性能相关的参数

这些参数可以优化SQLMap的性能。

1.4.4.1 一键优化

参数:-o

​ 添加此参数相当于同时添加下列三个优化参数:

​ –keep-alive

​ –null-connection

​ –threads=3 (如果没有设置一个更好的值)

1.4.4.2 HTTP长连接

参数:–keep-alive

​ 该参数让Sqlmap使用HTTP长连接。该参数与“–proxy”矛盾。

1.4.4.3 HTTP空连接

参数:–null-connection

​ 有一种特殊的HTTP请求类型可以直接获得HTTP响应的大小而不用获得HTTP响应体。显然这在布尔型盲注中可以节约很大的带宽。当然这一技术是需要服务器端支持的。该参数与“–text-only”矛盾。

1.4.4.4 HTTP并发

参数:–threads

​ 使用该参数指定Sqlmap可以达到的最大并发数。从性能和网站承受能力两方面考虑最大并发数不要超过10。

1.4.5 注入相关的参数

​ 这些参数被用于指定要测试的参数、定制攻击荷载和选择篡改脚本。

1.4.5.1 要测试的注入点

参数:-p和–skip

​ 默认情况下Sqlmap会测试所有GET参数和POST参数,当level大于等于2时会测试cookie参数,当level大于等于3时会测试User-Agent和Referer。实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用。

​ 举个例子,若想只测试GET参数“id”和User-Agent,则可以这么写:-p "id,user-agent"如果不想测试某一参数则可以使用“–skip”。如设置了level为5但不想测试User-Agent和Referer,则可以这么写:–level=5 --skip=“user-agent,referer”。有时会遇到伪静态网页。动态网页会明目张胆地列出参数,如:/user.php?id=1。显然参数是id,值为1。但若是伪静态网页则可能这样写:/user/1/将参数隐藏在URL中。

​ 通常情况下Sqlmap不会对这样的伪静态网页的参数做测试,因为Sqlmap无法判断哪个是参数。若想要对这样的伪静态进行测试,只需要加上“”,告诉Sqlmap哪个是伪静态参数就行,剩下事的和GET参数没有什么区别。如:python sqlmap.py -u "http(s)😕/target.cc/user/1/"

1.4.5.2 指定数据库管理系统

参数:–dbms

​ dbms是“Database Management System”的缩写。默认情况下Sqlmap会自动检测网站使用的数据库管理系统,Sqlmap支持以下这些数据库管理系统:

⚫MySQL

⚫Oracle

⚫PostgreSQL

⚫Microsoft SQL Server

⚫Microsoft Access

⚫Firebird

⚫SQLite

⚫Sybase

⚫SAP MaxDB

⚫DB2

​ 如果Sqlmap自动检测失败或是不想让Sqlmap进行数据库指纹检测,可以使用参数“–dbms”手动指定数据库管理系统,如:“–dbms postgresql”。

​ 对于Mysql和Microsoft SQL Server和要这样指定:

–dbms MySQL

–dbmsMicrosoft SQL Server

​ 对于MySQL来说,是类似这样的:5.0。对于Microsoft SQL Server来说,是类似这样的:2005。

​ 如果在添加“–dbms”参数的同时还添加了“–fingerprint”,Sqlmap只会在指定的数据库管理系统内进行指纹识别。

​ 注:只有在很确定时使用“–dbms”,否则还是让Sqlmap自动检测更好些。

1.4.5.3 指定运行数据库管理系统的操作系统

参数:–os

​ 默认情况下Sqlmap会自动检测运行数据库管理系统的操作系统,目前完全支持的操作系统有:

⚫Linux

⚫Windows

要这样指定:

–dbms MySQL

–dbmsMicrosoft SQL Server

​ 对于MySQL来说,是类似这样的:5.0。对于Microsoft SQL Server来说,是类似这样的:2005。

​ 如果在添加“–dbms”参数的同时还添加了“–fingerprint”,Sqlmap只会在指定的数据库管理系统内进行指纹识别。

​ 注:只有在很确定时使用“–dbms”,否则还是让Sqlmap自动检测更好些。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐