XSS绕过之PHP htmlspecialchars() 函数

前言

xss-lab靶场中从第二关开始就设置利用htmlspecialchars()函数进行实体转换的防御措施,但大多数都可以利用单引号绕过,本文针对htmlspecialchars()函数在xss中绕过而展开,并未对htmlspecialchars() 函数进行完整介绍,若想对htmlspecialchars()函数进行深入学习,点击下方链接右转w3school
W3school PHP htmlspecialchars() 函数

htmlspecialchars()函数

定义

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

语法

htmlspecialchars(string,flags,character-set,double_encode)

用法

预定义的字符

&:转换为&
":转换为"
':转换为成为 '
<:转换为&lt;
>:转换为&gt;

参数

  • 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('"','&quot',$str6);
<input name=keyword  value="'.htmlspecialchars($str).'">

对value值进行了html字符实体转义,但并未对flags参数进行设置,根据flags参数默认只编码双引号,故可以利用单引号绕过构造语句

javascript:alert(1)//由于第八关卡也对script进行过滤替换,故需要对script进行实体转义
java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)

练习靶场推荐

Pikachu 漏洞练习平台下Cross-Site Scripting->xss之htmlspecialchars
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Yoo_666/article/details/107319239