DVWA靶场通关(2023)

Brute Force

1.

这道题是爆破用户名,以及密码,其实就是通过burp软件来爆破

抓包成功!

接下来爆破

修改这两个值,进行爆破,正确导入字典后,开始爆破.

因为已经知道了答案,我们可以让爆破的数量少一点,

 找到数量不一致的,得到结果

2.

第二种,主要区别在于我们必须休眠两秒,才能继续.所以

让它休眠2000ms就欧克了

为了方便,我就将正确答案置于了顶端,可以发现,我们的爆破可以保证全为200的状态码

3.

第三题,通过查询得到,主要增加了token值,这个东西 

从源代码中,可以得知,我们每次登陆一次就会产生一个token值,在开头会有一个检查的过程,所以要绕过这个东西就需要变换爆破方式:

其实就是需要每一个密码都找到对应的token值

添加密码和token值为载荷:

选择pitchfork爆破

上面是分辨特征模块

选择递归搜索,输入第一次的token值,开始爆破,注意只能单线程而且时间需要在3000ms左右

 

得到答案

Command Injection

1.这个题,需要我们输入一个ip地址

当我们输入127.0.0.1时,我们可以发现:

获得了这样一个ping命令的结果,所以,我们现在将它绕过,通过逻辑运算符

& :前面一个命令无论是否执行,后面的命令都能执行,两个命令都执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行后,才能执行后面一个命令

这里我们使用   |  就可以了.

任意命令都可以输入了!

2题和3题都是一样,只是添加了几个黑名单:

但是,|加了一个空格,所以,一样的都可以直接使用|

Cross Site Request Forgery (CSRF)

1.

这个题的目的是不通过本身题目给出的地方更改密码,而是通过了解更改密码的步骤,从其他地方进入更改密码的阶段.

我们可以看到,我们需要更改密码,顶上的url就会变化:

所以我们如果新建一个空页面,以这个格式来进行更改密码:

首先我们先做一个诱导的网站按钮

burp上抓包后可以直接复制简易代码

 

点击后,就可以更改密码了

2....

File Inclusion

1.

首先,我们可以看见此题是通过get传参来完成访问文件的,同时,经过实验发现,后缀不是php的会原封不动的打开文件,而php结尾的文件会正常执行.我们首先创建一个文件,让其访问这个文件如果可以打开,就说明可以执行我们需要的代码

执行成功!

2.

通过观察源代码,我们可以发现,他过滤了http://", "https://,../", "..\\的过滤

但是我们的文件中没有,所以无影响.

3.

现在发现找不到了,返回看源代码.

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

这段代码告诉我们,必须以file开头,所以,我们可以使用file协议

file 协议是一种用于访问本地文件系统资源的URL协议。它允许通过URL来引用计算机上的本地文件

file:///path/to/your/file.txt
于是,我们只需要在我们文件路径以前加上file://就可以了

File Upload

1.首先准备一个PHP文件(可以承载一句话木马),里面任意来一句php代码就可以了

直接就成功上传了.

2.

要求我们上传一个jpeg或png格式的文件,我们可以做一张图片马,因为dvwa靶场中有文件包含的题,满足条件,

然后我们上传一下:

乱码加上执行phpinfo()函数说明成功了,但是注意,源代码中的图片不允许超过10000字节,否则上传不成功!

3.

3题看了源代码后发现同样可以这样做出来,同样是上传一个图片马,与二题解题过程完全一致!

Vulnerability: SQL Injection

1.

可以看见,输入1 and 1=2 不会报错,确定是字符型,需要闭合,

输入1",不会报错,而输入1'报错了,确定闭合类型为单引号.

order by run出列数.

跑到第3列报错了,说明只有3列

database()跑出数据库名.

.....

Vulnerability: SQL Injection (Blind)

1.

没有特别的回显,观察源代码只出现exists和missing,确定需要盲注

首先确定数据库的长度:

1' and length(database())>10 #----------MISSING

1' and length(database())>5 #----------MISSING

1' and length(database())>3 #----------exists

1' and length(database())>4 #----------MISSING

确定数据库长度为4.

输入语句(SUBSTR(string, start, length)),分别找到每一个字符

1' and ascii(substr(database(),1,1))>97#

