一、DVWA简介

Damn Vulnerable Web Application

用来进行安全脆弱性鉴定的PHP/MySQL Web 应用,

旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,

帮助web开发者更好的理解web应用安全防范的过程。

十个攻击模块,分别是:

1、Brute Force(暴力(破解))、

2、Command Injection(命令行注入)、

3、CSRF(跨站请求伪造)、

4、- File Inclusion(文件包含)、

5、File Upload(文件上传)、

6、Insecure CAPTCHA (不安全的验证码)、

7、SQL Injection(SQL注入)、

8、SQL Injection(Blind)(SQL盲注)、

9、XSS(Reflected)(反射型跨站脚本)、

10、XSS(Stored)(存储型跨站脚本)。

包含了 OWASP TOP10 的所有攻击漏洞的练习环境,一站式解决所有 Web 渗透的学习环境。

靶机源码的安全级别,分别为

Low,Medium,High,Impossible,

级别越高,安全防护越严格,渗透难度越大。

二、DVWA安装

由于DVWA 是 PHP/MySQL 的源码环境,所以需要准备 PHP 和 MySQL 的运行环境。

(1)使用PHP study。

PHPStudy 是一个 PHP 调试环境的程序集成包。该程序包集成最新的 LAMP 和 WAMP 架构,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该软件提供 Windows 和 Linux 的版本。

安装环境所需工具下载地址:

-PHP study:小皮面板(phpstudy) – 让天下没有难配的服务器环境! (xp.cn)

-DVWA:digininja/DVWA: Damn Vulnerable Web Application (DVWA) (github.com)或

https://link.zhihu.com/?target=https%3A//github.com/ethicalhack3r/DVWA/archive/master.zip

(2)使用docker。

docker安装:(13条消息) docker安装and常用命令_net1996的博客-CSDN博客

浏览器网址栏输入:IP:端口号

三、csrf漏洞简介

(1)Cross-site request forgery,跨站请求伪造,也被称为“One Click Attack”或者Session Riding。一种常见的web攻击。在场景中,攻击者会伪造一个请求(通常是一个链接),然后欺骗目标用户点击,用户一旦点击,攻击也就完成了。

(2)CSRF漏洞是因为web应用程序在用户进行敏感操作时,如修改账号密码、添加账号、转账等,没有校验表单token或者http请求头中的referer值,从而导致恶意攻击者利用普通用户的身份(cookie)完成攻击行为。

(3)一次CSRF攻击的过程中,受害者需要依次完成两个步骤 :

1.登录受信任网站A,并在本地生成Cookie 。

2.在A的cookie存活期内,访问危险网站B。

四、csrf漏洞练习

登录DVWA,第一次需要创建数据库,登录DVWA 账号密码:admin/password。

(1)low

①更改难度:点击dvwa security,选择难度,然后点击submit完成更改

②分析

首先分析一下服务器核心源码:

GET方式得到三个参数,change、password_new、password_conf。如果password_new和password_conf相同,那么更新数据库,并没有任何防CSRF的措施。这里我们有多重攻击方式,比如直接构造链接、构造短链接和构造攻击页面。

③攻击

构造攻击页面:

通过img标签中的src属性来加载CSRF攻击利用的URL,并进行布局隐藏,实现了受害者点击链接则会将密码修改。

构造的页面test.html如下:

404

file not found.

(www.dvwa.com 换为自己的IP)

将test.html文件放在攻击者自己准备的网站上:

当受害者正在使用自己的网站(浏览器中还保存着session值)时,访问攻击者诱惑点击的此链接:

http://www.hack.com/test.html

误认为是自己点击的是一个失效的url:

但实际上已经遭受了CSRF攻击,密码已经被修改为test。

(2)medium

①分析:

相关函数介绍:

stripos()函数:

stripos(string,find,start)

stripos()函数查找字符串在另一字符串中第一次出现的位置,不区分大小写。

PHP超全局变量$_SERVER中的两个值:

$_SERVER[‘HTTP_REFERER’]:PHP中获取链接到当前页面的前一页面的url链接地址,即HTTP数据包中的Referer参数的值。

$_SERVER[‘SERVER_NAME’]:PHP中获取服务器主机的名称,即HTTP数据包中的Host参数的值。

用户正常登录使用修改密码操作时,可以看到:

Medium Security Level的代码使用stripos()函数检查HTTP头,过滤规则是$_SERVER[‘HTTP_REFERER’]的值中必须包含$_SERVER[‘SERVER_NAME’],以此来抵御CSRF攻击。

②攻击

将Low Security Level第三种方法中的攻击页面test.html复制一份,命名为www.dvwa.com.html,

我们还是按照之前的操作,先诱惑受害者点击http://www.hack.com/test.html,抓包,并发送到Repeater中:

执行失败,出现:That request didn’t look correct.

此时让受害者访问www.dvwa.com.html文件,即在Repeater中修改HTTP数据包中的Referer参数为:

http://www.hack.com/www.dvwa.com.html

成功修改了密码。

(3)high

①分析

可以看到,High Security Level的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。

②攻击

要绕过High Security Level的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。

试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。

xss.js:

alert(document.cookie);var theUrl = 'http://www.dvwa.com/vulnerabilities/csrf/';if(window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();}else{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}var count = 0;xmlhttp.withCredentials = true;xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState ==4 && xmlhttp.status==200){var text = xmlhttp.responseText;var regex = /user_token\' value\=\'(.*" />

xss.js放置于攻击者的网站上:http://www.hack.com/xss.js

③DOM XSS 与 CSRF 结合:

CSRF结合同Security Level的DOM XSS,通过ajax实现跨域请求来获取用户的user_token,用以下链接来让受害者访问:

http://www.dvwa.com/vulnerabilities/xss_d/?default=English #

诱导点击后,成功将密码修改为test。

(4)Impossible等级

impossible等级页面已经发生了变化,需要用户输入当前密码才能够修改密码,简单粗暴可以完全确保当前用户是本人,从而防止了CSRF漏洞。