<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          理解反序列化漏洞原理

          共 3154字,需瀏覽 7分鐘

           ·

          2021-03-26 08:38

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)


          反序列化漏洞一直搞不明白,所以今天特意翻出很久未動(dòng)的java,學(xué)習(xí)了一下序列化。


          簡單來說,序列化可以理解為就是將對(duì)象轉(zhuǎn)化為字節(jié)流,字節(jié)流中包括這個(gè)對(duì)象的數(shù)據(jù)和信息,序列化和反序列化便于類的持久保存,并且很利于網(wǎng)絡(luò)傳輸。在面向?qū)ο蟮木幊讨?,都?huì)涉及到序列化和反序列化,像java中,有一個(gè)接口Serializable,用來實(shí)現(xiàn)java序列化,php中也有Serializable方法來實(shí)現(xiàn)php序列化。這里我寫了一個(gè)java的序列化。


          下面是一個(gè)student類,為實(shí)現(xiàn)序列化,需要繼承Serializable接口

          import java.io.Serializable;

          public class student implements Serializable {
              private String name;
              private String age;

              public void setAge(String age) {
                  this.age = age;
              }

              public void setName(String name) {
                  this.name = name;
              }

          }



          然后我在main函數(shù)中實(shí)現(xiàn)序列化。通過流,將一個(gè)名為s的student類 序列化,并將其存到Student.ser文件中

          import java.io.FileNotFoundException;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.ObjectOutputStream;

          public class run {
              public static void main(String[] args) {
                  student s = new student();
                  s.setAge("21");
                  s.setName("Hileaf");
                  try {
                      FileOutputStream fileOut = new FileOutputStream("Student.ser");
                      ObjectOutputStream out = new ObjectOutputStream(fileOut);
                      out.writeObject(s);
                      out.close();
                      fileOut.close();

                  } catch (FileNotFoundException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }



          運(yùn)行后,序列化過的s如下:

          我們不用關(guān)心亂碼。我們這里把字節(jié)流存入到ser文件中,并且,這條字節(jié)流也可以保存在內(nèi)存、數(shù)據(jù)庫中。

          而反序列化,就是通過這條字節(jié)流的數(shù)據(jù)和信息,將它還原成一個(gè)類。這里我們字節(jié)流沒有任何過濾,也就是說,我們?cè)趎ew一個(gè)新的類時(shí),內(nèi)容是用戶可控的,即字節(jié)流就是用戶可控的。

          那么這樣,就容易理解反序列化漏洞了。


          如果Java應(yīng)用對(duì)用戶輸入(即不可信數(shù)據(jù))做了反序列化處理,那么攻擊者可以通過構(gòu)造惡意輸入,讓反序列化產(chǎn)生非預(yù)期的類或?qū)ο?,這個(gè)類或?qū)ο笤诋a(chǎn)生過程中就有可能帶來任意代碼執(zhí)行。

          所以這個(gè)問題的根源在于,字節(jié)流進(jìn)行還原時(shí),即用到ObjectInputStream在反序列化時(shí),沒有對(duì)生成的對(duì)象的類型做限制。這就是java反序列化漏洞的原理,php和Python也基本相同。

          ————————————————

          版權(quán)聲明:本文為CSDN博主「Hileaf」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

          原文鏈接:

          https://blog.csdn.net/qq_50620293/article/details/114982372





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 87
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产小电影在线观看 | 在线观看国内自拍 | 无码人妻少妇 | 日韩操比视频 | 777国产偷窥盗摄精品 |