utf8编码解析问题

绕过Java安全模式

%C0%2F => /
%C0%80 => %00
%C0%AF => .

利用

http://www.test.com/%c0%ae/WEB-INF/web.xml%C0%80.jsp

原理:%c0%AE => .

utf8是一种可变宽度字符编码,可以是一到四个字节组成。在0之前1个个数代表着多少个字节,比如110xxxxx代表着两个字节110xxxxx 10xxxxxx。其中的x代表着代码点。(更详细的请看https://en.wikipedia.org/wiki/UTF-8#Description)

1
2
3
4
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

十六进制UTF8‭%C0%AE => 二进制UTF811000000‬ ‭10101110‬ => 二进制UTF8代码点***00000 **101110=> 二进制unicode00000101110 => 十六进制unicode0x2e => ascii.

但是这个并不符合unicode的规范,因为utf8双字节代表unicode的范围是0x80~0x7FF之间。(更详细的请看https://baike.baidu.com/item/Unicode)

1
2
3
4
5
Unicode编码(十六进制) UTF-8 字节流(二进制)
000000-00007F 0xxxxxxx
000080-0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx10xxxxxx10xxxxxx10xxxxxx

为啥还可以解码成功?这是由于unicode库快速开发而不考虑安全问题,或者做一些兼容导致的。

同理可推
%C0%80 => %00
%C0%AF => /

参(chao)考(xi)

https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work