高位Unicode转换绕过WAF实现XSS

0x00

今天测试的时候,同事使用的扫描器报出一个Unicode编码漏洞,payload是这样的:..%255c..\winnt\system32\cmd.exe,但实际上是一个误报。

不过在同事的一顿折腾下,发现特殊的Unicode编码可以绕过应用本身的XSS防护,如下面的payload就可以成功插入并执行:

%C0%BCscript%C0%BEalert%c0%a81%c0%a9%C0%BC%c0%afscript%C0%BE

同事和我都一脸懵逼,那么到底是为什么呢?

0x01

尖括号<的URL编码应该是%3C,为什么这里是%C0%BC呢?带着疑惑,我找到了一篇2016年的文章,讲到关于16bit Unicode编码绕过防护的特殊方式。

早期计算机使用8bit作为1字节,1字节能表示最大整数为255,同时0-255被用做表示英文字母和一些符合,也就是ASCII编码表,如大写字母A就是编码65。如果要表示中文,8bit是远远不够的,更何况世界上有那么多的语言。于是Unicode编码诞生了,Unicode最高支持32bit,也就是4字节大小的内容。

通常情况下,我们使用8bit Unicode进行编码,如尖括号<的8bit 二进制数为00111100,转换16进制数后是3C,URL编码后为%3C。但是偶尔有一些网站会接收高位Unicode编码,这样有利于我们来绕过一些WAF。

0x02

那么,如何转换16bit、24bit、32bit的高位Unicode编码呢?因为基础知识很差(没有),所以查了半天也很懵逼,但是至少查到了如何转换。

来源: http://www.azillionmonkeys.com/qed/unicode.html

将字符转换到二进制后,直接带入上面这样一个表即可。

在线转换工具:https://www.asciitohex.com/

示例:
11000000 10xxxxxx -> 16-bit de largo
11100000 1000000 10xxxxxx -> 24-bit de largo
11110000 1000000 1000000 10xxxxxx -> 32-bit de largo

将<的二进制码111100进行高位转换:

00111100 -> 8-bit de largo
11000000 10111100 -> 16-bit de largo
11100000 1000000 10111100 -> 24-bit de largo
11110000 1000000 1000000 10111100 -> 32-bit de largo

0x03

知道如何转换之后,就开始实际操作。普通的XSS代码会被WAF直接拦截,而16bit转换后的payload可直接通过。

拦截
通过

参考:

https://www.hackingmexico.one/blog/2016/09/05/cross-site-scripting-waf-bypass-modsecurity-in-bugbounty/

http://www.azillionmonkeys.com/qed/unicode.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注