exits

库名的第一个字符大于a

1' and ascii(substr(database(),1,1))<122#

exits

库名的第一个字符小于z

1' and ascii(substr(database(),1,1))<104#

exits

库名的第一个字符小于h

1' and ascii(substr(database(),1,1))<100#

MISSING

库名的第一个字符不小于d

1' and ascii(substr(database(),1,1))<101#

exits

库名的第一个字符小于f

1' and ascii(substr(database(),1,1))=100#

exits

库名的第一个字符等于d.

最后得到数据库名为dvwa

获得表的个数:

1' and (select  count(table_name) from information_schema.tables where table_schema='dvwa')=2#

获得两个表的长度

1' and length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1))=9#
1' and length((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1))=5#

然后判断字段个数

1' and (select count(column_name) from information_schema.columns where table_schema='dvwa' and table_name= 'users') =8#

.......

这时候可以猜测字段名为"username","password"啥的,也可以继续通过limit,substr判断长度和字符

综上所述,实际上简单的盲注就是在简单的sql注入中,通过先猜长度,再通过ascll码判断每一个字母

2.

2题禁止了我们输入

但是我们可以通过burp抓包,然后更改,过程与1题一致.

3.

 这里跳出来一个窗口进行验证,观察源码可以知道有一个LIMIT 1限制一次查询的限制,但是我们不用管,因为我们每次输入都会加上#,所以不影响,同时我们还可以看见有一个sleep(),在出现MISSING后,也没关系,我们上面的还是可以用,只是错了会延迟小几秒.

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {
    // Get input
    $id = $_COOKIE[ 'id' ];
    $exists = false;

    switch ($_DVWA['SQLI_DB']) {
        case MYSQL:
            // Check database
            $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ); // Removed 'or die' to suppress mysql errors

            $exists = false;
            if ($result !== false) {
                // Get results
                try {
                    $exists = (mysqli_num_rows( $result ) > 0); // The '@' character suppresses errors
                } catch(Exception $e) {
                    $exists = false;
                }
            }

            ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
            break;
        case SQLITE:
            global $sqlite_db_connection;

            $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
            try {
                $results = $sqlite_db_connection->query($query);
                $row = $results->fetchArray();
                $exists = $row !== false;
            } catch(Exception $e) {
                $exists = false;
            }

            break;
    }

    if ($exists) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // Might sleep a random amount
        if( rand( 0, 5 ) == 3 ) {
            sleep( rand( 2, 4 ) );
        }

        // User wasn't found, so the page wasn't!
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }
}

?>

Vulnerability: Weak Session IDs

1.

这里是cookie值是弱保密

我们直接抓包

 发现phpsessid没变,dvwasession递增,从而得知规律,于是我们直接复制cookie,退出登录,无密码登陆

2.

通过源代码可以发现,通过时间来生产dvwaSession

时间戳在线转换工具

用这个工具转化一下,其余步骤一致,

3.

源代码与1题类似,但是多出来了一步md5加密,我们也将dvwaSession  md5加密了就OK

Vulnerability: DOM Based Cross Site Scripting (XSS)

1.

先看源码,啥也没有,再看url

 出现default的参数,我们直接将其改为出现一个弹窗<script>alert(1)</script>

2.

由于代码过滤掉了 <script ,所以我们尝试输入</select><img src=x οnerrοr=alert(1)>
(onerror 事件在加载外部文件(文档或图像)发生错误时触发,所以当图片的src属性值不存在时,会触发alert()警告消息框)前提需要闭合select

3.

看源代码,通过switch函数将不是选项外的所有全过滤了,

但是它只检查了default参数,只需要用&,上传两个参数上去就欧克

English&<script>alert(1)</script>.

Vulnerability: Reflected Cross Site Scripting (XSS)

1.

我们随便输入一个数字,直接就输出了

所以我直接输入<script>alert(1)</script> 

直接就跑出来了.

2.

源代码出现:

str_replace( '<script>', '', $_GET[ 'name' ] );

我们可以大写绕过

 3.

preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] )

通过正则表达式匹配,将<script>中出现的全替换为' '.

所以,,我们用刚刚使用过的<img src="#" οnerrοr=alert(1)>   onerror事件就可以了.

