SQLMap

目录

查看数据库的所有用户(--users)]

查看数据库当前用户(--current-user)]

判断当前用户是否有管理权限(--is-dba

列出数据库管理员角色(--roles)

查看所有的数据库(--dbs)

查看当前的数据库(--current-db)

爆出指定数据库中的所有的表

探测指定URL是否存在WAF,并且绕过

指定脚本进行绕过(--tamper)

探测等级和危险等级(--level --risk)

执行指定的SQL语句(--sql-shell)

执行操作系统命令(--os-shell)

反弹一个MSF的shell(--os-pwn)

上传文件到数据库服务器中(--file-write --file-dest)

简介

sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等

Sqlmap采用了以下5种独特的SQL注入技术

  • 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入

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

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

  • 联合查询注入,在可以使用Union的情况下注入

  • 堆查询注入,可以同时执行多条语句时的注入

Sqlmap的强大的功能包括 数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时执行任意命令。

sqlmap是一个跨平台的工具,很好用,是SQL注入方面一个强大的工具!

我们可以使用 -h 参数查看sqlmap的参数以及用法,sqlmap -h

sqlmap默认的User-Agent:sqlmap/1.1.9.22#dev (http://sqlmap.org)

Sqlmap的简单用法

查看数据库的所有用户(--users)

查看数据库所有用户名的密码(--passwords)

查看数据库当前用户(--current-user)

查看当前的数据库(--current-db)

爆出指定数据库中的所有的表

爆出指定数据库指定表中的所有的列

爆出指定数据库指定表指定列下的数据

Sqlmap的高级用法

Sqlmap在默认情况下除了适用CHAR()函数防止出现单引号,没有对注入的数据进行修改。我们可以使用--tamper参数对数据进行修改来绕过WAF等设备,其中的大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。Sqlmap目前官方提供53个绕过脚本。

探测指定URL是否存在WAF,并且绕过

指定脚本进行绕过(--tamper)

有些时候网站会过滤掉各种字符,可以用tamper来解决(对付某些waf时也有成效)

过滤脚本在目录:/usr/share/sqlmap/tamper

探测等级和危险等级(--level --risk)

Sqlmap一共有5个探测等级,默认是1。等级越高,说明探测时使用的payload也越多。其中5级的payload最多,会自动破解出cookie、XFF等头部注入。当然,等级越高,探测的时间也越慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。在不确定哪个参数为注入点时,为了保证准确性,建议设置level为5

sqlmap一共有3个危险等级,也就是说你认为这个网站存在几级的危险等级。和探测等级一个意思,在不确定的情况下,建议设置为3级,--risk=3

sqlmap使用的payload在目录:/usr/share/sqlmap/xml/payloads

伪造 Http Referer头部

Sqlmap可以在请求中伪造HTTP中的referer,当探测等级为3或者3以上时,会尝试对referer注入,可以使用referer命令来欺骗,比如,我们伪造referer头为百度。可以这样

执行指定的SQL语句(--sql-shell)

然后会提示我们输入要查询的SQL语句,注意这里的SQL语句最后不要有分号

执行操作系统命令(--os-shell)

在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。

当为MySQL数据库时,需满足下面三个条件:

  • 当前用户为 root

  • 知道网站根目录的绝对路径

  • 该数据库的 secure_file_priv 参数值为空(很多数据库的该值为NULL,这也就导致了即使当前用户是root,即使知道了网站根目录的绝对路径,也不能执行成功 --os-shell )

选择网站的脚本语言

  • 【1】ASP(默认)

  • 【2】ASPX

  • 【3】JSP

  • 【4】PHP

您是否希望sqlmap进一步尝试引发完整路径的披露?【Y/n】

选择判断网站可写目录的方法

如果我们不知道网站的根目录的绝对路径的话,我们那里选择 4 暴力破解,尝试破解出根目录的绝对路径。这里因为是我们本地的环境,已经知道网站根目录的绝对地址了,所以选择 2

  • 【1】使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)

  • 【2】自定义网络根目录绝对路径

  • 【3】指定自定义的路径文件

  • 【4】暴力破解

可以看到,其实执行os-shell的过程中,sqlmap向网站根目录写入两个文件 tmpblwkd.php 和 tmpueqch.php。真正的木马文件是tmpblwkd.php 。如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入 x 或 q 退出 sqlmap 时,该文件才会被自动删除。

反弹一个MSF的shell(--os-pwn)

在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。并且需要当前获取的权限足够高才可以。

选择连接的tunnel,这里选择默认的 1 就可以了 [1] TCP: Metasploit Framework (default) [2] ICMP: icmpsh - ICMP tunneling

1

选择网站的脚本语言,这里根据情况选择 [1] ASP [2] ASPX [3] JSP [4] PHP (default)

4

选择网站的路径,这里也是根据情况而定,如果知道网站路径的话,可以选择2然后手动输入 [1] common location(s) ('C:/xampp/htdocs/, C:/wamp/www/, C:/Inetpub/wwwroot/') (default) [2] custom location(s) [3] custom directory list file [4] brute force search

2 please provide a comma separate list of absolute directory paths: C:\phpstudy\WWW

然后选择连接的类型,这里选择默认的1 即可

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] Reverse HTTP: Connect back from the database host to this machine tunnelling traffic over HTTP [4] Reverse HTTPS: Connect back from the database host to this machine tunnelling traffic over HTTPS [5] Bind TCP: Listen on the database host for a connection

1

然后还会提示监听的地址和端口,这里直接回车即可

然后这里选择payload的类型,我们这里选择默认的1

which payload do you want to use?nt to use? [11563] ' (detected)] [1] Meterpreter (default) [2] Shell [3] VNC

1

执行完成后,如果不出问题,我们就可以获得一个MSF类型的shell了。

读取服务器文件(--file-read)

当数据库为MySQL、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。

可以看到,文件读取成功了,并且保存成了 /root/.sqlmap/output/192.168.10.1/files/c__test.txt 文件

上传文件到数据库服务器中(--file-write --file-dest)

当数据库为MySQL、Postgre SQL或者Sql Server(通过powershell写入),并且当前用户有权限向任意目录写文件的时候,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。

所以利用上传文件,我们可以上传一句话木马或者上传shell上去。

前提是我们知道网络的绝对路径

这里会问我们是否想验证上传成功,我们选择 y 的话,他就会读取该文件的大小,并且和本地的文件大小做比较,只要大于等于本地文件大小即说明上传功能了

最后更新于

这有帮助吗?