Tutorial de penetración de intranet de Ngrok

Tutorial de penetración de intranet de Ngrok

Descargue el programa ngrok.exe

https://www.ngrok.cc/download.html

Registrar una dirección de túnel

https://www.ngrok.cc/user

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y cargarla directamente (img-9VVJ6OAB-1617072034785) (C: \ Users \ HCP \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210330103401935.png)]

Abre el túnel:

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y subirla directamente (img-UYWdwyQu-1617072034787) (C: \ Users \ HCP \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210330103452172.png)]

Inicie el programa ngrok.exe e ingrese la identificación del túnel

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y cargarla directamente (img-p2OPufCw-1617072034789) (C: \ Users \ HCP \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210330103552876.png)]

Nota: El puerto del proxy http debe ser 80, https debe ser 443 (necesita proxy Nginx)

Verificación de WeChat (configuración de cuenta oficial, servidor de autenticación, si no hay servicio de Alibaba Cloud y nombre de dominio, ngrok sería más apropiado)

   @GetMapping("/wxPublic")
    public String checkToken(HttpServletRequest request, HttpServletResponse response) {
    
    
        // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        String signature = request.getParameter("signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr");

        PrintWriter out = null;
        try {
    
    
            out = response.getWriter();
            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败
            if (WeixinCheckoutUtil.checkSignature(signature, timestamp, nonce)) {
    
    
                log.info("微信加密签名:" + signature + ";时间戳:" + timestamp + ";随机数:" + nonce);
                out.print(echostr);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            out.close();
            out.print(echostr);
        }
        return null;
    }

WeixinCheckoutUtil

package com.ac.flaget.common.utils.wx;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * @author: craywen
 * @date: 2021-03-22 16:04
 * @desc: 效验工具类
 */
public class WeixinCheckoutUtil {
    
    

    //校验签名的token 事先与app约定
    private static String token = "craywen";

    /**
     * 校验签名
     * @param signature 签名
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @return 布尔值
     */
    public static boolean checkSignature(String signature,String timestamp,String nonce){
    
    
        String checktext = null;
        if (null != signature) {
    
    
            //对ToKen,timestamp,nonce 按字典排序
            String[] paramArr = new String[]{
    
    token,timestamp,nonce};
            Arrays.sort(paramArr);
            //将排序后的结果拼成一个字符串
            String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);

            try {
    
    
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                //对接后的字符串进行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                checktext = byteToStr(digest);
            } catch (NoSuchAlgorithmException e){
    
    
                e.printStackTrace();
            }
        }
        //将加密后的字符串与signature进行对比
        return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
    }

    /**
     * 将字节数组转化我16进制字符串
     * @param byteArrays 字符数组
     * @return 字符串
     */
    private static String byteToStr(byte[] byteArrays){
    
    
        String str = "";
        for (int i = 0; i < byteArrays.length; i++) {
    
    
            str += byteToHexStr(byteArrays[i]);
        }
        return str;
    }

    /**
     *  将字节转化为十六进制字符串
     * @param myByte 字节
     * @return 字符串
     */
    private static String byteToHexStr(byte myByte) {
    
    
        char[] Digit = {
    
    '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        char[] tampArr = new char[2];
        tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
        tampArr[1] = Digit[myByte & 0X0F];
        String str = new String(tampArr);
        return str;
    }

}

Supongo que te gusta

Origin blog.csdn.net/qq_38893133/article/details/115319707
Recomendado
Clasificación