APISandbox | 4ASystem: 4A认证系统下的API平行越权
文章讨论了4A认证系统下的API平行越权漏洞,攻击者通过弱口令爆破进入Web1后,利用未验证新密码的API调用越权更改其他应用的密码。 2025-4-27 03:31:33 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

一、概述

背景可以看看前篇:https://www.freebuf.com/articles/web/428164.html

二、4ASystem: 4A认证系统下的API平行越权

总共四个web站,一个4a系统,三个应用分别为web1 web2 web3。同一个用户名三个系统的密码不一样,无法撞库攻击。

4A API:

  1. 登录验证 输入 应用名、用户名、密码 返回成功/失败

  2. 改密码 输入 应用名 用户名 新密码 返回成功/失败

web1,登录密码进入后台,重置密码功能界面输入:用户名、老密码、新密码。后端往4a系统的api验证用户名密码正确之后,后端对4a系统api发起改密码请求,发送:应用名(web1)、用户名、新密码。登录、验证密码、改密码请求均由web1后端对4a系统发起。

攻击过程:审计发现对4a系统api调用未验证新密码,越权更改web2、web3的密码。

docker-compose build
docker-compose up -d
docker ps -a
查看容器
确定应用(端口)拓扑关系

image.png!

用户名密码:

web1弱口令,web2/3容器启动时随机生成

使用docker logs <container_id>查看4asystem的日志:

内容为:

sql.db does not exist!
create sql.db success!

    ####################################################
    ##  web1: admin/admin888                          ##
    ##  web2: admin/638ef46bd9053f30932c7d4ce08bb2f8  ## 
    ##  web3: admin/e1168c6a97223bac0b0aef9ab8682fb4  ##
    ####################################################
...
查看docerk日志(因为没字典所以开了上帝视角)

image

1、口令爆破

用burp简单模拟爆破了一下
1、添加payload位置

image

开始攻击,输出结果
查看响应,有success,查看请求的账密

image

image

2、弱口令登陆Web1应用

攻击者通过弱口令字典暴力破解出web1应用的口令

3、源代码泄露和审计

通过扫描目录发现源码泄露

脚本小子自有办法

image

image

审计代码发现4a系统api调用未验证新密码

在审计代码时发现,调用 4a系统API 进行密码重置时,代码中并没有对用户输入的 新密码 (newpassword) 进行任何验证。
    $data = array(
        'username'    => $username,
        'newpasswd'   => $newpassword,
        'application' => 'web1'
    );
也没有要求输入旧密码,em...

<?php
session_start();
// 检查是否有'action'参数,若没有则终止脚本
if(!isset($_GET['action'])){
    die();
}
$action = $_GET['action'];

// 定义登录和重置密码的API接口地址
$loginapi = "http://192.168.10.10:8080/api/v1/sys_authenticate";
$resetapi = "http://192.168.10.10:8080/api/v1/sys_passwdreset";

// 根据'action'参数值执行对应的操作
if($action==='login' && $_POST['username'] && $_POST['password']){
    $username = $_POST['username'];
    $password = $_POST['password'];
    // 调用Login函数进行登录验证
    if(Login($loginapi,$username, $password)!==null){
        echo 'success';//
    }else{
        echo 'fail';
    }
}
elseif($action==='changepass' && isset($_COOKIE['PHPSESSID'])){
    // 检查是否有用户名、旧密码和新密码输入
    if(isset($_POST['username'])  && isset($_POST['oldpassword']) && isset($_POST['newpassword'])){
        $username    

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/428580.html
如有侵权请联系:admin#unsafe.sh