当前位置: 博客首页>> 网络安全 >> 阅读正文

SQLmap的使用

作者: 分类: 网络安全 发布于: 2024-06-24 11:22:14 浏览:1,254 评论(0)


官方网站:sqlmap

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

SQLmap简介

Sqlmap是一款开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令。

运行的数据库有:

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

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

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

下载及安装

(1)linux下git直接安装

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
python sqlmap.py --update # 更新
python sqlmap.py -hh # 查看帮助信息

(2)windows下安装

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

(3)kali默认安装sqlmap

参数详解

Target:目标

-u URL, --url=URL 目标URL (e.g."http://www.site.com/vuln.php?id=1"),使用-u或者-
-url
-d DIRECT 直接连接数据库的连接字符串
-l LOGFILE 从Burp或者WebScarab代理日志文件中分析目标
-x SITEMAPURL 从远程网站地图(sitemap.xml)文件来解析目标
-m BULKFILE 将目标地址保存在文件中,一行为一个URL地址进行批量检测。
-g GOOGLEDORK 从谷歌中加载结果目标URL(只获取前100个结果,需要挂代理)
-c CONFIGFILE 从配置ini文件中加载选项
-r REQUESTFILE 从文件加载HTTP请求,sqlmap可以从一个文本文件中获取HTTP请求,这样就可
以跳过设置一些其他参数(比如cookie,POST数据,等等),请求是HTTPS的时需要配合这个--forcessl参数来使用,或者可以在Host头后门加上:443

目标url

参数:-u或者--url

格式:http(s)://targeturl[:port]/[…]

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

从文本中获取多个目标扫描

参数: -m

文件中保存url格式如下,sqlmap会一个一个检测

www.example.com/vuln1.php?q=student
www.example.com/vuln2.asp?id=1
www.example.com/vuln3/id/1*

从文件中加载http请求

sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。

GET /vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
Host: 10.0.0.152:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
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.7
Referer: http://10.0.0.152:8080/vulnerabilities/sqli/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low
Connection: close

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

.\sqlmap.py -r 'D:\tools\dvwa.txt' -a -p 'id' --batch

Request: 请求设置

--method:指定请求方法
--data:把数据以POST方式提交
--param:当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数
--cookie:设置cookie,提交请求的时候附带所设置的cookie
--load-cookies:从文件获取cookie
--user-agent:可以使用–user-anget参数来修改
--headers:可以通过–headers参数来增加额外的http头
--proxy:设置代理,可以避免本机地址被封禁
--delay:可以设定两个HTTP(S)请求间的延迟 防止发送过快导致被封ip
--random-agent:使用–random-agnet参数来随机的从./txt/user-agents.txt中获取。当–level
参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。
--referer:在请求目标的时候可以自己伪造请求包中的referer
–-level参数设定为3或者3以上的时候会尝试对referer注入。

参数:--data

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

例子:

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

利用正则过滤目标网址

参数:--scope

例如:

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

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

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

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

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

Optimization:优化

-o 开启所有优化开关

Injection:注入

-p:设置想要测试的参数
--skip:不想要测试的参数可以通过 skip设置跳过
--dbms:指定数据库 节省sqlmap自己检测的时间
--os:指定数据库服务系统 节省sqlmap自己检测的时间
--tamper:使用sqlmap自带的tamper(脚本),或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。

测试参数

参数:-p, --skip

sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Refer头的值。但是你可以手动用-p参数设置想

要测试的参数。

例如: -p "id,user-anget"

当你使用--level的值很大但是有个别参数不想测试的时候可以使用--skip参数。

例如:--skip="user-agent,referer"

在有些时候web服务器使用了伪静态,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*

例如:

sqlmap.py -u "http://magedu/param1/value1*/param2/value2/"

sqlmap将会测试value1的位置是否可注入。

指定数据库服务器系统

参数:--os

默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

Detection:探测等级

--level=LEVEL 执行测试的等级(1-5,默认为1)
--risk:(*慎用此参数有风险), 共有四个风险等级(0-3),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

探测等级

参数:--level

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

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

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

常用 --level=3

风险等级

参数:--risk

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

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

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

不要在生产上使用 --rist=3建议默认即可

Enumeration:枚举数据

