文章目录
前言
xss-lab靶场中从第二关开始就设置利用htmlspecialchars()函数进行实体转换的防御措施,但大多数都可以利用单引号绕过,本文针对htmlspecialchars()函数在xss中绕过而展开,并未对htmlspecialchars() 函数进行完整介绍,若想对htmlspecialchars()函数进行深入学习,点击下方链接右转w3school
W3school PHP htmlspecialchars() 函数
htmlspecialchars()函数
定义
htmlspecialchars()函数:把预定义的字符转换为 HTML 实体
语法
htmlspecialchars(string,flags,character-set,double_encode)
用法
预定义的字符
&:转换为&
":转换为"
':转换为成为 '
<:转换为<
>:转换为>
参数
- string:必需,规定要转换的字符串
- flags :可选,规定如何处理引号、无效的编码以及使用哪种文档类型
- character-set :可选,一个规定了要使用的字符集的字符串,如:UTF-8(默认)
- double_encode :可选,布尔值,规定了是否编码已存在的 HTML 实体。
flags参数可用的引号类型
- ENT_COMPAT :默认仅编码双引号。
- ENT_QUOTES:编码双引号和单引号。
- ENT_NOQUOTES:不编码任何引号。
注:xss-lab中有些关卡可以利用单引号绕过是因为flags参数默认只编码双引号
double_encode参数布尔值
- TRUE:默认,将对每个实体进行转换。
- FALSE:不会对已存在的 HTML 实体进行编码。
XSS绕过
默认编码(仅编码双引号)
<?php
$name = $_GET["name"];
$name_new = htmlspecialchars($name);
?>
<input type='text' value='<?php echo $name_new?>'>
利用单引号能够绕过
编码双引号和单引号
<?php
$name = $_GET["name"];
$name_new = htmlspecialchars($name, ENT_QUOTES);
?>
<input type='text' value='<?php echo $name_new?>'>
单引号被过滤了
靶场绕过(以xss-lab level8为例)
后台代码如下
$str7=str_replace('"','"',$str6);
<input name=keyword value="'.htmlspecialchars($str).'">
对value值进行了html字符实体转义,但并未对flags参数进行设置,根据flags参数默认只编码双引号,故可以利用单引号绕过构造语句
javascript:alert(1)//由于第八关卡也对script进行过滤替换,故需要对script进行实体转义
javascript:alert(1)
练习靶场推荐
Pikachu 漏洞练习平台下Cross-Site Scripting->xss之htmlspecialchars