Vulnerability: Stored Cross Site Scripting (XSS)

1.

trim() 函数移除字符串两侧的空白字符或其他预定义字符。返回已修改的字符串。

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。

输入数据储存,没有过滤和检查

所以直接输入 <script>alert(1)</script> 尝试

2.

注意name有长度限制,message的过滤太严格,我们从name角度出发,只需要大写绕过就可以了

3.

name的过滤,全是针对<script>标签的,所以我们直接用其它标签就可以了

比如onerror事件<img src="#" οnerrοr=alert(1)> .

Vulnerability: Content Security Policy (CSP) Bypass

1.

从源代码可以找到可以执行的外部站点

https://pastebin.com/raw/R570EE00 https://www.toptal.com/developers/hastebin/raw/cezaruzeka

访问过后,pastebin是一个可以将js代码包裹进去的文本编译器,

img编辑

在这上面可以携带我们的代码,跑出链接,然后返回靶场包裹即可.

2.

unsafe-inline:当csp有Unsafe-inline时, 并且受限于csp无法直接引入外部js, 不过当frame-src为self, 或者能引入当前域的资源的时候, 即有一定可能能够引入外部js。nonce-source,仅允许特定的内联脚本块。

所以我们直接输入源码中注释的内容就可以了 <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>。

img编辑

3......

Vulnerability: JavaScript Attacks

1.

通过输入不同的内容抓包两次,发现token值都是一致的.

img编辑

img编辑

通过观察源代码,可以发现

img编辑 经过了两次加密,但是token值不变,说明是前端生成的,所以,我们打开控制台,先在输入框输入success,再在控制台运行函数,提交成功!

img编辑

2.

生成token的函数放在单独的js文件中,生成的方式是将XX+phrase+XX字符串反过来作为token

我们通过抓包success

img编辑

还是changeme,说明还是前端,于是我们输入success,控制台运行函数,成功!

img编辑

3.

看到js是乱码,需要使用还原工具得到还原后的关键代码如下

function do_something(e) { for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n]; return t } function token_part_3(t, y = "ZZ") { document.getElementById("token").value = sha256(document.getElementById("token").value + y) } function token_part_2(e = "YY") { document.getElementById("token").value = sha256(e + document.getElementById("token").value) } function token_part_1(a, b) { document.getElementById("token").value = do_something(document.getElementById("phrase").value) } document.getElementById("phrase").value = ""; setTimeout(function() { token_part_2("XX") }, 300); document.getElementById("send").addEventListener("click", token_part_3); token_part_1("ABCD", 44);

方法:

输入框输入success,控制台依次执行 token_part_1("ABCD", 44) 和 token_part_2("XX"),最后点击提交执行token_part_3()

img

成功.

Vulnerability: Authorisation Bypass

1.

登陆他给的账号发现没有了刚刚的页面

 没有任何过滤,也就是,只要输入url,谁都可以访问页面.

直接接上vulnerabilities/authbypass/

可以看见,旁边没有选项,但是页面出现了.

2.

可以看见源代码有过滤,必须用户名是admin

尝试直接访问/vulnerabilities/authbypass/get_user_data.php以浏览返回的用户数据.

3.

.......

Open HTTP Redirect

1.

源代码就是一个简单的判断get传参的redirect是否存在,存在就会重定向的指定网站

可以看到,源代码的路径

只需要输入这个路径,再给redirect传参即可 

2.

源代码 加入了对路径是否为绝对路径的判断

代码阻止我使用绝对 URL 将用户带离网站,因此可以使用相对 URL 将他们带到同一网站上的其他页面,也可以使用相对于协议的 URL。

输入url浏览http://dvwa2/vulnerabilities/open_redirect/source/medium.php?redirect=//digi.ninja

3.

源代码只检查了,参数里面是否有字符串info.php

因为百度是一个搜索引擎,我们可以直接在百度搜索info.php,也就是我们所需要的字符串给输进去

出现一串url    https://www.baidu.com/s?wd=info.php

因为没有对绝对路径的剥离,所以满足条件只需要?redirect=https://www.baidu.com/s?wd=info.php即可!!!!(真是太nb了)

run出来了!!!! 

  • 50
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值