反序列化存在的意義是為了數(shù)據(jù)傳輸,類是無法直接進(jìn)行傳輸?shù)?。通過序列化后轉(zhuǎn)換為字符串格式或者JSON格式進(jìn)行傳輸。
序列化與反序列化
-
seriallization 序列化 : 將對象轉(zhuǎn)化為便于傳輸?shù)母袷剑?常見的序列化格式:二進(jìn)制格式,字節(jié)數(shù)組,json字符串,xml字符串。
-
deseriallization 反序列化:將序列化的數(shù)據(jù)恢復(fù)為對象的過程。
PHP反序列化漏洞
PHP反序列化
-
serialize()將對象序列化成字符串。
-
unserialize()將字符串反序列化回對象。
序列化
-
對象轉(zhuǎn)換成字符串
-
方便傳輸
反序列化
-
字符串轉(zhuǎn)換成對象
-
O:object
<?php
//創(chuàng)建類
class Stu{
public $name;
public $age;
public $sex;
}
//創(chuàng)建對象
$stu1 = new Stu();
$stu1->name = "wuhu";
$stu1->age = 18;
$stu1->sex = true;
var_dump($stu1);
echo "<hr />";
echo serialize($stu1);
?>
類中的魔術(shù)方法,在特定情況下會(huì)自動(dòng)調(diào)用。即使魔術(shù)方法在類中沒有被定義,也是真實(shí)存在的。
兩個(gè)下劃線:
- __construct():在創(chuàng)建對象時(shí)自動(dòng)調(diào)用。
- __destruct()::在銷毀對象時(shí)自動(dòng)調(diào)用。
- __wakeup():unserialize()時(shí)會(huì)自動(dòng)調(diào)用這個(gè)函數(shù)。
- __sleep():serialize()時(shí)會(huì)自動(dòng)調(diào)用這個(gè)函數(shù)。
以_開頭的函數(shù),是PHP中的魔術(shù)方法,是為了更快的響應(yīng)。__wakeup()和__sleep()方法在互聯(lián)網(wǎng)上會(huì)被頻繁調(diào)用。
反序列化漏洞不能通過黑盒測試來查找漏洞。只能通過白盒測試,也就是代碼審計(jì)。
反序列化漏洞攻擊者是不可控的,因?yàn)楣δ艽a全是開發(fā)者自己寫的。
<?php
class animal{
public $name;
public $age;
public function __sleep(){
if(@$_GET['cmd']=="abc"){
a();
}
}
}
$an1=new animal;
$an1->name="dog";
$an1->age=3;
//var_dump($an1);
@serialize($an1);
?>
什么是反序列化漏洞?
序列化和反序列化本身是為了實(shí)現(xiàn)數(shù)據(jù)在網(wǎng)絡(luò)上完整高效的傳輸,但是由于反序列化過程中,對象的魔術(shù)方法會(huì)自動(dòng)調(diào)用,魔術(shù)方法本身調(diào)用了別的方法,最終呈現(xiàn)一種鏈?zhǔn)秸{(diào)用,直到執(zhí)行任意的代碼或者命令。并且危險(xiǎn)函數(shù)的參數(shù)可控。
修改序列化后的數(shù)據(jù),目的是什么?
為了滿足一定的條件以后實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。
Java反序列化漏洞
序列化:
ObjectOutputStream --> writeObject()
反序列化:
ObjectInputStream --> readObject()
實(shí)驗(yàn)
Person類
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
public class Person implements Serializable {
public int age;
public String name;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
Runtime.getRuntime().exec("calc");
// 默認(rèn)的反序列化操作
in.defaultReadObject();
}
}
注意:想讓某個(gè)類執(zhí)行序列化或者反序列化必須實(shí)現(xiàn)Serializable接口。
Test類
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p=new Person();
p.age=18;
p.name="wuhu";
//將Person這個(gè)類的對象序列化后存放到wuhu.bin文件中
//沒有指定路徑就表示存放到當(dāng)前路徑中
serialize(p,"wuhu.bin");
System.out.println("反序列化結(jié)果:" + deserialize("xiu.bin"));
}
//序列化
public static void serialize(Object obj, String filePath) throws IOException {
try (FileOutputStream fileOut = new FileOutputStream(filePath);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
objectOut.writeObject(obj);
}
}
//反序列化
public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
try (FileInputStream fileIn = new FileInputStream(filePath);
ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
return objectIn.readObject();
}
}
}
序列化后的字符串
說明:不同的編程語言的序列化和反序列化后的數(shù)據(jù)格式不一樣。
那么漏洞點(diǎn)在哪里?
將Person類中的readObject方法注釋了執(zhí)行的時(shí)候,輸出結(jié)果就是輸出了反序列化后的結(jié)果。
那么如果重寫readObject方法后,在方法中添加一個(gè)Runtime.getRuntime().exec("calc");
這行代碼使用 Java 的 Runtime
類執(zhí)行操作系統(tǒng)命令,即在 Windows 系統(tǒng)上運(yùn)行計(jì)算器應(yīng)用程序(calc)。執(zhí)行結(jié)果如下:
在實(shí)際的開發(fā)環(huán)境中,需要重寫readObject()方法,例如:從前端傳遞的值是base64編碼的,而系統(tǒng)的方法不識(shí)別base64,所以需要在重寫的readObject()方法中先解碼,將解碼完的對象再去調(diào)用系統(tǒng)的方法。
漏洞成因
Java反序列漏洞的成因是函數(shù)的鏈?zhǔn)秸{(diào)用,滿足鏈?zhǔn)秸{(diào)用的全部條件,并且參數(shù)可控制。以及重寫了readObject()方法,才能造成Java反序列漏洞。(條件苛刻)。當(dāng)然如果沒有重寫readObject()方法,執(zhí)行的就是系統(tǒng)的反序列化方法,也就沒有了反序列化漏洞了。
什么是反序列化漏洞?
PHP的反序列化和java的反序列化是兩種不同的類型,序列化和反序列化本身沒有漏洞點(diǎn),只是為了實(shí)現(xiàn)數(shù)據(jù)的完整高效的傳輸。
PHP反序列漏洞是由于類里面的魔術(shù)方法調(diào)用了某個(gè)函數(shù),該危險(xiǎn)函數(shù)又調(diào)用了別的函數(shù),最終執(zhí)行到了危險(xiǎn)函數(shù)的位置。
JAVA反序列化漏洞是由于開發(fā)者重寫了readObject方法,該readObject方法方法調(diào)用了別的方法,最終執(zhí)行到了例如Transfrom方法的危險(xiǎn)方法(鏈?zhǔn)秸{(diào)用)。文章來源:http://www.zghlxwxcb.cn/news/detail-732146.html
shiro :爆破密鑰,找尋CC利用鏈文章來源地址http://www.zghlxwxcb.cn/news/detail-732146.html
到了這里,關(guān)于Java反序列化和PHP反序列化的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!