API成批分配漏洞介紹

来源:https://www.cnblogs.com/wintersun/archive/2023/11/25/17855855.html
-Advertisement-
Play Games

API成批分配漏洞介紹API 特定:可利用性 2 利用通常需要瞭解業務邏輯、對象關係和 API 結構。 在 API 中利用批量分配更容易,因為按照設計,它們公開了應用程式的底層實現以及屬性名稱。安全弱點: 現代框架鼓勵開發人員使用自動將客戶端輸入綁定到代碼變數和內部對象的函數。 攻擊者可以使用這種方 ...


API成批分配漏洞介紹

API 特定:可利用性 2

     利用通常需要瞭解業務邏輯、對象關係和 API 結構。 在 API 中利用批量分配更容易,因為按照設計,它們公開了應用程式的底層實現以及屬性名稱。

安全弱點:

      現代框架鼓勵開發人員使用自動將客戶端輸入綁定到代碼變數和內部對象的函數。 攻擊者可以使用這種方法來更新或覆蓋開發人員從未打算公開的敏感對象的屬性。

影響:

      利用該漏洞可能會導致許可權升級、數據篡改、繞過安全機制等。

API 是否容易受到攻擊?
       現代應用程式中的對象可能包含許多屬性。 其中一些屬性應由客戶端直接更新(例如,user.first_name 或 user.address),而另一些則不應該(例如,user.is_vip 標誌)。

如果 API 端點自動將客戶端參數轉換為內部對象屬性,而不考慮這些屬性的敏感性和暴露級別,則該端點容易受到攻擊。 這可能允許攻擊者更新他們不應訪問的對象屬性。

敏感屬性的示例:

許可權相關屬性:user.is_admin、user.is_vip 只能由管理員設置。
與流程相關的屬性:user.cash 只能在付款驗證後在內部設置。
內部屬性:article.created_time 只能由應用程式內部設置。

攻擊場景示例
場景#1
       乘車共用應用程式為用戶提供了編輯其個人資料的基本信息的選項。 在此過程中,API 調用將使用以下合法 JSON 對象發送到 PUT /api/v1/users/me:

{“用戶名”:“inons”,“年齡”:24}
請求 GET /api/v1/users/me 包含一個額外的credit_balance 屬性:

{"user_name":"inons","age":24,"credit_balance":10}
攻擊者使用以下有效負載重放第一個請求:

{“user_name”:“攻擊者”,“年齡”:60,“credit_balance”:99999}
由於端點容易受到大規模分配的影響,攻擊者無需付費即可獲得積分。

場景#2
        視頻共用門戶允許用戶上傳和下載不同格式的內容。 探索 API 的攻擊者發現端點 GET /api/v1/videos/{video_id}/meta_data 返回帶有視頻屬性的 JSON 對象。 其中一個屬性是“mp4_conversion_params”:“-v codec h264”,這表示應用程式使用 shell 命令來轉換視頻。

       攻擊者還發現端點 POST /api/v1/videos/new 容易受到批量分配的影響,並允許客戶端設置視頻對象的任何屬性。 攻擊者設置惡意值如下:“mp4_conversion_params”:“-v codec h264 && format C:/”。 一旦攻擊者將視頻下載為 MP4,該值將導致 shell 命令註入。


攻擊者利用批量分配漏洞:

當來自客戶端的手動修改不可變內部對象屬性的請求不受 API 端點限制時,就會出現 API 批量分配漏洞。

攻擊者可以利用此漏洞,通過構建 HTTP 請求來升級用戶許可權、繞過安全機制或使用任何其他方法使 API 端點以非設計的方式工作。

註意:批量分配和過多數據暴露在 OWASP API Sec 2019 中是一個單獨的風險類別,現在已合併到名為“損壞對象屬性級別授權”的新風險類別中

image



如何預防
如果可能,請避免使用自動將客戶端輸入綁定到代碼變數或內部對象的函數。
僅將應由客戶端更新的屬性列入白名單。
使用內置功能將客戶端不應訪問的屬性列入黑名單。
如果適用,請顯式定義並強制執行輸入數據有效負載的架構。
增加反序列化配置

#1、在項目的統一序列化配置中開啟嚴格匹配模式(?如有),此處以jackson為例
@Configuration
public class JacksonConverters {
     @Bean
     public HttpMessageConverters JacksonHttpMessageConverters() {
         MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter
                 = new MappingJackson2HttpMessageConverter();
         ObjectMapper objectMapper = new ObjectMapper();
         //省略其他配置開始
         //反序列化的時候如果多了其他屬性,拋出異常
         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
         //省略其他配置結束
      }
}
 
#2、統一異常捕獲或者返回處增加非200狀態碼
     /**
      * 捕獲反序列化異常HttpMessageNotReadableException,增加500狀態碼返回
      * @param request   請求
      * @param exception 異常對象
      * @return 響應
      */
     @ExceptionHandler(value = HttpMessageNotReadableException.class)
     public ResponseEntity<Map<String, Object>> methodHttpMessageNotReadableExceptionHandler(
             HttpServletRequest request, HttpMessageNotReadableException exception) {
         //按需重新封裝需要返回的錯誤信息
         WebRequest webRequest = new ServletWebRequest(request);
         Map<String, Object> body = errorAttributes.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults());
         body.put(DATA, "convert exception message to JSON");
         body.put(STATUS, HttpStatus.INTERNAL_SERVER_ERROR.value());
         body.put(MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
         body.put(SUCCESS,false);
         return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
     }
 
#2、或在在其他異常攔截方法上增加狀態碼註解
     @ResponseStatus()


