Web安全之XSShtmlspecialchars,href输出,js输出
xss之htmlspecialchars
htmlspecialchars()是PHP里面把预定义的字符转换为HTML实体的函数
预定义的字符是
- & 成为 &
- " 成为 "
- ' 成为 '
- < 成为 <
- > 成为 >
可用引号类型
- ENT_COMPAT:默认,仅编码双引号
- ENT_QUOTES:编码双引号和单引号
- ENT_NOQUOTES:不编码任何引号
首先打开pikachu的XSS之htmlspecialchars,按照xss漏洞测试流程,先输入一段特殊字符'"<>6666,
接着查看页面源码,搜索到我们之前输入的特殊字符中的唯一识别字符
可以看到输出点的a标签里,我们输入的特殊字符被htmlspecialchars函数转化成了PHP的实体编码
但是单引号没被编码,说明后端用的默认的htmlsspecialchars函数做处理
接着我们可以利用单引号来构造一个payload ' onclick='alert(111)' 输入到页面中,点击提交,成功弹窗
XSS之href输出
在pikachu的XSS之href页面中随意输入一些字符,然后打开页面源码可以看到我们输入的内容由href输出还被转义编码了
接着我们查看后端代码可以看到当我们输入的网址不是百度的网址时,它会通过htmlspecialchars函数进行处理,而ENT_QUOTES函数则会对单引号、双引号等特色字符进行转义处理
因为a标签的href属性是可以使用JavaScript协议执行JS代码的,所以我们可以构造一个没有转义字符的payload来进行绕过 javascript:alert(111)
可以看到整个payload里面是没有那些特殊字符的,输入payload点击提交,成功弹窗
herf输出做防御的两个逻辑
- 输入的时候只允许 http 或 https 开头的协议,才允许输出
-
再进行htmlspecialchars处理,把特殊字符给处理掉
XSS之js输出
首先打开pikachu的xss之js输出页面,随意输入一段字符,查看页面源码可以看到我们输入的内容被放到js中输出了
接着我们来根据前端js代码来构造相应的闭合payload aaa'</script><script>alert('xss')</script>
将这段payload输入提交,成功弹窗
XSS常见防范措施
总的原则:输入做过滤,输出做转义
- 过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字
- 转义:所有输出到前端的数据根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面进行JS转义