DWVA-XSS部分练手闯关

前言

关于XSS基础内容请查看:https://www.cnblogs.com/xhds/p/12239527.html

实验平台采用DWVA  v1.10

XSS(Reflected)反射性XSS漏洞

XSS( Reflected)

Vulnerability: Reflected Cross Site Scripting (XSS)

1.low

<?php
header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) {
    echo ‘<pre>Hello ‘ . $_GET[ ‘name‘ ] . ‘</pre>‘;
}
?> 

分析代码 不存在任何过滤直接输入:<script>alert("xiaohua2020");</script>

成功弹窗!

2.medium

<?php
header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) {
    //这里有个str_replace()函数 匹配<script>如果匹配到则替换成空
    $name = str_replace( ‘<script>‘, ‘‘, $_GET[ ‘name‘ ] );
    echo "<pre>Hello ${name}</pre>";
}
?> 
看代码前先学一个函数str_replace(find,replace,string,count)返回带有替换值的字符串或数组。
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。对替换数进行计数的变量。
那么我们思考过滤了直接输入<script>alert("xiaohua2020");</script> 是不行的 所以思考怎么才能绕过这个过滤1.大小写绕过<Script>alert("xiaohua2020");</script>2.双写绕过<scrip<script>t>alert(/xss/)</script>3.使用别的标签绕过<img src=0 onerror=alert(/xss1/)>

3.high

<?php 

header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) {
    // 注意看这里preg_replace()进行模式匹配过滤
    $name = preg_replace( ‘/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i‘, ‘‘, $_GET[ ‘name‘ ] );
    echo "<pre>Hello ${name}</pre>";
} 

?> 

preg_replace()函数执行一个正则表达式的搜索和替换

利用非script标签绕过

<img src=0 onerror=alert(/xss1/)>

<iframe onload=alert("111")></iframe>

4.impossible

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );
    //利用htmlspecialchars()函数进行HTML诗体过滤
    $name = htmlspecialchars( $_GET[ ‘name‘ ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

xss(DOM) dom型XSS

XSS(DOM)

Vulnerability: DOM Based Cross Site Scripting (XSS)

1.LOW

<?php
header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) {
    echo ‘<pre>Hello ‘ . $_GET[ ‘name‘ ] . ‘</pre>‘;
}
?> 

不存在任何过滤直接利用!

payload:http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<script>alert("xiaohua2020");</script>

成功出发弹窗!

2.medium

 1 <?php
 2
 3 if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ ‘default‘ ]) ) {
 4     $default = $_GET[‘default‘];
 5   //这里有个过滤stripos()在$defautl中查找<script如果查找到了执行if里面的内容
 6     if (stripos ($default, "<script") !== false) {
 7         header ("location: ?default=English");
 8         exit;
 9     }
10 }
11
12 ?> 

这段代码首先4行接收数据到$default中,重点在stripos()这个函数 这个函数在$default中查找<script如果查找到了返回真 真!=false 则执行if里面的内容 否则不执行 我们要想办法使stripos返回真而且我们的恶意代码还能植入进去!

stripos(string,find,start)函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定开始搜索的位置。
既然过滤了script我们可以用别的标签<img src=0 onerror=alert(/xss1/)>payload:http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<img src=0 onerror=alert(/xss1/)>然而跟我们的预期不一样没有弹出 我们代码审查下发现我们植入的恶意代码被放在option标签里卖弄的额value里面了所以没有出发 所以我们继续要构造新的语法
构造过程构造语法试了"></option><img src=0 onerror=alert(/xss1/)><option value=" 不行因为泵在select标签里面执行所以我们要重新构造跳出select标签"></option></select><img src=0 onerror=alert(/xss1/)><select><option value="payload:http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default="></option></select><img src=0 onerror=alert(/xss1/)><select><option value="成功弹出弹窗!

3.high

<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ ‘default‘ ]) ) {
    # White list the allowable languages
    switch ($_GET[‘default‘]) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
} 

?> 