-a, --all 获取所有信息
-b, --banner 获取数据库管理系统的标识
--current-user 获取数据库管理系统当前用户
--current-db 获取数据库管理系统当前数据库
--hostname 获取数据库服务器的主机名称
--is-dba 检测DBMS当前用户是否DBA(数据库管理员)
--users 枚举数据库管理系统用户
--passwords 枚举数据库管理系统用户密码哈希
--privileges 枚举数据库管理系统用户的权限
--roles 枚举数据库管理系统用户的角色
--dbs 枚举数据库管理系统数据库
--tables 枚举的DBMS数据库中的表
--columns 枚举DBMS数据库表列
--schema 枚举数据库架构
--count 检索表的项目数
--dump 转储数据库表项,即下载
--dump-all 转储数据库所有表项
--search 搜索列(S),表(S)和/或数据库名称(S)
--comments 获取DBMS注释
-D DB 要进行枚举的指定数据库名
-T TBL DBMS数据库表枚举
-C COL DBMS数据库表列枚举
-X EXCLUDECOL DBMS数据库表不进行枚举
-U USER 用来进行枚举的数据库用户
--exclude-sysdbs 枚举表时排除系统数据库
--pivot-column=P.. Pivot columnname
--where=DUMPWHERE Use WHEREcondition while table dumping
--start=LIMITSTART 获取第一个查询输出数据位置
--stop=LIMITSTOP 获取最后查询的输出数据
--first=FIRSTCHAR 第一个查询输出字的字符获取
--last=LASTCHAR 最后查询的输出字字符获取
--sql-query=QUERY 要执行的SQL语句
--sql-shell 提示交互式SQL的shell
--sql-file=SQLFILE 要执行的SQL文件

标志

参数:-b,--banner

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

当前用户

参数:-current-user

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

当前数据库

参数:--current-db

返还当前连接的数据库。

当前用户是否为管理员

参数:--is-dba

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

列出数据库管理用户

参数:--users

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

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

参数:--passwords

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

sqlmap.py -u "http://example.com?id=1" --passwords -v1

列出数据库管理员权限

参数:--privileges

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

列出数据库管理员角色

参数:--roles

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

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

列出数据库系统的数据库

参数:--dbs

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

列举数据库表

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

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

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

--exclude-sysdbs参数是指可排除系统数据库。

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

列举数据库表中的字段

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

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

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

Brute force:爆破

--common-tables 检查存在共同表
--common-columns 检查存在共同列
User-defined function injection(用户自定义函数注入):
--udf-inject 注入用户自定义函数
--shared-lib=SHLIB 共享库的本地路径

File system access:访问文件系统

--file-read=RFILE 从后端的数据库管理系统读取文件
--file-write=WFILE 上传文件到后端的数据库管理系统
--file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

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

参数:--file-read

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

sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' -p 'id' --file-read '/etc/passwd'

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

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

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

sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' -p id --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' --file-write='D:\tools\dvwa.txt' --file-dest='/var/www/html/dvwa.txt'

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 远程临时文件目录的绝对路径

获取整个表的数据

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

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

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

sqlmap.py -u "http://example.com?id=1" --dump -T users

获取所有数据库表的内容

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

使用--dump-all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs排除系统数据库,只获取用户数据库的表,即业务数据。

运行自定义的SQL语句

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

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

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

sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' -p id --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' --sql-query "select * from users"

## 命令行交互
sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' -p id --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' --sql-shell

运行任意操作系统命令

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

sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' -p id --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' --os-shell --batch

可直接命令行交互执行

爬行网站URL

参数:--crawl

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

例子:

sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --crawl=3

定义dump数据的格式

参数:--dump-format

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

自定义输出的路径

参数:--output-dir

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

实际利用(dvwa)

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

1、判断可注入的参数
2、判断可以用那种SQL注入技术来注入
3、识别出哪种数据库
4、根据用户选择,读取哪些数据

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数

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

技巧:在实际检测过程中,sqlmap会不停的询问,需要手工输入Y/N来进行下一步操作,可以使用参数“--batch”命令来自动答复和判断

打印user表中的用户名和密码:

sqlmap.py -u 'http://10.0.0.152:8080/vulnerabilities/sqli/?id=1&Submit=Submit#' -p id --cookie='PHPSESSID=btd0be1spoj3cdt9g3rnp8gva4; security=low' -D dvwa -T users -C last_name,password --dump --batch
       

转载时请注明出处及相应链接。

本文永久链接: https://blog.baigei.com/articles/sqlmap-use