首页 > 其他 > 详细

unicode字符等价探究

时间:2019-09-09 11:29:05      阅读:125      评论:0      收藏:0      [点我收藏+]

Demo
baidu.com(\uff41)能跳转到baidu.com
bаidu.com(\u0430)不能跳转到baidu.com,被认为成一个其他域名

等价原因
两个不同编码的Unicode字符之间可能存在一定的等价性,这种等价是字符或字符序列之间比较弱的等价类型,这些变体形式可能为视觉上或意义上的等价性。例如a和a(\uff41)字体看起来相同,15和?(\u246e)其表示的数学意义可能相同。

字符转换
转换成字符的方式有Normalization Form C(NFC) 和Normalization Form KC(NFKC) 两种,他们之间的区别取决于生成的文本是否与原始非标准化文本等效,K表示兼容性。
分解组成字符的方式有Normalization Form D(NFD) 和 Normalization Form KD(NFKD)两种。
NFC与NFD的区别:
例如Å(\u212B)用NFD进行normalize,会变为A?(\u0041\u030a),而NFC处理后则是Å(\u00c5)。在normalize的过程中会检测该字符是否在NFC表中,如果在,则进行对应的转换算法,例如之前的Demo,a(\uff41)在NFC存在被转换成a,а(\u0430)不存在则不进行转换。

等价漏洞利用
对所有字符遍历一次,找到normalize后与ASCII字符等价的字符,可以绕过一些过滤,
Lyle师傅的脚本:
------------------------------------------------------------------------------------------
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
from unicodedata import normalize


def main():
debug = False
tables = {}
for i in range(1, 0x10000):
src = unichr(i)
dst = normalize(‘NFKC‘, src)[0]
try:
if ord(dst) < 128 and dst != src:
if debug:
print("%s (\\u%s) -- normalize --> %s (\\x%s)" % (
src, hex(i)[2:].rjust(4, ‘0‘),
dst, hex(dst.charAt(0))[2:]
))
if dst in tables:
tables[dst].append(src)
else:
tables[dst] = [src]
except Exception as e:
print(repr(e))
with open("nfctable.txt", "wb") as fh:
json.dump(tables, fh)


if __name__ == ‘__main__‘:
main()
----------------------------------------------------------------------------------------

unicode字符等价探究

原文:https://www.cnblogs.com/cimuhuashuimu/p/11490292.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!