DVWA学习笔记

原来装的DVWA没有认认真真地做一遍,靶场环境也有点问题了,到github上面重新下载了一遍:https://github.com/ethicalhack3r/DVWA

复习常见的高危漏洞,产生,利用,防范的方法

DVWA靶场在本地的搭建不再赘述,网上有很多优秀的博客

将级别设置为Low 

第一个模块是Brute Force,暴力破解模块

当输入错误的账号密码时,页面会返回错误信息

 当输入正确的账号密码时,页面会返回正确信息

 使用burpsuite抓包之后暴力破解账号密码

因为我们不知道账号和密码,所以使用burpsuite->intruder->Cluster bomb选项,对账号密码两个参数进行爆破

但是这样的做法不足之处在于,所有的尝试次数=字典用户名数量X字典密码数量,用户名和密码的数量稍微大一点,运行次数就会非常大,所以在真实环境中,我们尽量手动先对用户名进行测试,查看页面的报错信息,有很多网站都会显示是用户名错误,还是密码错误,以此来判断用户名是否存在,再对存在的用户名专门进行密码爆破,减少了很多不必要的工作量

 使用burpsuite自带的用户名和密码字典,其组合数量都达到了三千多万,所以在真实环境中尽量不要采用用户名和密码同时爆破的方法。

这里为了快速看到结果,我改为了爆破账号为admin的密码

 根据返回包的不同相应判断密码是否正确,这里可以看到当密码为password的时候返回包长度为4755,可知密码就是password

Request id为0的那个是我第一次登陆的时候,直接设置密码为password,所以也成功登录。

查看Low级别的Brute Force的源代码

<?php

if( isset( $_GET[ 'Login' ] ) ) {
    // Get username
    $user = $_GET[ 'username' ];

    // Get password
    $pass = $_GET[ 'password' ];
    $pass = md5( $pass );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];

        // Login successful
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // Login failed
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

  可以看到将我们GET输入的账号和md5加密后的密码放入了SQL查询语句进行查询,除此之外没有对登录点进行任何防御,还有这一句

$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";

  可以看到这一句是存在SQL注入漏洞的,我们也可以使用万能密码在登录点进行登录,如构造:

 

 密码构造如 admin' or '1'='1#,密码随便输入,即可绕过密码进行登录

第二个模块是Command Injection,命令注入

 这种题目在CTF比赛中遇到过,这里是我们先输入一个ip地址,服务器会为我们ping这个IP地址

 先复习一下命令注入的基础知识

​ 命令注入攻击最初被称为Shell命令注入攻击,是由挪威一名程序员在1997年意外发现的。第一个命令注入攻击程序能随意地从一个网站删除网页,就像从磁盘或者硬盘移除文件一样简单。 ——百度百科
命令注入通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!DedeCMS等都曾经存在过该类型漏洞  

  在命令注入中有很多的特殊符号可以进行利用,达到绕过黑名单和执行任意命令的效果。

管道符 | :连结上个指令的标准输出,做为下个指令的标准输入。

后台工作&: 当要把命令放在后台执行时,在命令的后面加上&,注意是放在完整指令列的最后端,如linux下使用tar进行文件压缩的时候,可能用时会比较长,我们就可以将其放入后台执行:

tar cvfz data.tar.gz data > /dev/null&

逻辑符号&& : 表示and的逻辑符号,当前一个命令执行成功之后,就执行&&后的一条命令

逻辑符号 || : 表示 or 的逻辑符号,当前一个命令执行失败之后,才执行||后的一条命令

在linux和windows下都可以使用&&符号进行命令的连续执行

在这里我们服务器是windows的,所以输入 

127.0.0.1 && dir

  

 可以看到不仅执行了ping 127.0.0.1的命令,还显示了当前文件夹下的文件,实现了命令注入

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?> 

  查看命令注入 low级别的后端PHP代码

 在使用php_uname('s')函数判断了我们的操作系统之后,使用shell_exec函数执行ping 我们输入ip地址的命令,我们输入了恶意数据之后,执行的命令变为了

ping 127.0.0.1 && dir

  从而达到了命令注入的效果。

第三个模块是Cross Site Request Forgery (CSRF)

CSRF即跨站请求伪造,也就是可以劫持其他用户去进行一些请求,其危害的严重性由当前这个请求是什么操作来决定

(长更)

猜你喜欢

转载自www.cnblogs.com/Cl0ud/p/12624868.html