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 <strong>bold</strong> statement.
*/
?>