DVWA Reflected Cross Site Scripting (XSS) 反射型XSS源码解析

LOW

此时无防护<script>alert(1)</script>
在这里插入图片描述

<?php
// 指定了一个名为 “X-XSS-Protection” 的响应头,其值为 “0”。
// 该头部通知浏览器禁用内置的跨站点脚本防护机制(XSS Protection)
header ("X-XSS-Protection: 0");

// 是否有输入
// GET方法中是否存在"name"字段,且name字段不为空
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // 给用户回显,直接将"name"字段对应的值直接进行拼接并回显的页面
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
/*
补充:
array_key_exists() 是 PHP 中用于检查数组中指定的键是否存在的函数
bool array_key_exists ( mixed $key , array $array )
$key 表示要检查的数组键名,可以是任何类型,比如整数、字符串和浮点数等
$array 表示要检查的目标数组

当 $array 数组中存在 $key 时,array_key_exists() 函数返回 TRUE;否则返回 FALSE。
*/

?>

Medium

此时可使用大小写绕过<Script>alert(1)</Script>
在这里插入图片描述也可使用双写绕过<scr<script>ipt>alert(1)</script>
在这里插入图片描述

<?php
// 指定了一个名为 “X-XSS-Protection” 的响应头,其值为 “0”。
// 该头部通知浏览器禁用内置的跨站点脚本防护机制(XSS Protection)
header ("X-XSS-Protection: 0");

// 是否有输入
// GET方法中是否存在"name"字段,且name字段不为空
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // 将GET传参中name字段的值中含有"<script>"的部分删除掉然后储存到name变量中
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // 给用户回显
    echo "<pre>Hello ${name}</pre>";
}

/*
补充:
str_replace() 函数是用于在字符串中替换指定字符或子字符串的函数
str_replace($search, $replace, $subject);
$search 表示要查找和替换的字符或子字符串,可以是一个字符串或一个字符串数组。
$replace 表示要替换为的新字符或子字符串,可以是一个字符串或一个字符串数组。
$subject 是要进行查找和替换操作的目标字符串,它可以是一个字符串或字符串数组
*/
?>

High

<img src=1 onerror=alert(/xss/)>
这个字符串在网页中被解析成一个图片,其中 src 属性对应的是一个危险的 JavaScript 代码 οnerrοr=alert(/xss/)。这个代码会在图片载入失败的时候执行,显示一个警告框并提示信息 “xss”


<?php
// 指定了一个名为 “X-XSS-Protection” 的响应头,其值为 “0”。
// 该头部通知浏览器禁用内置的跨站点脚本防护机制(XSS Protection)
header ("X-XSS-Protection: 0");

// 是否有输入
// GET方法中是否存在"name"字段,且name字段不为空
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // 利用正则表达式匹配任意个开始'<','s','c','r','i','p','t'结束,并忽略大小写将其删除,并存到变量name中
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // 给用户回显
    echo "<pre>Hello ${name}</pre>";
}

?>

/*
preg_replace() 是 PHP 中一个基于正则表达式进行替换的函数。它用于匹配字符串中的模式,并将其替换为指定的字符串
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject ,[int $limit = -1 [, int &$count ]] ) : mixed

$pattern 表示所需匹配的正则表达式,可以是一个字符串或者一个由字符串组成的数组;
$replacement 表示用于替换匹配项的字符串,可以是一个字符串或者一个由字符串组成的数组;
$subject 表示要处理的目标字符串,可以是一个字符串或者一个由字符串组成的数组;
$limit 表示最大要被替换的次数,-1 表示无限制;
$count 是一个引用参数,表示替换完成后替换的次数
*/

Impossible


<?php

// 是否有输入
// GET方法中是否存在"name"字段,且name字段不为空
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // 检查防CSRF令牌,会检查"user_token"h和"session_token"是否匹配
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // 得到参数name对应的值,并将其中特殊字字符替换为html的实体字符
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // 给用户回显
    echo "<pre>Hello ${name}</pre>";
}

// 生成防CSRF令牌
generateSessionToken();

/*
补充:
htmlspecialchars() 是 PHP 中的一个函数,用于将字符转换为 HTML 实体,可增加页面安全性
eg: $string = "This is a <strong>bold</strong> statement.";
    echo htmlspecialchars($string);
    会输出This is a &lt;strong&gt;bold&lt;/strong&gt; statement.
*/

?>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值