“Nothing happens without a cause.” --斯宾诺莎 (Baruch Spinoza)
曾经有个眼神清澈的年轻人在酒店房间浏览网页,看着看着,他心跳加速、面红耳赤。突然间,他看到一个令他困惑的东西——一条链接的末尾赫然挂着 ?WSDL。这是什么?难道是建站者想宣告“我(W)是(S)大(D)佬(L)”吗?为了解开谜团,这位青年开始翻阅资料……

一、扒一扒WSDL的底
WSDL(Web Services Description Language,Web服务描述语言)是一种基于 XML 的语言,用于描述网络服务的具体功能。 它的主要目的是告诉外界:
“我这里提供了一个服务。”
“这个服务可以通过什么方式访问(地址、协议)。”
“这个服务里有哪些可以调用的方法(函数)。”
“调用这些方法需要传入什么参数,参数是什么类型。”
“调用成功后,它会返回什么样的数据。”
文字叙述有点抽象,我们找个实际的网站看看。可以用类似下面的语法进行搜索:
QUAKE:body:"<wsdl:" AND title:"WebService Web 服务"
正常打开的界面通常如下所示(这也是一个特征,.NET 架构的 WebService 页面大多长这样):

然后访问 http://yoururl?wsdl,就可以看到其 WSDL 的 XML 描述了:

打开后会看到大量 XML 标签,它们的主要含义如下:
- types: 定义参数和返回值的数据类型(比如字符串、整数、或是自定义的复杂对象)。
- messages: 说明每个功能需要什么输入(参数)和会产生什么输出(返回值)。
- portType: 说明服务提供哪些大类功能(操作)。
- binding: 说明服务使用的通信协议(如 SOAP over HTTP)。
- service: 如何连接到服务。
在任何资料里寻找 WSDL 都会发现它和 SOAP 密不可分,它们俩的关系就像初恋的大学生,火热、清澈、难舍难分~

它们具体是如何协作的呢?我们用一个例子来说明。假设有个服务器发布了一个 WSDL,提供查询“开房次数”的功能:
<!-- 示例:WSDL中定义的查询开房次数记录操作 -->
<wsdl:operation name="getkaifanglog">
<wsdl:input message="tns:getkaifanglogRequest"/>
<wsdl:output message="tns:getkaifanglogResponse"/>
</wsdl:operation>
这时候,一个叫小美的女孩看到了这个 WSDL,想查询男朋友小帅的开房记录,于是她根据 WSDL 的描述构造了对应的 SOAP 请求:
<soap:Envelope xmlns:soap="...">
<soap:Body>
<getkaifanglog xmlns="http://example.com/xxx">
<name>小帅</name>
</getkaifanglog>
</soap:Body>
</soap:Envelope>
服务器查询到小帅的开房记录后,用 SOAP 响应的形式告诉了小美:
<soap:Envelope xmlns:soap="...">
<soap:Body>
<getkaifanglogResponse xmlns="http://example.com/kaifanglog">
<number>2,147,483,647</number>
</getkaifanglogResponse>
</soap:Body>
</soap:Envelope>
小美伤心欲绝,从此发誓要远离渣男,并留下了下面这张关系图。

总结一下:WSDL 是一份基于 XML 的详细说明书,它告诉客户端如何与一个 SOAP Web 服务进行交互,包括服务地址、可用方法和参数格式。
二、WSDL相关的一些漏洞利用
既然 WSDL 暴露了服务的交互方式,攻击者就可以利用它来寻找潜在的漏洞入口。以下是基于内网靶场环境的一些基础测试示例。
1. 信息泄露(用户枚举)
既然 WSDL 描述了可调用的方法,攻击者就可以尝试调用那些可能返回敏感信息的方法,例如查询用户信息的接口:

2. 常见Web漏洞如XXE、SQL注入
SOAP消息本质是XML,因此可能存在XXE(XML外部实体注入)漏洞:

同样,如果后端对参数处理不当,也可能存在SQL注入:

3. 高效测试工具推荐:Wsdler
在安全测试中,手动解析和构造SOAP请求比较繁琐。这里推荐一个Burp Suite商店自带的扩展——Wsdler,下载和使用都非常方便。

安装后,在Burp中捕获到WSDL请求或找到WSDL地址时,右键菜单选择“扩展” -> “Wsdler” -> “解析WSDL”即可。

插件会自动解析WSDL文件,并生成所有可调用的SOAP请求模板,显示在Target站点地图或一个独立标签页中。

这样,测试人员就可以快速地将这些请求发送到Repeater模块进行手动测试和漏洞挖掘。(注意:在非授权测试环境下,务必做好授权和隔离措施。)

三、防御建议
- 访问控制:在生产环境中,考虑禁用或严格限制对
?wsdl 页面的访问(例如,仅允许内网特定IP或管理用户访问)。
- 安全解析:在服务端使用严格的XML解析器,并禁用DTD和外部实体解析(例如,设置
resolve_entities=False)。
- 输入校验:对所有来自SOAP请求的输入参数进行严格的校验、过滤和净化,采用白名单策略。
- 防SQL注入:使用参数化查询(预编译语句)来避免SQL注入风险。
- 权限管理:对SOAP服务实施严格的身份验证和基于角色的访问控制(RBAC),确保用户只能访问其权限范围内的操作。