1. Giới thiệu về Java Object Injection

  1. Serialize

    1. Java cung cấp cho người dùng hàm writeObject để serialize các object.
    2. https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#writeObject(java.lang.Object)

    image.png

  2. Deserialize

    1. Để có thể đọc được dữ liệu đã được serialized từ ObjectInputStream ta sử dụng hàm readObject
    2. https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#readObject()

    image.png

  3. Serialized data trong Java

    1. AC ED 00 05: Magic header của Java serialized object

      image.png

    2. Thuộc tính (field) trong class Users là: name

      image.png

    3. Ljava/lang/String; → kiểu dữ liệu String

      image.png

    4. Giá trị của thuộc tính "name" là chuỗi "Guest”

      image.png

    5. 73 → 's' (ký hiệu serialVersionUID trong stream). Kiểm tra version tương thích giữa serialized data và class hiện tại

      image.png

2. Khai thác Java Object Injection

  1. Java’s Magic method

    image.png

  2. Tùy chỉnh quá trình Serialize và Deserialize

    image.png

    @WebServlet(name = "helloServlet", value = "/hello-servlet")
    public class HelloServlet extends HttpServlet {
    
        private String message;
        public String serializeToBase64(Serializable obj) throws IOException {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(output);
            oos.***writeObject***(obj);
            oos.close();
            return Base64.getEncoder().encodeToString(output.toByteArray());
        }
    
        private static Object deserializeFromBase64(String s) throws IOException, ClassNotFoundException {
            byte[] data = Base64.getDecoder().decode(s);
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
            Object o  = ois.***readObject***();
            ois.close();
            return o;
        }
    

    → Khi thực hiện serialize hoặc deserialize, JAVA sẽ tự động gọi đến các method này.

    3. Hình dạng của lỗi

    image.png