zoukankan      html  css  js  c++  java
  • 双字节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
    
    
    
     
  • 相关阅读:
    codeforces
    hdu
    hdu
    poj 2823
    hdu
    hdu
    hdu
    微信公众号 SDK
    PHP 正则表达式
    注册和登录时的验证码
  • 原文地址:https://www.cnblogs.com/or4nge/p/13402037.html
Copyright © 2011-2022 走看看