我们这篇文章,说一下php里面用的比较多的一个方法,那就是htmlspecialchars()函数
xss关键防范措施其中一个关键的地方,就是我们在输出的时候,要做前端实体的转义
XSS绕过-关于htmlspecialchars()函数
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
$ok=htmlspecialchars($_GET['message'])
默认情况下,不会对单引号进行编码,因为单引号不是html前端实体里面,一个规范的编码,所以说,他不会对单引号进行处理的,当我们输出点比较特殊的话,虽然我们用了htmlspecialchars()处理,但是仍然可能出现xss漏洞
做修复的时候,如果是php语言,里面涉及这么个方法,或者是其它语言,我们一定要搞清楚,它这个方法是不是够全面,我们这里选择ENT_QUOTES
案例演示
我们切换到xss之htmlspecialchars项目里面,还是按照我们之前常规的思路,
"'<>&1111
我们看一下源码
我们可以看到输出点是在我们,a标签的href里面,我们看到这里出现了很多html实体的符号,也就是说htmlspecialchars会对我们相关的内容进行编码,我们可以双引号,左右尖括号,&都被进行了编码,单引号没有进行处理,这个地方就是用了默认的htmlspecialchars来做后端的过滤,这个时候,我们可以构造一个payload进行过滤,
q' onclick='alert(111)'
单引号就是把前面的单引号闭合掉,后面去输一个onclick,这个onclick是可以被执行的,因为这个单引号没有做处理,它仍然是一个生效的单引号
我们onclick一下
这就是它后端处理的一个输入,我们可以看一下后端的代码
它会对接入的数据进行处理,通过htmlspecialchars做处理,处理完之后,它就在a标签里面输出了,
$message=htmlspecialchars($_GET['message']);
它这个地方用的是默认的方法,它并没有在后面指定对单引号和双引号,都做处理,所以说,产生了这个问题