我的编程空间,编程开发者的网络收藏夹
学习永远不晚

DVWA全级别详细通关教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

DVWA全级别详细通关教程

目录

暴力破解——Brute Force

low

Medium

High

Impossible

 命令注入——Command Injection

 low

 Medium

 High

 Impossible

 CSRF——跨站请求伪造

low

Medium

High

Impossible

文件包含——File Inclusion

         low

 ​Medium

 High

 Impossible

 文件上传——File Upload

low

Mediun

High

Impossible

SQL注入——SQL Injection

low

Medium

High

Impossible

反射型XSS

low

Medium

High

Impossible

存储型XSS

DOM型XSS

 low

Medium

High

Impossible


暴力破解——Brute Force

low

直接用burpsuite抓包暴力破解

可以手工SQL注入(万能密码),在用户名框中输入admin' or '1'='1

代码审计一下

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysqli_query()函数执行某个针对数据库的查询。 //die() 函数输出一条消息,并退出当前脚本。if( $result && mysqli_num_rows( $result ) == 1 ) {//mysqli_num_rows() 函数返回结果集中行的数量 //mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组。 // Get users details$row = mysqli_fetch_assoc( $result );$avatar = $row["avatar"];// Login successful$html .= "

Welcome to the password protected area {$user}

";$html .= "";}else {// Login failed$html .= "

Username and/or password incorrect.
";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}?>

需要满足$result && mysqli_num_rows( $result ) == 1才能登录成功

当 admin'or'1'='1 ,则 $query="SELECT * FROM `users` WHERE user = '$admin'or'1'='1' AND password = '$pass';"

可以满足$result && mysqli_num_rows( $result ) == 1

Medium

跟low差不多,直接用burpsuite抓包暴力破解

相比low级别,medium增加了 mysqli_real_escape_string()函数,这个函数会对字符串中的特殊符号,如:x00、\n、\r、\、'\、"、\x1a进行转义,基本可以抵御sql注入。

但是,没有加入有效的防爆破机制,还是可以用burpsuite爆破。

High

抓包查看 ,发现有token,用token机制来遏制暴力破解,增加了爆破的难度

关于Token机制的工作原理(不会画图,勉强看)

利用burpsuite中的“宏”(macro)机制来完成爆破

burpsuite抓包,发送到intruder,选中密码和Token,设置攻击模式

线程为1(为了防止暴力破解,服务端总是单线程,单会话会分配Token)

重定向设为“总是”(总共4次对话,才完成登录认证,所以需要重定向)

在grep-extract中点击add,选择refetch response(获取回复)

复制Token值

设置有效负载,第一个参数是密码,导入字典

 第二个参数是Token,将刚刚复制的Token值粘贴进来

 

 开始爆破,爆破完后,数字不同即为结果

Impossible

 impossible级别的代码加入了可靠的放爆破机制,当检测到频繁错误登录后,系统会将账户锁定,爆破也就无法继续。(当用户登录失败达到3次,将会锁住账号15秒)

同时采用了更为安全的PDO(PHP Data Object)机制防御SQL注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而SQL注入的关键就是通过破坏SQL语句结构执行恶意的SQL命令

 命令注入——Command Injection

命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。

 low

 输入127.0.0.1

有乱码,将文件dvwaPage.inc.php中的utf-8改成gb2312

 

 

变正常了

 

代码审计

{$cmd}
";}?>

 这里使用了两个和安全无关的函数

stristr(string,search,before,search),搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分,如果没找到,返回false。

php_uname(mode),返回运行php的操作系统的相关描述。

Medium

查看代码,设置了黑名单,过滤了&&和;

可以使用&或者|之类的连接符绕过

 High

查看代码,high级别进一步完善了黑名单,但是因为黑名单的局限性,我们依然可以绕过

 Impossible

 查看代码,impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格限制,只有像“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

 CSRF——跨站请求伪造

csrf(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie,会话),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害者不知情的情况下,以受害者身份向服务器发送请求,从而完成非法操作。(如转账、改密、发帖等)

low

 这是一个修改密码的页面,修改试试,修改成功,并且是以get方式传输的

从有源码中,可以知道,服务器收到修改密码的请求后,会检查参数$pass_new与$pass_conf是否相同,如果相同就会修改密码,并且没有任何的防csrf机制

我们就直接在URL中修改内容,看是否能执行成功。

修改内容后,复制这个新URL重新打开一个界面,如下图

(必须使用同一个浏览器,因为在访问页面时通常存在cookie认证,否则即使点击了恶意链接也没用。)

 之前修改的密码为123456,现在在URL上,改成了abcd,验证一下是否密码被改成了abcd

admin/abcd,登录成功

admin/123456 ,登陆失败 (所以是可以修改成功的)

 

 我们可以准备一架“僚机”,就是互联网上经过伪装的另外的网站

这里使用了在本地搭建的另外一个网站,在里面写入一个攻击页面,诱骗受害者去访问

完成csrf攻击的条件:受害者处于登录,保持会话的状态,诱骗受害者点击恶意构造的页面

(通常是给受害者发送一个链接,而在正常的情况下我们通常不会点击一个很长的看起来就不正常的链接,所以我们可以利用短链接来进行伪装)

这是当受害者点击后的状态,页面被伪装成“404”,密码已经被修改

 去验证下,密码是否修改,修改前为abcd,修改后为qqqq(登陆成功,成功修改了密码)

 Medium

直接修改url,提示请求错误

抓包发现referer

查看源码,medium级别中检查了保留HTTP_REFERER(HTTP包头的referer参数值,表示来源地址)中是否包含SERVER_NAME(HTTP中的host参数)

过滤规则是,http包头中的referer必须包含“主机名”

将僚机上的攻击页面命名为[SERVER_NAME].html,然后诱骗受害者点击,referer应该为http://僚机网站ip/被攻击者网站ip.html,包含了host字段

还可以直接在http包头添加referer:http://(包含主机名)

High

发现添加了token验证

查看源码,high级别加入了token机制,当用户访问修改密码页面时,服务器会返回一个随机token,向服务器发起请求时,需要提交token,服务器接收请求时会先检查token,只有token正确,才处理请求。

 如果要绕过这个机制,就要获取token,利用受害者的cookie去修改密码

在存储型XSS中txtname框输入以下语句,因为有字数限制,所以需要拦截后更改。

txtName=