XSS攻防相关函数

这篇文章介绍xss攻防相关的一些函数。

一、htmlspecialchars()函数

1、前言

xss-lab靶场中从第二关开始就设置利用htmlspecialchars()函数进行实体转换的防御措施,但大多数都可以利用单引号绕过

htmlspecialchars()函数

定义

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

语法

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

用法

预定义的字符

1
2
3
4
5
&:转换为&
":转换为"
':转换为成为 '
<:转换为&lt;
>:转换为&gt;

参数

1
2
3
4
string:必需,规定要转换的字符串
flags :可选,规定如何处理引号、无效的编码以及使用哪种文档类型
character-set :可选,一个规定了要使用的字符集的字符串,如:UTF-8(默认)
double_encode :可选,布尔值,规定了是否编码已存在的 HTML 实体。

flags参数可用的引号类型

1
2
3
ENT_COMPAT :默认仅编码双引号。
ENT_QUOTES:编码双引号和单引号。
ENT_NOQUOTES:不编码任何引号。

注:xss-lab中有些关卡可以利用单引号绕过是因为flags参数默认只编码双引号

double_encode参数布尔值

1
2
TRUE:默认,将对每个实体进行转换。
FALSE:不会对已存在的 HTML 实体进行编码。

2、XSS绕过方法

1、默认编码(仅编码双引号)–单引号绕过

1
2
3
4
5
6
7
<?php 
$name = $_GET["name"];
$name_new = htmlspecialchars($name);
?>
<input type='text' value='<?php echo $name_new?>'>

利用单引号能够绕过

2、编码双引号和单引号

1
2
3
4
5
<?php 
$name = $_GET["name"];
$name_new = htmlspecialchars($name, ENT_QUOTES);
?>
<input type='text' value='<?php echo $name_new?>'>

单引号被过滤了

img靶场绕过(以xss-lab level8为例)

后台代码如下

1
2
$str7=str_replace('"','&quot',$str6);
<input name=keyword value="'.htmlspecialchars($str).'">

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

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

二、PHP str_replace() 函数

PHP String 参考手册

1、定义和用法

str_replace() 函数替换字符串中的一些字符(区分大小写)。

该函数必须遵循下列规则:

  • 如果搜索的字符串是一个数组,那么它将返回一个数组。
  • 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
  • 如果同时需要对某个数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余的元素将用空字符串进行替换。
  • 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。

注释:该函数是区分大小写的。请使用 str_ireplace() 函数执行不区分大小写的搜索。

注释:该函数是二进制安全的。

2、语法

str_replace(find,replace,string,count)

参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

技术细节

返回值: 返回带有替换值的字符串或数组。
PHP 版本: 4+
更新日志: 在 PHP 5.0 中,新增了 count 参数。 在 PHP 4.3.3 之前,该函数的 findreplace 参数都为数组时将会遇到麻烦,会引起空的 find 索引在内部指针没有更换到 replace 数组上时被忽略。新的版本不会有这个问题。 自 PHP 4.0.5 起,大多数参数可以是一个数组。

3、实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
//实例一:字符串替换字符串
$str1 = ("red", "black", "red green yellow pink purple");
echo $str1 . ""; //输出结果为black green yellow pink purple
echo "<br/>";

//实例二:字符串替换数组键值
$arr = array("blue", "red", "green", "yellow");
$str1 = ("red", "pink", $arr, $count);
print_r($str1);
echo "<br/>";

//实例三:数组替换数组,映射替换
$arr1 = array("banana", "orange");
$arr2 = array("pitaya", "tomato");
$con_arr = array("apple", "orange", "banana", "grape");
$con_rep = ($arr1, $arr2, $con_arr, $count);

print_r($con_rep);
echo "<br/>";

//实例四:如$search为数组,$replace为字符串时
$search = array("banana", "grape");
$replace = "tomato";
$arr = array("banana", "apple", "orange", "grape");
$new_arr = ($search, $replace, $arr, $count);
print_r($new_arr);

?>
文章作者: uf9n1x
文章链接: https://uf9n1x.top/2023/04/16/xss-gong-fang-xiang-guan-han-shu/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Uf9n1x's Blog