0
回答
JexlInvoke方法完成的有逻辑漏洞吗 getString("lowerCase(MD5(sha1({a}{b}{c})))", params)
华为云实践训练营,热门技术免费实践!>>>   

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.security.Key;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;

import com.google.gson.Gson;
import com.zyxr.mobile.util.MD5Util;
import com.zyxr.mobile.util.SHA1Util;

import sun.misc.BASE64Encoder;

/**
 * @category  表达式执行工具类,效果见main方法
 * @author  zhangzhenxing 
 * @E-mail  1245812397@qq.com
 */
public class JexlInvokeUtil {
    static Log log = LogFactory.getLog(JexlInvokeUtil.class);
    
    static Gson gs= new Gson();
    
    public static String  getString( Map<String, Object> params,String exl){
        if(params == null || StringUtils.isBlank(exl)) return StringUtils.EMPTY;
        Map<String,String> map = new HashMap<>();
        for (Entry<String, Object> entry : params.entrySet()) {
            map.put(entry.getKey(), entry.getValue()+"");
        }
        return getString(exl, map);
    }
    
    public static String  getString(String exl, Map<String, String> params){
        String newExl = null;
        try {
            if(exl.indexOf("(") == -1) return exl; 
            Map<String, String> newParams = new HashMap<>();
            for (Entry<String, String> entry : params.entrySet()) {
                newParams.put("{"+entry.getKey()+"}", entry.getValue());
            }
            params.clear();
            params = newParams;
            exl = exl.replaceAll("\\s+", "");
            int begin = exl.lastIndexOf("(");
            int end = exl.indexOf(")", begin);
            String exlMethod = exl.substring(0, begin);
            int nearIndex = getMax(exlMethod.lastIndexOf(","),exlMethod.lastIndexOf("("));
            String method = exl.substring(nearIndex+1, end+1);
            String methodName = method.substring(0,method.indexOf("("));
            String paramName = exl.substring(begin+1,end);
            String[] strs = paramName.split(",");
            Object[] objs = getObject(strs,  params);
            newExl = exl.replace(method, getValue(methodName, objs));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("JexlInvokeUtil-->getString执行错误,请修改语法:"+exl+"");
            return null;
        }
        return getString(newExl, params);
    }
    
    public static String getValue(String methodName, Object[] objs) throws Exception{
        Class<?> clazz = JexlInvokeUtil.class;
        // 调用TestReflect类中的reflect1方法
        Class[] clz=new Class[objs.length];
        for (int i = 0; i < objs.length; i++) {
            if(objs[i] == null){
                clz[i] = null;
            } else {
                clz[i] = String.class;
            }
        }
        Method method = clazz.getMethod(methodName,clz);
        Object obj =  method.invoke(clazz.newInstance(), objs);
        return obj+"";
    }
    public static Integer getMax(Integer... objects){
        List<Integer> list = Arrays.asList(objects);
        Collections.sort(list);
        return list.get(list.size() - 1);
    }
    
    
    public static  Object[] getObject(String[] strs, Map<String, String> params){
        Object[] objs = new Object[strs.length];
        for (int i = 0; i < strs.length; i++) {
            String str = strs[i];
            for (Entry<String, String> entry : params.entrySet()) {
                str = str.replace(entry.getKey(), entry.getValue());
            }
            objs[i] = str;
        }
        return objs;
    }
    
    public static void main(String[] args) throws Exception {
        Map<String, String> params = new HashMap<>();
        params.put("a", String.valueOf(1));
        params.put("{a}", "1");
       params.put("{b}", "12342141");
        params.put("{c}", "发大水发送");
        String result = getString("lowerCase(MD5(sha1({a}{b}{c})))", params);
    }
    
    
    public static String lowerCase(String str){
        log.info("lowerCase字符串:"+str);
        return str.toLowerCase();
    }
    
    public static String MD5(String str){
        log.info("MD5字符串:"+str);
        return MD5Util.getMd5String(str);
    }
    
    public static String sha1(String str){
        log.info("sha1字符串:"+str);
        return SHA1Util.getSHA1String(str);
    }
    
    /**
     * unicode 转字符串
     */
    public static String unicode2String(String unicode) {
     
        StringBuffer string = new StringBuffer();
     
        String[] hex = unicode.split("\\\\u");
     
        for (int i = 1; i < hex.length; i++) {
     
            // 转换出每一个代码点
            int data = Integer.parseInt(hex[i], 16);
     
            // 追加成string
            string.append((char) data);
        }
     
        return string.toString();
    }
    
    
    /**
     * 字符串转换unicode
     */
    public static String string2Unicode(String string) {
     
        StringBuffer unicode = new StringBuffer();
     
        for (int i = 0; i < string.length(); i++) {
     
            // 取出每一个字符
            char c = string.charAt(i);
     
            // 转换为unicode
            unicode.append("\\u" + Integer.toHexString(c));
        }
     
        return unicode.toString();
    }
    
    public static String toJSONObjectString(String string) {
        Map<String,Object> treeMap = new TreeMap<>();
        JSONObject json = new JSONObject(string);
        for (String key : json.keySet()) {
            treeMap.put(key, json.get(key));
        }
        JSONObject newJson = new JSONObject();
        for (Entry<String, Object> entry : treeMap.entrySet()) {
            newJson.put(entry.getKey(), entry.getValue());
        }
        return newJson.toString();
    }
    
    
     /**
     * DESCBC加密
     *
     * @param  src
     *            数据源
     * @param key
     *            密钥,长度必须是8的倍数
     * @return 返回加密后的数据
     * @throws Exception
     */
   
    public  static String encryptDESCBC(String plainText,String secretKey,String iv){
        Key deskey = null;
        try {
            DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
            deskey = keyfactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
            byte[] encryptData = cipher.doFinal(plainText.getBytes("UTF-8"));
            return new BASE64Encoder().encode(encryptData);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    public static String encode(String str){
        try {
            return URLEncoder.encode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

<无标签>
举报
503
发帖于3个月前 0回/117阅
顶部