这篇文章介绍xss攻防相关的一些函数。
一、htmlspecialchars()函数
1、前言
xss-lab靶场中从第二关开始就设置利用htmlspecialchars()函数进行实体转换的防御措施,但大多数都可以利用单引号绕过
htmlspecialchars()函数
定义
htmlspecialchars()函数:把预定义的字符转换为 HTML 实体
语法
1 | htmlspecialchars(string,flags,character-set,double_encode) |
用法
预定义的字符
1 | &:转换为& |
参数
1 | string:必需,规定要转换的字符串 |
flags参数可用的引号类型
1 | ENT_COMPAT :默认仅编码双引号。 |
注:xss-lab中有些关卡可以利用单引号绕过是因为flags参数默认只编码双引号
double_encode参数布尔值
1 | TRUE:默认,将对每个实体进行转换。 |
2、XSS绕过方法
1、默认编码(仅编码双引号)–单引号绕过
1 |
|
2、编码双引号和单引号
1 |
|
单引号被过滤了
靶场绕过(以xss-lab level8为例)
后台代码如下
1 | $str7=str_replace('"','"',$str6); |
对value值进行了html字符实体转义,但并未对flags参数进行设置,根据flags参数默认只编码双引号,故可以利用单引号绕过构造语句
1 | javascript:alert(1)//由于第八关卡也对script进行过滤替换,故需要对script进行实体转义 |
二、PHP str_replace() 函数
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 之前,该函数的 find 和 replace 参数都为数组时将会遇到麻烦,会引起空的 find 索引在内部指针没有更换到 replace 数组上时被忽略。新的版本不会有这个问题。 自 PHP 4.0.5 起,大多数参数可以是一个数组。 |
3、实例
1 |
|