在Java中,可以通過網絡執行以下操作來發送和接收對象(不加密)。是否可以通過Man In The Middle攻擊將代碼注入通過網絡傳輸的Java對象?
class Dog {
public void bark(){ System.out.println("Woof! Woof!"); }
}
Client.java
Dog fido = new Dog();
Socket socket = new Socket(new InetSocketAddress("192.168.1.2"), 1234);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(fido);
oos.flush();
oos.close();
Server.java
ServerSocket server = new ServerSocket(1234);
Socket client = server.accept();
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
Dog fido = (Dog)ois.readObject();
ois.close();
fido.bark();
我的問題是,假設你已經成功地建立其發送兩個網絡設備之間的攔截點Java在不安全的鏈接上來回對待,並且你知道他們的協議並且可以修改它們的數據,是否有可能將Java字節碼注入到對象中以改變它們的行爲?
在我們的小例子中,是否有可能使fido
「moo!」而不是吠叫?
您正在發送*數據*,而不是Java *代碼*,因此不會。 – Andreas
請注意,對象序列化僅記錄值以及值應插入的類別。沒有字節碼。這必須已經存在於客戶端和服務器端。所以你可以修改要反序列化的類(到別的東西),它是數據。 –
然而要注意研究發現的方法來創建對象圖,當反序列化導致遠程執行代碼:https://開頭foxglovesecurity。com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-common-this-vulnerability/ –