这里设置了白名单过滤仅让case里面的内容通过

我们可以利用#绕过url中有一个字符为# #在php中为注释字符所以注释后面的数据不会发送给服务器端,从而绕过服务端过滤构造语法未为:

#"></option></select><img src=0 onerror=alert(/xss1/)><select><option value="

payload:http://101.201.65.164/DVWA/vulnerabilities/xss_d/?default=French#"></option></select><img src=0 onerror=alert(/xss1/)><select><option value="

成功弹窗!

  3.impossible

<?php

# Don‘t need to do anything, protction handled on the client side#后端不要做任何事保持在客户端处理即可

?> 

xss(Stored)存储型XSS漏洞

xss(Stored)

Vulnerability: Stored Cross Site Scripting (XSS)

1.LOW

<?php 

if( isset( $_POST[ ‘btnSign‘ ] ) ) {
    // Get input
    $message = trim( $_POST[ ‘mtxMessage‘ ] );
    $name    = trim( $_POST[ ‘txtName‘ ] ); 

    // stripslashes()删除$message中的反斜杠
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( ‘$message‘, ‘$name‘ );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( ‘<pre>‘ . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ‘</pre>‘ );

    //mysql_close();
} 

?> 

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

输入 <script>alert("xiaohua2020");</script>

成功弹窗!

2.Medium

<?php
if( isset( $_POST[ ‘btnSign‘ ] ) ) {
    // Get input
    $message = trim( $_POST[ ‘mtxMessage‘ ] );
    $name    = trim( $_POST[ ‘txtName‘ ] ); 

    // addslashes()函数为预定义符号加斜杠  strip_tages()剥取html、PHP等标签
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message ); 

    // Sanitize name input
    $name = str_replace( ‘<script>‘, ‘‘, $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( ‘$message‘, ‘$name‘ );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( ‘<pre>‘ . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ‘</pre>‘ );

    //mysql_close();
} 

?> 

strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

看到$message被多次过滤而$name值未过滤我们可以通过$name传递,前端限制了$name长度我们可以通过审查元素增加它的长度

提交得到弹窗!

3.high

<?php 

