• unicode字符等价探究


    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,会变为Å(\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()
    ----------------------------------------------------------------------------------------

  • 相关阅读:
    Linq增删查改
    AspNetPager 分页显示
    简单C#数据库操作类
    SQL重复记录处理(查找,过滤,删除)
    Asp.Net配置Web.config连接数据库SqlServer
    转:Asp.Net网站项目发布到IIS后验证码不能显示的问题解决
    将一行含有日期范围的数据按照单日日期拆分
    asp.net过滤HTML标签的几个函数
    循环批量更新的的存储过程(属于转载)
    CheckBox的CheckedChanged事件获取所在GridView中的Cell值
  • 原文地址:https://www.cnblogs.com/cimuhuashuimu/p/11490292.html
Copyright © 2020-2023  润新知