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))