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()
----------------------------------------------------------------------------------------
unicode字符等价探究的更多相关文章
- 转:Unicode字符集和多字节字符集关系
原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...
- HTML、CSS、JS对unicode字符的不同处理
unicode字符的不同表示法 unicode字符在html.css和js中的表示方法均不相同,下面分别作介绍. 原文发表于这里 css表示法 首先来一段很常见的bootstrap的字体图标代码: . ...
- Java 经典实例: Unicode字符和String之间的转换
在Java诞生之际,Unicode码是一个16位的字符集,因此char值似乎顺其自然为16位宽,多年来一个char变量几乎可以表示任何Unicode字符. /** * Created by Frank ...
- Unicode Character Table – Unicode 字符大全
Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本转换.处理的要求.Unicode Chara ...
- Unicode字符列表(超完整)
Unicode字符列表(超完整)Unicode, 字符, 列表代码 显示 描述U+0020 空格 U+0021 ! 叹号 U+0022 " 双引号 U+0023 # 井号 U+0024 $ ...
- python print输出unicode字符
命令行提示符下,python print输出unicode字符时出现以下 UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb ...
- decode 函数将字符串从某种编码转为 unicode 字符
环境:Ubuntu, Python 2.7 基础知识 这个程序涉及到的知识点有几个,在这里列出来,不详细讲,有疑问的直接百度会有一堆的. 1.urllib2 模块的 request 对像来设置 HTT ...
- 解决“在多字节的目标代码页中,没有此Unicode字符可以映射到的字符”
今天在处理Google网站管理员中的500错误时发现这样一些URL: http://www.cnblogs.com/Garnai/tag/3D%3F%96%CA/ http://www.cnblogs ...
- Dir /U /c 输出Unicode字符的特性
比如某个目录列表如下: D:\Spec\a.txtD:\Spec\Dir・C.txtD:\Spec\else.txtD:\Spec\קתקווה.dataD:\Spec\中・文.txt 直接dir / ...
随机推荐
- 【快学springboot】4.接口参数校验
前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...
- 【剑指Offer面试编程题】题目1514:数值的整数次方---九度OJ
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T, ...
- tomcat重载web项目,debug
Reloading Context with name [/testCookie] is completed 加载上下文名称[ / ]完成testcookie //start九月 05, 2017 9 ...
- SystemVerilog Assertion 设计、调试、测试总结(3)
上两篇主要是讲述断言的概念,基本语法,总结等等 这一篇主要是以PPT的形式展示各个场景下关于断言的应用. 为了在设计中加入断言的功能,因此需要写一个DUT.如下: `define `define fr ...
- 小程序的tabar顶部和底部导航的区别
最近有人说小程序的底部tabar放在顶部会出现问题,那么先看看如何放在顶部吧:图片效果: 这里呢,在官方文档是有说明,tabbar 的属性设置里面有个position属性,position只支持bot ...
- centos7-django(python3)环境搭建
最小化安装centos7 安装epel-release 安装python34 安装pip3 通过pip3安装django 坑 epel(extra package for enterprise lin ...
- 公用表表达式(CTE) with as 片段
1.为什么用CTE,而不用表变量, declare @t table(CountryRegionCode nvarchar(3)) insert into @t(CountryRegionCode) ...
- Lesson 46 Hobbies
Who, according to the authour, are 'Fortune's favoured children'? A gifted American psychologist has ...
- 内网其他服务器节点连接Mysql数据库很慢的解决方案
一.概述 使用jdbc方式对数据进行同步时,由于设置了数据库登录超时时间是10s,结果发现有的服务器节点可以连接,有的服务器节点不能连接Mysql数据库.排查了好长原因,最后,自己写了一个jdbc的测 ...
- 图片转换到指定大小PDF
1.首先转换为eps jpeg2ps compile to exec file ./jpeg2ps -p a4 a.jpg -o x.eps2.从eps转换到pdf ps2pdf -dDownsa ...