双字节utf-8编码字符与asc字符互相转换

Java %c0%ae 安全模式绕过漏洞中,提及到了一种通过双字节utf-8编码字符绕过安全模式的方法,于是写了一个python3的小脚本来与asc字符互相转换。

 

一、java安全模式绕过漏洞

  好像是前年我在绿盟的公众号看到了这样一个漏洞,使用【%c0%ae】来代替【.】  ,这样【../】就变成可【%c0%ae%c0%ae/】,然后就可以绕过目录限制了。

Java %c0%ae 安全模式绕过漏洞
漏洞类型:安全模式绕过漏洞
漏洞描述:在Java端"%c0%ae"解析为"\uC0AE",最后转义为ASCCII低字符-"."。通过这个方法可以绕过目录保护读取包配置文件信息
漏洞危害:这个漏洞极易被攻击者利用,使得网站受保护的敏感文件被读取


二、猜想
  
如果按照这个说明,在对java开发的程序进行攻击时,是不是都可以使用这种方法尝试一下绕过。fuzz一下大量的特殊字符,看下是否有效果?
  所以,就要了解常见关键字对应的utf编码是什么。但是我在网上搜索,并未找到可用工具。于是就有了下面的小脚本。

 目前只实现asc编码的字符,和双字节utf-8编码字符的互转。如:

$ python asc_utf.py %c0%ae
.
$ python asc_utf.py '.'
%c0%ae

  

三、截图

  

四、代码

  1 # coding=utf-8
  2 import sys
  3 
  4 '''
  5 目前只实现asc编码的字符,和双字节utf-8编码字符的互转。
  6 如:
  7 %c0%ae <--> .
  8 
  9 用法:
 10 $ python asc_utf.py %c0%ae
 11 .
 12 $ python asc_utf.py '.'
 13 %c0%ae
 14 
 15 '''
 16 
 17 #把utf编码转换成asc字符,如%c0%ae转换成.
 18 def utf_to_asc(target):
 19     binStr1 = bin(hexStr_to_hex(target.split('%')[1]))
 20     binStr2 = bin(hexStr_to_hex(target.split('%')[2]))
 21     binStr1 = to_bin(binStr1)
 22     binStr2 = to_bin(binStr2)
 23     asc_binStr = binStr1[-2:] + binStr2[2:]
 24     asc_bin = binStr_to_bin(asc_binStr)
 25     return chr(asc_bin)
 26 
 27 #把asc字符转换成utf编码,如.转换成%c0%ae
 28 def asc_to_utf(target):
 29     asc_binStr = chr_to_binStr(target)
 30     asc_binStr_sub1 = asc_binStr[:2]
 31     asc_binStr_sub2 = asc_binStr[2:]
 32     utf_binStr = '110000' + asc_binStr_sub1 + '10' + asc_binStr_sub2
 33     utf_binStr_sub1 = utf_binStr[:8]
 34     utf_binStr_sub2 =utf_binStr[8:]
 35     utf1 = hex(binStr_to_bin(utf_binStr_sub1))
 36     utf2 = hex(binStr_to_bin(utf_binStr_sub2))
 37     utf = utf1 + utf2
 38     return utf.replace('0x','%')
 39 
 40 
 41 #把字符转换成其二进制
 42 def chr_to_binStr(target):
 43     target_binStr = bin(ord(target))    #将字符转换成二进制
 44     target_binStr = to_bin(target_binStr)
 45     return target_binStr
 46 
 47 #二进制,补全8位,并返回其字符串格式
 48 def to_bin(target):
 49     target_binStr = target[2:]            #去除二进制前缀0b
 50     num = 8 - len(target_binStr)
 51     if num >= 0 :                        #补全8位
 52         for i in range(0,num):
 53             target_binStr = '0' + target_binStr
 54     return target_binStr
 55 
 56 
 57 #把二进制的字符串格式,转换成真正的二进制数字
 58 def binStr_to_bin(target):
 59     bin_num = 0b00000000
 60     for i in range(0,8):
 61         if i == 0 :
 62             if target[i] == '1':
 63                 bin_num = bin_num + 0b10000000
 64         if i == 1 :
 65             if target[i] == '1':
 66                 bin_num = bin_num + 0b01000000
 67         if i == 2 :
 68             if target[i] == '1':
 69                 bin_num = bin_num + 0b00100000
 70         if i == 3 :
 71             if target[i] == '1':
 72                 bin_num = bin_num + 0b00010000
 73         if i == 4 :
 74             if target[i] == '1':
 75                 bin_num = bin_num + 0b00001000
 76         if i == 5 :
 77             if target[i] == '1':
 78                 bin_num = bin_num + 0b00000100
 79         if i == 6 :
 80             if target[i] == '1':
 81                 bin_num = bin_num + 0b00000010
 82         if i == 7 :
 83             if target[i] == '1':
 84                 bin_num = bin_num + 0b00000001
 85     return bin_num
 86 
 87 #把16进制的字符串格式,转换成真正的10进制数字
 88 def hexStr_to_hex(target):
 89     int_num = 0
 90     i = target[0]
 91     j = target[1]
 92     if i == '0':
 93         int_num = int_num + 0*16
 94     if i == '1':
 95         int_num = int_num + 1*16
 96     if i == '2':
 97         int_num = int_num + 2*16
 98     if i == '3':
 99         int_num = int_num + 3*16
100     if i == '4':
101         int_num = int_num + 4*16
102     if i == '5':
103         int_num = int_num + 5*16
104     if i == '6':
105         int_num = int_num + 6*16
106     if i == '7':
107         int_num = int_num + 7*16
108     if i == '8':
109         int_num = int_num + 8*16
110     if i == '9':
111         int_num = int_num + 9*16
112     if i == 'a':
113         int_num = int_num + 10*16
114     if i == 'b':
115         int_num = int_num + 11*16
116     if i == 'c':
117         int_num = int_num + 12*16
118     if i == 'd':
119         int_num = int_num + 13*16
120     if i == 'e':
121         int_num = int_num + 14*16
122     if i == 'f':
123         int_num = int_num + 15*16
124     if j == '0':
125         int_num = int_num + 0
126     if j == '1':
127         int_num = int_num + 1
128     if j == '2':
129         int_num = int_num + 2
130     if j == '3':
131         int_num = int_num + 3
132     if j == '4':
133         int_num = int_num + 4
134     if j == '5':
135         int_num = int_num + 5
136     if j == '6':
137         int_num = int_num + 6
138     if j == '7':
139         int_num = int_num + 7
140     if j == '8':
141         int_num = int_num + 8
142     if j == '9':
143         int_num = int_num + 9
144     if j == 'a':
145         int_num = int_num + 10
146     if j == 'b':
147         int_num = int_num + 11
148     if j == 'c':
149         int_num = int_num + 12
150     if j == 'd':
151         int_num = int_num + 13
152     if j == 'e':
153         int_num = int_num + 14
154     if j == 'f':
155         int_num = int_num + 15
156 
157     return int_num
158 
159 if __name__ == '__main__':
160     target = sys.argv[1]
161     if '%' not in target :
162         print(asc_to_utf(target))
163     else :
164         if target == '%':
165             print(asc_to_utf(target))
166         else:
167             print(utf_to_asc(target))
View Code

 

 


 

 
posted @ 2020-07-30 09:43  hanbufei  阅读(576)  评论(0编辑  收藏  举报