介面使用參數簽名機制,如HMac, HMac Springboot, 微信支付參數簽名

#前端請求
 
請求 URL: http://localhost/cars/query
請求方法: POST
HTTP狀態碼:200
playload:{"color":"red","company":"ltl","seats":"2-2"} #正常請求
Header:sign:ErOVBda4VMFdX9aixigRslAjY0rhT7lLxy
 
#後端controller
@PostMapping(value = "/query")
public BaseResponse query(@RequestBody Car car){
     String signFront=request.header("sign");
     String signBackend=signUtils.handler(car);
     if(!signBackend.equals(signFront)){
         throws new ServiceErrorException("簽名異常");       
     }
}


Jackson類庫解決方案

Solution - Jackson @JsonView
We can create JSON view like below:

public class View {
    
    public static class Editable {}
    public static class Viewable extends Editable {}
    public static class Internal extends Viewable {}
}

Then annotate our mode class:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Model implements Serializable {

 @JsonView(View.Editable.class)
 protected String editableField;

 @JsonView(View.Viewable.class)
 protected String viewableField; 

 @JsonView(View.Internal.class)
 protected String internalField;
}

At last, we annotate out jax-rs resource with @JsonView annotation. 
 @GET
 @Produces(MediaType.APPLICATION_JSON )
 @JsonView(View.Viewable.class)
 public Iterable<Model> search() {}

 @GET
 @Path("{id}")
 @Produces(MediaType.APPLICATION_JSON )
 @JsonView(View.Viewable.class)
 public Model getModel(@PathParam("id") final String id) {}

 @POST
 @Consumes({MediaType.APPLICATION_JSON})
 public Response add(@JsonView(View.Editable.class) final Model model) {}

Spring MVC provides data binder that we can specify what fields are not allowed.

禁用欄位:

@InitBinder public void initBinder(WebDataBinder binder) {
     binder.setDisallowedFields(DISALLOWED_FIELDS);
}

允許欄位:

@Controller
public class UserController {
     @InitBinder
     public void initBinder(WebDataBinder binder, WebRequest request) {
             binder.setAllowedFields(["userid", "password", "email"]);
         }
         ...
}


參考
External

今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章:
領導人怎樣帶領好團隊
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
視頻直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續集成/CD
互聯網電商購物車架構演變案例
互聯網業務場景下消息隊列架構
互聯網高效研發團隊管理演進之一
消息系統架構設計演進
互聯網電商搜索架構演化之一
企業信息化與軟體工程的迷思
企業項目化管理介紹
軟體項目成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共用
高效能的團隊建設
項目管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
互聯網資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之性能實時度量系統演變

如有想瞭解更多軟體設計與架構, 系統IT,企業信息化, 團隊管理 資訊,請關註我的微信訂閱號:

MegadotnetMicroMsg_thumb1_thumb1_thu[2]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 該文章也同時發佈在我的獨立博客中-Petter Liu Blog。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 JSONP是一種很遠古用來解決跨域問題的技術,當然現在實際工作當中很少用到該技術了,但是很多同學在找工作面試過程中還是經常被問到,本文將帶您深入瞭解JSONP的工作原理、使用場景及安全註意事項,讓您輕鬆掌握JSONP。 JSONP是什麼? ...
  • 事件匯流排是對發佈-訂閱模式的一種實現。 發佈-訂閱模式定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都將得到通知。 發佈-訂閱模式實現了松耦合,發佈者不是直接將消息發送給訂閱者,而是經過了一個中間的代理,事件匯流排就是一種中間代理的實現。 ...
  • matplotlib是基於python生態開發的一個可視化繪圖庫,它的出現讓python在數據分析及機器學習方面占了重要的一部分,目前很多數據分析及機器學習相關方面的工程都有使用到這個庫,並且由於其簡單易用,安裝簡單等方面的優勢深得廣大開發者的喜愛。 ...
  • 15.1、常用組件 15.1.1、 DispatcherServlet DispatcherServlet 是前端控制器,由框架提供,不需要工程師開發; 作用:統一處理請求和響應,整個流程式控制制的中心,由它調用其它組件處理用戶的請求。 15.1.2、HandlerMapping HandlerMapp ...
  • 前言: 在Spring Boot中實現快遞鳥、順豐和快遞100的物流查詢功能通常需要與它們提供的API進行交互。當然使用他們的API 我們是需要申請和註冊,從而去拿到 key 來進行調用。所以為註冊的必須先進行註冊,以下是他們的官網地址,可以快捷到達。 快遞鳥官網:快遞鳥 - 快遞查詢介面_免費快遞 ...
  • SQLite,作為一款嵌入式關係型資料庫管理系統,一直以其輕量級、零配置以及跨平臺等特性而備受青睞。不同於傳統的資料庫系統,SQLite是一個庫,直接與應用程式一同編譯和鏈接,無需單獨的資料庫伺服器進程,實現了資料庫的零配置管理。這種設計理念使得SQLite成為許多嵌入式系統、移動應用和小型項目中的... ...
  • 操作系統 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 python版本:3.9.12 libpcap版本:1.11.0b7 FreeSWITCH的ESL模塊用起來很方便,可以控制FreeSWITCH實現具體業務需求,但該模塊沒有提供ESL命令執行日誌,不便於排查問題,本 ...
  • 在本期文章中,我們深入探討了Python的對象繼承、組合以及多態這三個核心概念。從繼承的靈活性,如Python的多重繼承和super關鍵字的使用,到組合中的動態屬性添加,我們逐一解析了Python與Java在這些方面的相似之處和差異。通過具體的例子,我們展示了Python中多態的直觀表現,強調了它與... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...