jtar处理字符
前置知识
Unicode
UCS-2:这种形式使用2个字节来表示一个字符,最多可以表示65536个字符
UTF-8
UTF-8是一种变长的编码方式,它遵循Unicode规范。UTF-8编码的字符长度不固定,常用的中文字符占3个字节,不常用的中文字符占4个字节1。
16进制
Unicode就是16进制
Unicode、UTF-8、UTF-16 终于懂了 - 知乎
这题如果直接上传jsp会被拦截,所以要寻找绕过的方式。
jtar中的org.kamranzafar.jtar.TarHeader#getNameBytes
错误的使用了byte进行强制类型转换。Java中的byte是8位二进制。所以只会截取两个字符组成的Unicode的低位。
1 | import java.io.File; |
用python脚本来寻找适合的字符
1 | # 目标字节值(对应 ASCII 字符 'p') |
这样就能实现绕过过滤器但是经过压缩再解压后的到jsp后缀的文件了
题目中有趣的点
注意到这行代码byte[] data = new byte['耀'];
居然有中文,什么情况,实则定义长度。
16进制为8000,再转换为10进制
总结
对字符类型有了更加深刻的记忆,以及了解了乱码产生的原因。