安全編碼實踐之一:注入攻擊防護

聲明:本文由Bypass整理並翻譯,僅用於安全研究和學習之用。程序員

文章來源:https://medium.com/bugbountywriteup/how-to-write-secure-code-against-injection-attacks-aad4fff058da數據庫

如何編寫安全代碼?保護本身免受注入攻擊!編程

我已經在這個問題上工做了好幾個月,試圖理解是什麼讓代碼變得脆弱,如今,我收到了這個簡單的答案 - 糟糕的編程習慣。如今這看起來很明顯,但編程社區的很大一部分仍然對這個事實一無所知。瀏覽器

瞭解問題!

個人意思是滲透測試,並有專門的團隊來負責構建的應用程序的安全性是驚人的,老是值得稱讚,但它不是每一個人都能負擔得起的。大公司能夠吹噓他們的安全實踐,他們如何讓團隊全天候工做以保證客戶數據的安全,但那些沒有資源的人則如此。安全

咱們在銀行,航空,網上購物等最重要的應用程序中出現這些易受攻擊的代碼的最大緣由之一是程序員。cookie

最後一行確定會讓不少人受到冒犯,讓我說我不是故意要抨擊某個社區。我不會這樣作由於它不是他們的錯,在當前編程時代,代碼執行時間須要儘量低,徹底能夠理解他們跳過這些部分來加強他們的代碼。工具

因此,我開始作筆記,能夠幫助程序員編寫安全的代碼。我將嘗試涵蓋不一樣類型的攻擊以及程序員爲保持代碼安全而進行的小調整,以便他們的組織不須要再次花錢來保證應用程序的安全。我想我今天已經足夠了,因此讓咱們直截了當。學習

咱們來挖掘吧!

讓我開始個人定義注入及其發生的緣由。攻擊者輸入惡意有效載荷,能夠欺騙解釋器執行非預期的命令或訪問未經受權的數據。注入缺陷的發生是因爲不受信任的數據做爲命令或查詢的一部分直接發送到解釋器而沒有檢查或清理有效負載致使全部問題的惟一緣由。測試

在本文中,我將介紹三種不一樣類型的注入攻擊和方法,您可使用它們來防止它們: ui

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);

道德

咱們能夠作的最重要的事情是防止注入攻擊發生,就是相信來自用戶端的任何和全部輸入均可能是攻擊。程序員大多理所固然地認爲,用戶輸入的內容不會對致使應用程序中大部分漏洞的應用程序形成傷害。必須對使用方的每一個輸入進行消毒,而且必須在應用程序使用以前驗證輸入。用戶輸入的值毫不能直接傳遞給程序。

若是程序員記住這些事情,他們確定能夠防護大多數的注入攻擊。

相關文章
相關標籤/搜索