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 中是一個單獨的風險類別,現在已合併到名為“損壞對象屬性級別授權”的新風險類別中
如何預防
如果可能,請避免使用自動將客戶端輸入綁定到代碼變數或內部對象的函數。
僅將應由客戶端更新的屬性列入白名單。
使用內置功能將客戶端不應訪問的屬性列入黑名單。
如果適用,請顯式定義並強制執行輸入數據有效負載的架構。
增加反序列化配置
#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
- CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes
- Testing for Mass Assignment
今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章:
領導人怎樣帶領好團隊
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
視頻直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續集成/CD
互聯網電商購物車架構演變案例
互聯網業務場景下消息隊列架構
互聯網高效研發團隊管理演進之一
消息系統架構設計演進
互聯網電商搜索架構演化之一
企業信息化與軟體工程的迷思
企業項目化管理介紹
軟體項目成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共用
高效能的團隊建設
項目管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
互聯網資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之性能實時度量系統演變
如有想瞭解更多軟體設計與架構, 系統IT,企業信息化, 團隊管理 資訊,請關註我的微信訂閱號:
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發佈在我的獨立博客中-Petter Liu Blog。