【超详细】安全测试===sqlmap使⽤⼼得(零)
零、前⾔
这篇⽂章是学习Sqlmap的⽤法时做的笔记,记录了Sqlmap的常见、基础⽤法。
⼀、Sqlmap是什么
Sqlmap是开源的⾃动化SQL注⼊⼯具,由Python写成,具有如下特点:
完全⽀持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。
完全⽀持布尔型盲注、时间型盲注、基于错误信息的注⼊、联合查询注⼊和堆查询注⼊。
在数据库证书、IP地址、端⼝和数据库名等条件允许的情况下⽀持不通过SQL注⼊点⽽直接连接数据库。
⽀持枚举⽤户、密码、哈希、权限、⾓⾊、数据库、数据表和列。
⽀持⾃动识别密码哈希格式并通过字典破解密码哈希。
⽀持完全地下载某个数据库中的某个表,也可以只下载某个表中的某⼏列,甚⾄只下载某⼀列中的部分数据,这完全取决于⽤户的选择。
⽀持在数据库管理系统中搜索指定的数据库名、表名或列名
当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时⽀持下载或上传⽂件。
当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时⽀持执⾏任意命令并回现标准输出。
⼆、安装Sqlmap
Sqlmap的开源项⽬,托管在github,最简单的安装⽅式便是使⽤git,执⾏如下命令:
git clone github/sqlmapproject/sqlmap.git
⽚刻后命令执⾏完毕,可以看到当前⽬录中多了⼀个名为“sqlmap”的⽬录,该⽬录中保存着Sqlmap的Python源码、配置⽂件和⽂档。由于Python是解释执⾏的语⾔,不⽤编译,所以⾄此最新版的Sqlmap已经安装完成。 cd
到“sqlmap”⽬录中,⽤命令“python sqlmap”启动Sqlmap,如下图所⽰:
当想要更新Sqlmap时,进⼊到“sqlmap”⽬录中执⾏命令“git pull”即可。
三、输出级别(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响应体。
各个级别输出的信息详细到什么程度,还需要⾃⼰尝试下,亲眼见到,才会有明确的认识。
四、指定⽬标
Sqlmap运⾏时必须指定⾄少⼀个⽬标,⽀持⼀次指定多个⽬标。有以下⼏种指定⽬标的⽅式:
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
我⽤如下命令连接装在本机上的Mysql:
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/DISSchool"
却出现了错误,错误为:
[CRITICAL] sqlmap requires 'python-pymysql' third-party library in order to directly connect to the DBMS 'MySQL'. You can download it from 'github/petehunt/PyMySQL/'. Alternative is to use a package 'python-sqlalchemy' with support for dialect 'mysq 意思是我没有安装Python连接Mysql⽤的第三⽅库python-pymysql。虽然我安装了python-mysqldb可以使Python连接Mysql,但显然Sqlmap使⽤的是python-pymysql⽽不是python-mysqldb。使⽤如下命令安装python-pymysql:
git clone github/petehunt/PyMySQL/
cd PyMySQL/
sudo python setup.py install
安装好python-pymysql后再执⾏命令:
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/DISSchool"
这次没有报错,成功的连接到了数据库。只是除了检测数据库确实是Mysql版本号⼤于等于5.0.0之外便什么都没有做。让Sqlmap做点什么需要⽤其他参数指定,这些参数我们稍晚些再学习。
2.指定⽬标URL
参数:-u 或 --url
使⽤参数“-u”或“--url”指定⼀个URL作为⽬标,该参数后跟⼀个表⽰URL的字符串,可以是http协议也可以是https协议,还可以指定端⼝,如:
python sqlmap.py -u "192.168.56.102:8080/user.php?id=0"
3.从Burp或WebScarab的代理⽇志中解析⽬标
参数:-l
使⽤参数“-l”指定⼀个Burp或WebScarab的代理⽇志⽂件,Sqlmap将从⽇志⽂件中解析出可能的攻击⽬标,并逐个尝试进⾏注⼊。该参数后跟⼀个表⽰⽇志⽂件的路径。
WebScarab我没有⽤过,Burp倒是常常会⽤。Burp默认不记录⽇志,想要记录⽇志需要⼿动开启,设置⽅法如下图所⽰:
只⽤勾选代理中的请求数据就⾜够了,⽇志⽂件路径可随意设置,这⾥我设置⽇志⽂件名为proxy.log,放在⽤户主⽬录中。
设置浏览器的代理为Burp,随便浏览⼏个⽹页后发现proxy.log竟然已经有70多K⼤,查看其内容,部分输出如下:
werner@Yasser:~$ more proxy.log
======================================================
7:22:52 PM  ocsp.digicert:80  [117.18.237.29]
======================================================
POST / HTTP/1.1
Host: ocsp.digicert
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-SG,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Length: 83
Content-Type: application/ocsp-request
DNT: 1
Connection: close
0Q0O0M0K0I0  +
�ǝ​��Pr�Tz�
======================================================
======================================================
7:23:00 PM  blog.csdn:80  [47.95.49.160]
======================================================
GET /pyufftj/article/details/21469201 HTTP/1.1
Host: blog.csdn
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
...
可以看到该⽇志⽂件不仅记录了GET参数,还记录了cookie和POST参数。现在使⽤如下命令让Sqlmap解析该⽇志⽂件,⾃动寻⽬标,检测注⼊漏洞:
python sqlmap.py -l ../proxy.log
注意⽇志⽂件的路径要写正确。执⾏该命令时,每到⼀个可能的攻击⽬标,Sqlmap都会询问是否要检测该⽬标。,默认回答为“Y”,想要测试该⽬标,直接按回车键就⾏。
当⽇志较⼤时会有很多可能⽬标,虽然有询问机制但依旧⿇烦,因为不能⼀路按回车⽽要进⾏判断。若
是可以对⽇志进⾏过滤就好了!确实是可以的,参数为“--scope”,详情见“五.18”。
4.从站点地图⽂件中解析⽬标
参数:-x
为便于搜索引擎收录,许多⽹站专门为搜索引擎⽣成了xml格式的站点地图,如[百度Sitemap⽀持xml格式][Sitemap_xml]。Sqlmap可以直接解析xml格式的站点地图,从中提取攻击⽬标,对⼀个⽹站全⽅位⽆死⾓地进⾏注⼊检测,此时使⽤的参数是“-x”,如:
python sqlmap.py -x www.l
但执⾏该命令的结果却是:
[WARNING] no usable links found (with GET parameters)
没有到有GET参数的可⽤链接。就我有限的经验⽽⾔,站点地图中的URL很少包含GET参数,POST参数就更不⽤说了。所以Sqlmap的这⼀功能似乎有些鸡肋。
5.从⽂本⽂件中解析⽬标
参数:-m
参数“-u”⼀次只能指定⼀个URL,若有多个URL需要测试就显得很不⽅便,我们可⽤将多个URL以⼀⾏⼀个的格式保存在⽂本⽂件中,然后使⽤参数“-m”,后跟该⽂本⽂件路径,让Sqlmap依次读取⽂件中的URL作为攻击⽬标。
如我们有⽂件,内容为:
www.target1/vuln1.php?q=foobar
www.target2/vuln2.asp?id=1
www.target3/vuln3/id/1*
然后可⽤使⽤如下命令让Sqlmap测试这些URL是否存在注⼊漏洞:
python sqlmap.py -
同样,执⾏该命令时,Sqlmap会很贴⼼地⼀个个询问:“do you want to test this URL?”
6.从⽂件载⼊HTTP请求
参数:-r
可以将⼀个HTTP请求保存在⽂件中,然后使⽤参数“-r”加载该⽂件,Sqlmap会解析该⽂件,从该⽂件分析⽬标并进⾏测试。
设有如下所⽰的HTTP请求保存在⽂件中:
GET /user.php?id=1 HTTP/1.1
Host: 192.168.56.101:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-SG,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
则使⽤如下命令让Sqlmap解析该⽂件,以该⽂件中HTTP请求⽬标为攻击⽬标进⾏测试:
python sqlmap.py -
7.将Google搜索结果作为攻击⽬标
参数:-g
Sqlmap能⾃动获取Google搜索的前⼀百个结果,对其中有GET参数的URL进⾏注⼊测试。当然,所处的⽹络环境要能访问Google才⾏。下⾯是Sqlmap⼿册中“-g”参数的例⼦:
python sqlmap.py -g "inurl:\".php?id=1\""
jsessionid8.从配置⽂件中载⼊攻击⽬标
参数:-c
使⽤参数“-c”指定⼀个配置⽂件(如:f),Sqlmap会解析该配置⽂件,按照该配置⽂件的配置执⾏动作。配置⽂件中可以指定攻击⽬标,实际上除了攻击⽬标外,配置⽂件还可以指定各种参数的
值。
Sqlmap的按照⽬录中有⼀个名为f的⽂件,该⽂件是配置⽂件的模板,看看该⽂件内容,就能明⽩配置⽂件是什么意思了。
五、请求
HTTP是⼀个复杂的协议。HTTP请求有很多种⽅法(method),可以在不同位置(GET、POST、cookie和User-Agent等)携带不同参数。往往只有在特定位置携带了特定参数以特定⽅法发起的请求才是合法有效的请求。Sqlmap 运⾏时除了需要指定⽬标,有时还需要指定HTTP请求的⼀些细节。下⾯这些参数都⽤于指定HTTP请求细节。
1.HTTP⽅法
参数:--method
⼀般来说,Sqlmap能⾃动判断出是使⽤GET⽅法还是POST⽅法,但在某些情况下需要的可能是PUT等很少见的⽅法,此时就需要⽤参数“--method”来指定⽅法。如:“--method=PUT”。
2.POST数据
参数:--data
该参数指定的数据会被作为POST数据提交,Sqlmap也会检测该参数指定数据是否存在注⼊漏洞。如:
python sqlmap.py -u "192.168.56.102:8080/user.php" --data="id=0&name=werner"
3.指定分隔符
参数:--param-del
上⼀个例⼦中“--data”的数据“id=0&name=werner”其实由两个部分组成:“id=0”和“name=werner”,默认地以“&”作为分隔符。我们可以使⽤“--param-del”来指定分隔符,如:
python sqlmap.py -u "192.168.56.102:8080/user.php" --data="id=0;name=werner" --param-del=";"
参数:--cookie、--cookie-del、--drop-set-cookie和--load-cookies
有两种情况会⽤到这些参数:
要测试的页⾯只有在登录状态下才能访问,登录状态⽤cookie识别
想要检测是否存在cookie注⼊
当“--level”设置为2或更⾼时,Sqlmap会检测cookie是否存在注⼊漏洞,关于“--level”的更多信息见下⽂。
(1).“--cookie”和“--cookie-del”
在浏览器中登录⽬标⽹站后复制出维持登录状态的cookie,⽤参数“--cookie”来指定这些cookie,如:
python sqlmap.py -u "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 -- \
--post-data 'user=foo&password=bar' \
server/auth.php
# Now grab the page or pages we care about.
wget -- \
-p server/interesting/article.php
5.User-Agent
参数:--user-agent和--random-agent
默认情况下Sqlmap发送的HTTP请求中的User-Agent值为:
sqlmap/1.0-dev-xxxxxxx ()
使⽤参数“--user-agent”可以指定⼀个User-Agent值。但正常的User-Agent值长什么样我们可能并不记得,所以有了参数“--random-agent”,使⽤该参数,Sqlmap会从⽂件./中随机地取⼀个User-Agent。注意,在⼀次会话中只有使⽤同⼀个User-Agent,并不是每发⼀个HTTP请求包,都随机⼀个User-Agent。
⽤如下命令统计⾏数:
cat sqlmap/ | wc -l
结果为4211,当然其中还包含空⾏、注释等,但总的来说该⽂件中存储的User-Agent也有4千多个。
当“--level”设置为3或更⾼时,Sqlmap会检测User-Agent是否存在注⼊漏洞,关于“--level”的更多信息见下⽂。
6.Host
参数:--host
使⽤该参数可以⼿动指定HTTP头中的Host值。
当“--level”设置为5或更⾼时,Sqlmap会检测Host是否存在注⼊漏洞,关于“--level”的更多信息见下⽂。
7.Referer
参数:--referer
使⽤该参数可以指定HTTP头中的Referer值。Sqlmap发送的HTTP请求头部默认⽆Referer字段。
当“--level”设置为3或更⾼时,Sqlmap会检测Referer是否存在注⼊漏洞,关于“--level”的更多信息见下⽂。
8.额外的HTTP头
参数:--headers
使⽤该参数可以在Sqlmap发送的HTTP请求报⽂头部添加字段,若添加多个字段,⽤“\n”分隔。如命令:
python sqlmap.py -u "192.168.56.101:8080/" -v 5 --headers "X-A:A\nX-B: B"
发送的HTTP请求包为:
GET / HTTP/1.1
X-B: B
Host: 192.168.56.101:8080
Accept-encoding: gzip,deflate
X-A: A
Accept: */*
User-agent: sqlmap/1.1.10#stable ()
Connection: close
加参数“-v 5”是为了让Sqlamp输出发送的HTTP请求包,便于我们观察。
9.⾝份认证
参数:--auth-type和--auth-cred
这些参数⽤于进⾏⾝份认证。“--auth-type”⽤于指定认证⽅式,⽀持以下三种⾝份认证⽅式:
Basic
Digest
NTLM
“--auth-cred”⽤于给出⾝份认证的凭证,格式是“username:password”。
如:
python sqlmap.py -u "192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
10.基于证书的⾝份认证
参数:--auth-file
若Web服务器要求客户端提供证书则可以使⽤此参数指定⼀个PEM格式的证书⽂件。我们知道SSL协议的客户端认证是可选的,实践中⼀般都只⽤服务器端提供⾃⼰的证书供客户端验证,很少要求客户端提供⾃⼰的证书。
11.忽略401
参数:--ignore-401
使⽤该参数忽略401错误(未认证)。
12.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”忽略本地代理设置。
13.Tor匿名⽹络
参数:--tor、--tor-type、--tor-port和--check-tor
不管出于什么原因,如果想要保持匿名状态与其使⽤单个的HTTP(S)代理,不如安装类似Privoxy这样的软件按照[Tor的安装指导][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?][Are you using Tor]。
14.HTTP请求之间添加延迟
参数:--delay
过于频繁地发送请求可能会被⽹站察觉或有其他不良后果。使⽤参数“--delay”来指定HTTP请求之间的延迟,单位为秒,类型是浮点数,如“--delay 1.5”表⽰延迟1.5秒。默认是没有延迟的。
15.超时
参数:--timeout
超时时间默认为30秒,可以⽤参数“--timeout”指定超时时间,如“--timeout 44.5”表⽰设置超时时间为44.5秒。
16.超时后最⼤重试次数
参数:--retries
超时后Sqlmap会进⾏重试,最⼤重试次数默认为3,可以⽤参数“--retries”指定最⼤重试次数。
17.随机化参数值
参数:--randomize
使⽤该参数,Sqlmap会随机⽣成每次HTTP请求中参数的值,值的类型和长度依照于原始值。
18.⽤正则表达式过滤代理⽇志
参数:--scope
指定⼀个Python正则表达式对代理⽇志进⾏过滤,只测试符合正则表达式的⽬标,如:
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
19.避免错误请求过多⽽被屏蔽
参数:--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进⾏任何注⼊测试。
20.关闭URL编码
参数:--skip-urlencode
Sqlmap默认会对URL进⾏URL编码,可以使⽤该参数关闭URL编码。
21.绕过CSRF保护
参数:--csrf-token和--csrf-url
现在有很多⽹站通过在表单中添加值为随机⽣成的token的隐藏字段来防⽌CSRF攻击,Sqlmap会⾃动识别出这种保护⽅式并绕过。但⾃动识别有可能失效,此时就要⽤到这两个参数。
“--csrf-token”⽤于指定包含token的隐藏字段名,若这个字段名不是常见的防⽌CSRF攻击的字段名Sqlmap可能不能⾃动识别出,需要⼿动指定。如Django中该字段名为“csrfmiddlewaretoken”,明显与CSRF攻击有关。“--csrf-url”⽤于从任意的URL中回收token值。若最初有漏洞的⽬标URL中没有包含token值⽽⼜要求在其他地址提取token值时该参数就很有⽤。
22.强制使⽤SSL
参数:--force-ssl
23.在每次请求前执⾏特定Python代码
参数:--eval
直接看例⼦:
python sqlmap.py -u "www.target/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
每次返送请求前,Sqlmap都会依据id值重新计算hash值并更新GET请求中的hash值

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。