XMLDecoder를 이용한 불안전한 역직렬화 (Insecure Deserialization using XMLDecoder)
Deserialization of Untrusted Data
Last updated
Deserialization of Untrusted Data
Last updated
import java.beans.XMLDecoder;
import java.io.ByteArrayInputStream;
public class InsecureXMLDecoder {
public static void main(String[] args) {
String maliciousXML = "<java>\n" +
" <new class='java.lang.ProcessBuilder'>\n" +
" <array class='java.lang.String' length='2'>\n" +
" <void index='0'>\n" +
" <string>calc.exe</string>\n" + // Windows 시스템에서 계산기를 실행하는 예제 (RCE)
" </void>\n" +
" </array>\n" +
" </new>\n" +
"</java>";
XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(maliciousXML.getBytes()));
decoder.readObject(); // 위험한 역직렬화 수행
}
}import java.beans.XMLDecoder;
import java.io.ByteArrayInputStream;
public class SecureXMLDecoder {
public static void main(String[] args) {
String safeXML = "<java>\n" +
" <string>Hello, secure world!</string>\n" +
"</java>";
XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(safeXML.getBytes()), null, null, new ClassLoader() {
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (!name.equals(String.class.getName())) {
throw new SecurityException("Unauthorized deserialization attempt: " + name);
}
return super.loadClass(name, resolve);
}
});
Object obj = decoder.readObject();
System.out.println(obj);
}
}