if( isset( $_POST[ ‘btnSign‘ ] ) ) {
    // Get input
    $message = trim( $_POST[ ‘mtxMessage‘ ] );
    $name    = trim( $_POST[ ‘txtName‘ ] ); 

    //

    //strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

    //addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
   //htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。   $message = htmlspecialchars( $message ); 

    // preg_replace()过滤
    $name = preg_replace( ‘/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i‘, ‘‘, $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( ‘$message‘, ‘$name‘ );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( ‘<pre>‘ . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ‘</pre>‘ );

    //mysql_close();
} 

?> 

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

上面三个函数都是对$messag进行过滤

preg_replace()正则匹配对$name进行过滤 所以我们想办法绕过$name这边的过滤就OK

3.impossible

<?php

if( isset( $_POST[ ‘btnSign‘ ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );

    // Get input
    $message = trim( $_POST[ ‘mtxMessage‘ ] );
    $name    = trim( $_POST[ ‘txtName‘ ] );

    // message部分输入经过stripslashes()删除反斜杠 htmlspecialchars()html实体两大过滤
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // name部分也经过strpslashes()htmlspecialchars()两大过滤
    $name = stripslashes( $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $name = htmlspecialchars( $name );

    // Update database
    $data = $db->prepare( ‘INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );‘ );
    $data->bindParam( ‘:message‘, $message, PDO::PARAM_STR );
    $data->bindParam( ‘:name‘, $name, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

推荐优秀的类似文章

新手科普 | 通过DVWA学习XSS(盗取cookie)

https://www.freebuf.com/articles/web/157953.html

原文地址:https://www.cnblogs.com/xhds/p/12241153.html

时间: 2024-10-12 19:25:04

DWVA-XSS部分练手闯关的相关文章

某xss挑战赛闯关笔记

0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyun.com/forum/read/1462.html),去看了一下发现是前几天刚发现的平台,看了一下那个绕狗教程感觉挺不错的,xss却没有玩,那么正巧就玩一下,顺便学习一波别的师傅的思路. http://xss.tv 闯关地址:http://test.xss.tv 自己做了一些,也看了一下先知mon

XSS闯关游戏准备阶段及XSS构造方法

请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上"外套"就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload payload指

网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞, 比如SQL注入攻击, XSS攻击. 本文将简述SQL注入攻击的原理, 并分享下关卡设计, 其在打开潘多拉魔盒的情况下, 又能很好地限制危害. 效果展示: 先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^). 本文的想法实施于第十一关--健忘的教授. 很直接的呈现一个登陆对话框, 考验玩家

网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜欢这种方式. 你可能会很好奇, 它是如何实现的呢? 本文将阐述其原理, 并结合具体实例来演示如何借助H5的canvas来实现类刮刮卡的效果. 展示效果: 网页闯关游戏入口(请狠狠地点击我, ^_^) http://magic.mmxfgame.com. H5刮刮卡的实例源自第六关--拜访东方不败的故

射击闯关游戏,旧王已死、新王当立?

射击类游戏的最佳形态是电子竞技?比如<穿越火线> 街机.单机时代的<魂斗罗>.<合金装备>等闯关型射击游戏体验,不再适合移动手游时代? 射击类游戏需要更真实.更热血,最好如昆丁塔伦蒂洛的电影一样,拳拳到肉.血浆横飞?比如<使命召唤>? 曾经占据游戏机.单机和联机游戏极大份额的射击游戏们,在移动时代只能扮演有益补充? 射击类游戏混的似乎不太好?不是没有缘故的,根本原因就是长期自由搏击,而忘记了,其实关卡才是最能吸引用户的所在? 关卡.关卡.关卡!你还在自由搏击

黑板客爬虫闯关笔记(1-3关)

--首先,感谢黑板客老师做了这个爬虫闯关系列,让大家学习到不少知识. 第一关:将网页提示的数字加在网址后面 解题思路: 1.找到数字对应的html标签,用正则匹配标签内容. 2.将数字提取出来加到第一关网址后面,获取新的数字. 解题过程: 第二关: 解题思路:从0~30依次尝试登录. 第三关:在第二关的基础上加了两层保护 1.访问第三关时会跳转到一个登录页面,必须先登录(测试帐号:username:test;password:test123). 2.登录时有一个CSRF参数. 解题思路: 1.先

光棍节程序员闯关秀(总共10关)

程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/hamster.swf 第一关 提示: 从所有信息中找到进入下一关的方法 这一关很简单,即使没有任何web知识也能轻松通过.只要你懂得晃鼠标~~ 查看源代码会发现有这么一行: <p><astyle="color: #172024"href="?k=7a2546077

关于“诗词大闯关”的调查表与调查结果分析

前言: 我们小组做的项目是“诗词大闯关”,初步计划为游戏主要内容为:根据界面场景内容猜诗词名,诗词内容. 为了更深入的了解市场人民的需求,我们小组决定制作调查问卷来统计分析玩家对我们项目的关注点以及获取更多人的需求,在短短几天的时间内得到了122份有效的调查问卷. 1.首先我们统计被调查者的年龄段 根据我们的调查结果显示:96.7%的19~38岁的人群接受了我们的调查,故大部分人应该是学生族或者上班族. 2.为了更好的去处理我们的社区模块,我们小组调查了人们经常使用的社交工具 调查显示,使用QQ

网页闯关游戏(riddle webgame)--游戏玩法和整体介绍

前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想复制实现一个类似的网页闯关游戏. 说干就干, 抄起家伙, 就是一顿猛打, ^_^. 期间的坎坷曲折暂且不表, 甚至中途自觉江郎才尽差点放弃, 所幸最后终于完工, 愿意和大家一起分享该游戏. 展示: 网页闯关游戏, 更多的被称为riddle, 是一种考验搜索, 推理, 分析能力的闯关模式游戏. 用户群