API漏洞挖掘指北-APISandbox靶场通关.1

API漏洞挖掘指北-APISandbox靶场通关.1

原创 摆烂的beizeng 土拨鼠的安全屋 2025-05-06 03:33

  • APIKit
  • APISandbox
  • APISandbox靶场通关
  • 安装
  • OWASPApiTop10
  • 4ASystem

APIKit

APIKit是基于BurpSuite提供的JavaAPI开发的插件。

APIKit可以主动/被动扫描发现应用泄露的API文档,并将API文档解析成BurpSuite中的数据包用于API安全测试。

实际使用效果如图:

APIKit v1.0支持的API技术的指纹有:
– GraphQL

  • OpenAPI-Swagger

  • SpringbootActuator

  • SOAP-WSDL

  • REST-WADL

安装

打开BurpSuite页面,点击Extender然后选择Extensions,添加APIKit.jar。

然后APIKit会对进入到BurpSuite的流量进行被动扫描。解析完成后可以在APIKit面板查看结果,同样Burpsuite的DashBoard也会有issue提示。

APISandbox

  • APISandbox是一个包含多个场景的API漏洞靶场。

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

  • APIVuln: 生产消费流水线中的API缓存投毒

  • GraphqlNotebook: 一个使用GraphQL的留言板以及经典API漏洞

  • InfoSystem: WSDL泄露API越权进后台Getshell

  • OASystem: SpringBoot微服务架构下的API Gateway配置问题

  • OWASPApiTop10: 使用go作为后端实现解释OWASP API Top 10的漏洞

安装

# 下载项目
wget https://github.com/API-Security/APISandbox/archive/refs/heads/main.zip -O APISandbox-main.zip
unzip APISandbox-main.zip
cd APISandbox-~~main

# 进入某一个漏洞/环境的目录
cd OWASPApiTop10

# 自动化编译环境
docker-compose build

# 启动整个环境
docker-compose up -d

APISandbox靶场通关

安装

下载靶场

自动化编译环境

启动环境

看一下容器所在的端口

访问对应的端口即可访问靶场

OWASPApiTop10

使用脚本进行扫描

可以看到所有端口

/v2/register接口任意用户注册

其实这里也存在用户名枚举

用户名存在的时候会提示

{"code":1000,"msg":"Username has already been used!"}

/v1/getenv接口未授权

/v2/user/getuserinfo/2 水平越权

首先需要使用/v2/login接口获取一个普通用户的cookie

修改url中的数字即可越权获取其他用户的信息

/v2/user/getuserprofiles 垂直越权

getuserprofiles接口垂直越权可获取所有用户的信息

/v2/login 暴力破解

该接口没有验证码,可以进行暴力破解

4ASystem

安装

安装完毕之后会有四个容器,我们先访问web1。

弱口令登陆Web1应用

登录接口存在弱口令admin/admin888

web1应用横向越权

web1登录之后发现没啥东西

扫描目录发现www.zip存在源码s.php

发现两个接口

$loginapi = "http://192.168.10.10:8080/api/v1/sys_authenticate";
$resetapi = "http://192.168.10.10:8080/api/v1/sys_passwdreset";

ChangePass函数用来修改web应用的密码。

function ChangePass($url1, $url, $username, $oldpassword, $newpassword){
    $cookie = Login($url1, $username, $oldpassword);
    //$cookie = "MTYyNzU1NTA5NHxOd3dBTkRaS1VWaFNVMGhZVjFFMFdFZFFTMFZCVWpkTlVrVllOa2hYTlZBM05qVkpTa2MzTWpOT1ZETkNOakpKUWxoU1JrRkRVa0U9fLekjnGbigV2zA4BL9IPyp7Q6lzJ53hzvmB2TnIyBsXp";
    //echo $cookie;
    $data = array(
        'username'    => $username,
        'newpasswd'   => $newpassword,
        'application' => 'web1'
    );
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_POST, 1);             // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));   // Post提交的数据包x
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);         // 设置超时限制 防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 1);           // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json","Cookie: GOSESSID=$cookie;"));//设置请求头
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   // 获取的信息以文件流的形式返回

    $res = curl_exec($curl); // 执行操作
    if(curl_errno($curl)) {
        header(500);//捕捉异常
    }
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    curl_close($curl);

    $header = substr($res, 0, $header_size);
    $body = substr($res, $header_size);
    if(preg_match('/200/',$body)){
        return "success";
    }elseif (preg_match('/400/',$body)){
        return "reset Fail";
    }else{
        return null;
    }
}

函数调用

echo ChangePass($loginapi,$resetapi, $username, $oldpassword, $newpassword);

$loginapi = "http://192.168.10.10:8080/api/v1/sys_authenticate";
$resetapi = "http://192.168.10.10:8080/api/v1/sys_passwdreset";

也就是最终通过resetapi进行密码修改,构造一下请求数据包。

首先使用loginapi获取api的凭证

有了凭证访问resetapi即可越权修改web1、web2的应用密码。

这里我不知道为啥访问接口404。