簡體   English   中英

滲透測試:字符串的數據邊界

[英]Pentesting: Data boundaries for Strings

我們已經從第 3 方供應商處進行了滲透測試。 觀察結果之一是沒有數據邊界。 我們的應用程序中有數百萬個領域。 除了偶爾對少數字段進行業務邏輯相關的約束外,沒有對 String 類型字段進行驗證。

筆測試揭示了與許多字符串字段相關的問題,在這些字段中可以插入數值或負值,並且應用程序正在處理相同的內容而沒有任何問題。

我的問題是,這是一個有效的測試嗎? 除非企業特別要求,否則為什么有人會禁止在字符串字段中使用諸如“100”之類的數值? 如果這是一個有效的問題,這意味着必須測試每個 String 屬性的非數字值,這非常瘋狂。 正確的方法應該是什么?

這個答案有點晚了,但希望它對您或其他人仍然有幫助。

這個發現與輸入驗證有關,並且絕對是一個有效的測試。 這是OWASP Foundation 推薦實施的控制措施之一。

當這個未經處理的值傳遞給下游組件時,通常會出現風險,例如數據庫、用戶界面或易受攻擊的功能。

這是一個倉促的例子:

async function chargeUser(userId: number, currency: string) {
    const amount = (await User.getUser(userId)).amountDue;
    return await api.chargeUser(user.id, amount + currency);
}

上面的 Typescript 函數獲取用戶 ID 和貨幣,然后調用 API 以向用戶收取當前訂閱的費用。 讓我們做幾個假設:

  • API 需要格式為“100USD”或“100”的金額。
  • API 允許對退款收取負費用。
  • 如果不包括貨幣,API 將假定為美元。
  • 如果幣種未知,API 調用將失敗並出現錯誤。
  • 用戶當前有 100 美元的應付款項。

在正常情況下,員工會從 UI 發出請求,指定向用戶收費的貨幣。他們無法控制向用戶收取的費用:

{"userId": 1, "currency": "USD"}

正如預期的那樣,這將導致向用戶收取 100 美元的費用。

但是,攻擊者可以利用 Javascript 的松散類型和缺乏輸入驗證來向用戶收取超出應付款的費用:

{"userId": 1, "currency": 10000}

由於 100 + 10,000 是 10,100,如果省略,API 假定貨幣,這將導致向用戶收取 10,100 美元。

同樣,攻擊者可以改為執行以下操作:

{"userId": 1, "currency": -100100}

由於 100 - 100,1000 是 -100,000 並且 API 支持負數,這將導致用戶將 100,000 美元存入他們的銀行賬戶。

由於滲透測試是有時間限制的,並且滲透測試人員通常無法訪問您的后端代碼或對您的應用程序擁有與您的團隊相同水平的深入了解,因此通常無法確定可能發生這種情況的每個潛在實例,因此確保對所有字段進行正確輸入驗證的廣泛建議。

來自用戶的任何輸入,針對所有字段,針對所有請求, 都應始終盡可能得到最大程度的驗證

由於您有大量共享相似驗證邏輯的字段,您可能希望實現一個負責驗證的共享函數,可能根據模式。 有關可能的解決方案,請參閱:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM