聲明:本文由Bypass整理並翻譯,僅用於安全研究和學習之用。
文章來源:https://medium.com/bugbountywriteup/how-to-write-secure-code-against-injection-attacks-aad4fff058da
如何編寫安全代碼?保護自己免受注入攻擊!
我已經在這個問題上工作了好幾個月,試圖理解是什么讓代碼變得脆弱,現在,我收到了這個簡單的答案 - 糟糕的編程習慣。現在這看起來很明顯,但編程社區的很大一部分仍然對這個事實一無所知。
了解問題!
我的意思是滲透測試,並有專門的團隊來負責構建的應用程序的安全性是驚人的,總是值得稱贊,但它不是每個人都能負擔得起的。大公司可以吹噓他們的安全實踐,他們如何讓團隊全天候工作以保證客戶數據的安全,但那些沒有資源的人則如此。
我們在銀行,航空,網上購物等最重要的應用程序中出現這些易受攻擊的代碼的最大原因之一是程序員。
最后一行肯定會讓很多人受到冒犯,讓我說我不是故意要抨擊某個社區。我不會這樣做因為它不是他們的錯,在當前編程時代,代碼執行時間需要盡可能低,完全可以理解他們跳過這些部分來增強他們的代碼。
所以,我開始做筆記,可以幫助程序員編寫安全的代碼。我將嘗試涵蓋不同類型的攻擊以及程序員為保持代碼安全而進行的小調整,以便他們的組織不需要再次花錢來保證應用程序的安全。我想我今天已經足夠了,所以讓我們直截了當。
我們來挖掘吧!
讓我開始我的定義注入及其發生的原因。攻擊者輸入惡意有效載荷,可以欺騙解釋器執行非預期的命令或訪問未經授權的數據。注入缺陷的發生是由於不受信任的數據作為命令或查詢的一部分直接發送到解釋器而沒有檢查或清理有效負載導致所有問題的唯一原因。
在本文中,我將介紹三種不同類型的注入攻擊和方法,您可以使用它們來防止它們:
1. SQL注入
這種類型的攻擊主要發生在攻擊者在語句末尾添加一個單引號(')時,將OR添加到語句后面的真值總數。簡單來說,SQL有效負載看起來像這樣
'或1 = 1 -
添加到查詢中的上述語句可以幫助攻擊者獲得對完整數據庫的訪問權限。為了讓您更好地理解下面的查詢,它將為攻擊者提供整個數據庫。
SELECT * FROM Users WHERE UserName ='Aditya'OR 1 = 1--
看看下面的代碼,並試着弄清楚它是否容易受到SQL注入攻擊。
如果您認為上述代碼是安全的,那么您一定要繼續閱讀本文。
代碼不安全的原因是因為攻擊者輸入的值直接作為參數傳遞。只要輸入了預期值,但用戶的輸入可能包含%1 $ tm,%1 $ te和%1 $ tY格式說明符,情況就很好。
如果攻擊者為args [0]傳入值%1 $ tm,則結果將如下。
05不匹配!提示:它是在某個月的23日發布的。 // 05是用戶驗證自己需要知道的月份。
您可以看到該程序本身將在信用卡到期日的當月出爐。
為了避免這種攻擊,下面的代碼可能非常有用。
這兩個代碼之間的唯一區別是,在第一個代碼中,攻擊者輸入的值直接傳遞給程序,而在第二個代碼中,我們不是傳遞值,而是直接將其打印出來,使得整個攻擊無用。
防止SQL注入攻擊應該涉及輸入驗證。我們必須檢查用戶輸入的值,並且我們必須始終假設這些值不受信任,即它們可能會損害應用程序。
我們必須使用帶有綁定變量的參數化查詢,並對用戶輸入的值執行清理。
在上面的圖像中,我們可以看到傳遞的值如何在被代碼使用之前首先被清理。
2.命令注入
這是最危險的注入攻擊類型之一,在當今的情景中仍然很普遍,並沒有得到太多關注。此攻擊利用漏洞,攻擊者可以進入並執行應用程序不期望的命令。
讓我與您分享一個示例,以顯示命令注入攻擊的基本實現。
在上面的圖像中,我們觀察到有一個文本框,我們需要輸入主機名/ IP,然后將獲取有關IP地址的詳細信息,然后呈現給我們。
整個應用程序似乎非常簡單,但它很容易受到代碼注入的影響。要理解我們首先需要弄清楚應用程序是如何工作的,然后我們可以試着找出然后我們就能理解代碼注入是如何工作的。
當我們輸入主機名/ IP時,應用程序實際上會調用終端,然后從那里向我們顯示輸出。那些與終端合作的人他們知道我們可以在終端中使用&&同時傳遞兩個不同的命令。
因此,上圖顯示了代碼注入的確切方式。為了避免這種攻擊,應用程序需要執行路徑驗證(規范化然后進行絕對路徑檢查),應用程序還需要執行輸入驗證以及枚舉它允許用戶輸入和執行的命令。
枚舉{dir,cd,cls}
3. JSON注入
這是一次重要的注入攻擊,而且近年來在應用程序中經常使用API的情況越來越多。當我們在API發出請求和響應查詢時將有效負載注入到傳遞的JSON查詢中時,JSON注入工作。
這個例子很容易理解,這個應用程序有一個下拉菜單,您需要從中選擇一個PenTest工具選項,應用程序將向您顯示您選擇的PenTest工具的詳細信息。
因此,讓我們嘗試了解此應用程序的工作原理。讓我們打開burp-suite並攔截應用程序發出的請求。
因此,在上面的圖像中,我們可以看到ToolId正在請求查詢中發送,我們將有效負載添加到ToolId,以檢查它是否在響應查詢中反映給我們。
我們確實收到了我們在請求查詢中注入的有效負載,因此我們可以確保我們的注入攻擊將通過。讓我們執行攻擊有效載荷並確認攻擊是否有效。
看到我們之前收到的回復,讓我們傳遞此值以獲取cookie值。
“}});警報(document.cookie中); //
在傳入參數中的值之前,我們對其進行url-encode以避免可能已經放置的任何特殊字符限制。
我們可以清楚地看到cookie值已經在警報框中返回給我們,它確認攻擊已經通過。
我們需要檢查攻擊在瀏覽器中的實際情況,並根據需要顯示cookie詳細信息。
防止JSON注入攻擊的最有效方法是在JavaScript上執行編碼技術。OWASP還提供了一種JSON殺菌劑,可用於字符串驗證。
String someValidation = JsonSanitizer.sanitize(myJsonString);
道德
我們可以做的最重要的事情是防止注入攻擊發生,就是相信來自用戶端的任何和所有輸入都可能是攻擊。程序員大多理所當然地認為,用戶輸入的內容不會對導致應用程序中大部分漏洞的應用程序造成傷害。必須對使用方的每個輸入進行消毒,並且必須在應用程序使用之前驗證輸入。用戶輸入的值絕不能直接傳遞給程序。
如果程序員記住這些事情,他們肯定可以防御大多數的注入攻擊。