红日代审-Day2-filter_var绕过
来源:https://github.com/hongriSec/PHP-Audit-Labs/blob/master/Part1/Day2/files/README.md
很多话我不想再重复了,就直接照搬的原话,能看就行
filter_var
1 | filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed |
value
要过滤的内容。警告:标量值在过滤前,会先转换成字符串
filter
要应用的过滤器。可以使用
FILTER_VALIDATE_\*
常量作为验证过滤器,使用FILTER_SANITIZE_\*
或FILTER_UNSAFE_RAW
作为清理过滤器,也可以使用FILTER_CALLBACK
作为自定义过滤器。注意: 默认值为
FILTER_DEFAULT
,是FILTER_UNSAFE_RAW
的别名。这将导致默认情况下不进行过滤。options
要么是选项的关联 array,要么是过滤器 flag 常量
FILTER_FLAG_\*
的位掩码。 如果filter
接受选项(option),则可以使用数组的"flags"
字段提供 flag。
- 返回值
成功时返回过滤后的数据。失败时返回 **false
**,除非使用 FILTER_NULL_ON_FAILURE
flag,在这种情况下会返回 **null
**。
示例
1 |
|
htmlspecialchars
1 | htmlspecialchars( |
字符 | 替换后 |
---|---|
& (& 符号) |
& |
" (双引号) |
" ,除非设置了 ENT_NOQUOTES |
' (单引号) |
设置了 ENT_QUOTES 后, ' (如果是 ENT_HTML401 ) ,或者 ' (如果是 **ENT_XML1 **、 ENT_XHTML 或 ENT_HTML5 )。 |
< (小于) |
< |
> (大于) |
> |
- string
待转换的 string
- flags
位掩码,由以下某个或多个标记组成,设置转义处理细节、无效单元序列、文档类型。 默认是 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
。
示例
1 |
|
Demo分析
这里实际上用的是PHP的一个模板引擎 Twig ,本题考察XSS(跨站脚本攻击)漏洞。虽然题目代码分别用了 escape 和 filter_var 两个过滤方法,但是还是可以被攻击者绕过。在上图 第8行 中,程序使用 Twig 模板引擎定义的 escape 过滤器来过滤link,而实际上这里的 escape 过滤器,是用PHP内置函数 htmlspecialchars 来实现的,具体可以点击 这里 了解 escape 过滤器
第二处过滤在 第17行 ,这里用了 filter_var 函数来过滤 nextSlide 变量,且用了 FILTER_VALIDATE_URL 过滤器来判断是否是一个合法的url
针对这两处的过滤,我们可以考虑使用 javascript伪协议 来绕过。为了直接理解这两个函数的绕过,我们简化了代码,请看下面的demo:
1 |
|
xss点在url处,尝试xss的一些payload
- ?url=<h1>test<h1>
可以看到这里直接被过滤了,那是业因为$url = filter_var($_GET[‘url’],FILTER_VALIDATE_URL);这里检查了url是否是一个URL格式的内容
于是要先构造一个URL形式的payload
- ?url=http://www.baidu.com?id=\
test</h1>
还是被吃掉了,但是当我把</h1>的/去掉后,成功解析出来<h1>标签
- ?url=http://www.baidu.com?id=\
test<h1>
于是继续构造尝试执行js代码
- ?url=http://1?\