压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

對JSON Web Services的Fuzz研究

模糊JSON服務,特別是使用Python,Ruby和JavaScript等動態腳本語言實現的服務通常是一項富有成效的工作。 然而,我的觀察是,在測試過程中,這種情況很少做得很好。 在這篇博文中,我想給你一個關于我如何傾向于這樣做的簡要說明。 不用說,我使用我自己的工具箱,因為它是專門為此設計的,但如果這是您的想法,您可以使用自己的工具。 讓我們開始吧。

JSON Web服務是以JSON文檔作為輸入的簡單Web服務。 它們可以從您喜愛的云基礎設施(如AWS,Azure和Google Cloud)廣泛獲得,可用于手機,手表,電視和冰箱。 幾乎所有東西都與JSON通信。 這種豐富的原因是因為與其他文檔格式(如XML,YAML,INI等)不同,JSON相對簡單,緊湊并且不容易出現奇怪的錯誤。 所有現代編程語言和環境都支持JSON的屬性和易用性。

在很多編程語言中,例如JavaScript,以及Ruby和Python的擴展,JSON都是一流的公民。 這意味著JSON文檔不僅僅是外來的對象模型,而且是自然的對象,因此它們可以像任何其他普通對象一樣被訪問。 例如,請考慮以下請求:

POST /path/to/service HTTP/1.1
Host: service
Content-Length: xxxx
Content-Type: application/json

{
    "profile": {
        "name": "Bob",
        "age": 40
    }
}

為了訪問屬性“profile”中的字段“name”,開發人員可能會在JavaScript中執行如下操作:

// this is what you will normally see in ES5

updateProfile(body.profile.name, body.profile.age)

// ...or in modern ES6 may even look like this which looks a bit safer

const { profile={} } = body
const { name, age } = profile

updateProfile(name, age)

請注意,“姓名”和“年齡”字段均直接從“個人資料”中提取。 還注意到我們沒有驗證這兩個領域的類型,也沒有對它們進行規范化。 雖然在這個例子中這太方便了,但絕大多數公開代碼并不太可能。

利用這一點在很大程度上取決于服務和“updateProfile”函數的實際功能。 因此,我們可以遵循的沒有特定的開發風格。 我們無法貼上一些已知的壞字,希望看到快速的結果。 相反,我們需要分析應用程序行為并推斷可能發生的情況以及是否有機會進行開發。 這是我們需要卷起袖子并開始模糊的地方。 模糊什么和如何?

顯然,我們需要為名稱和年齡道具嘗試不同的值。 而且,我們需要嘗試一些意想不到的容器值,例如數組和對象。 例如,updateProfile函數可能會預期一個對象,例如{first,last}而不是一個字符串。 這些檢查可能被實現,而不考慮如何使用“updateProfile”函數以及從JSON主體反序列化的數據,結果,它有助于代碼中的分支,其中可能包含當名稱字段僅僅是 串。 這些是我們需要通過模糊自動嘗試的事情。

我將在此練習中使用AppBandit,但如果您想編寫自己的置換器,您還可以使用Fuzzer甚至自己的工具。 我已經為AppBandit和HTTPView做了這個,所以我不想浪費我的周期,因此我為什么要使用這些工具。

我們啟動AppBandit并打開一個新的Fuzzer選項卡。 在內部,我們需要像下面的截圖一樣設置基本請求。 在這種情況下,我們沒有做任何事情。 這只是準備下一階段的指南。

現在我們需要配置JSON文檔,以便我們可以對不同的組合進行置換。 為此,我們將使用JSON Fuzz生成器。 導航到正文并從下拉列表中選擇JSON模糊。 在第一個領域,我們需要設置我們的文檔。 在第二個領域,我們將設置您的有效載荷。

如果我們只在有效載荷字段中輸入一個簡單的字符串,它將按原樣使用。 例如,如果有效載荷是“測試”,那么JSON模糊生成器將生成兩個文檔,如下所示:

{
    "profile": {
        "name": "test",
        "age": 40
    }
}

and

{
    "profile": {
        "name": "Bob",
        "age": "test"
    }
}

但是,這不會幫助我們找到任何漏洞,因此我們將使用其他一些生成器來提取更多價值。 讓我們使用一個字典生成器,我們可以從下拉列表中選擇。 從字典的下拉列表中選擇FuzzDB,然后選擇“攻擊/ json / JSON_Fuzzing.txt”。 請記住,AppBandit默認不會嵌入任何這些字典。 當你需要它們時,它們將被當場下載。

現在我們已經加載了列表,我們也可以編輯它,以便我們可以包含我們自己的有效載荷。 隨意添加任何你認為可能有用的東西。 更多的有效載荷我們擁有更好的模糊性。 這就是說,你可以預覽如何在箭頭按鈕的幫助下生成有效載荷。 請注意,目前我們正在以JSON格式正確引用有效負載,這意味著它們將被解釋為字符串。

這不是我們想要的。 我們想要的是使用原始JSON,并且要做到這一點,我們需要選擇“Parse payload”和“Ignore payload parsing errors”選項。 現在它可以正確生成,如下圖所示。

我們完成了這個。 退出發生器彈出窗口并使用箭頭按鈕循環訪問取樣的模糊器有效負載。 注意如何正確生成一切。

在我們點擊播放按鈕之前,我喜歡配置更多選項。 將請求超時設置為更方便的一項,并將最大連接數增加到60,以便我們可以更快地完成這項工作。

有時,應用程序可能因某種原因而行為不當。 不要失望。 如果發生這種情況,請單擊Fork按鈕以創建當前配置的精確副本并執行另一個測試。 這很容易。

現在我們完成了。 測試立即完成。 下一步是分析結果,看看服務是否有什么奇怪的事情發生。 這背后沒有科學。 您只需要瀏覽結果集以找出不當行為,并且如果您使用AppBandit重新發送工具重復此操作,以便您可以進一步確認并進一步探索/利用。

我知道我沒有深入研究一旦發現問題后應該怎么做。 如果您仔細考慮,這是一個開放式問題。 與SQL注入或跨站點腳本和本地文件包含不同,這不是預定義的漏洞。 換句話說,我們可以注入一些有趣的字符來實現某種代碼執行。 但是,使用正確的JSON負載,我們可以控制可能導致漏洞的代碼。 盡管目前我無法透露任何真實世界的情景,但我們當然看到很多情況下,這種方法會產生有趣和可利用的結果。

原文:https://secapps.com/blog/2018/03/fuzzing-json-web-services

上一篇:Encryption 101:一個惡意軟件分析師的入門書

下一篇:后量子時代的應用密碼策略