1. 程式人生 > >軟體程式設計的24宗罪總結

軟體程式設計的24宗罪總結

一、Web應用程式漏洞

(一)sql注入漏洞

   1、發生方式:字串拼接查詢sql,攻擊者偽造資料操作查詢資料庫從而帶來危險。儲存過程也可能出現這個問題。

   2、查詢模式:

        1)、接收使用者輸入

        2)、沒有檢查使用者輸入有效性

        3)、使用使用者輸入查詢資料庫

        4)、使用字串拼接或字串替換構造sql語句,或者使用類似於SQL exec方法執行sql查詢。

3、測試技巧

    1)、使用sql保留字作為輸入,如果得到了不正常的返回資訊,則可能存在sql漏洞。

    2)、工具掃描

4、解決方案

    1)、校驗所有輸入

    2)、使用prepare

語句(引數化查詢,佔位符或者繫結)構造sql語句

    3)、不允許訪問表,只允許訪問儲存過程和檢視

(二)、XSSXSRF和響應拆分(伺服器端)

     1、型別分類

        1)、基於DOMXSS漏洞

        2)、反射型XSS漏洞:輸入回顯

        3)、持續XSS漏洞:惡意程式碼儲存在應用程式中

        4)、HTTP響應拆分,RS漏洞:將惡意程式碼插入到http標題中

        5)、跨站點請求:

     2、查詢模式

        1)、web應用程式從HTTP實體中獲取輸入

        2)、沒對輸入檢查

        3)、HTML或者HTTP標題中資料回顯給瀏覽器

     3、測試技巧

        1)、惡意構造資料看瀏覽器是否回顯

     4XSS彌補措施

        1)、確保輸入有效:正則校驗

        2)、對輸出編碼

        3)、對於標題的輸入,必須刪除CRLF組合

     5XSRF彌補措施

        1)、給web客戶端和伺服器會話新增金鑰值,這個值不包含在cookie

        2)、超時機制的設定

        3)、使用POST代替GET

(三)、客戶端XSS漏洞

     1、型別分類

        1)、gadgetwidget

        2)、靜態HTML頁面

     2、測試技巧

        1)、隨機

XSS片段注入輸入流  

3、彌補措施

    1)、不要相信輸入

    2)、用安全結果代替不安全結構

(四)、Magic URL、可預計的cookie以及隱藏表單欄位

1、型別分類

    1)、Magic URL:在utl中暴露id等資訊且加密不好

    2)、可預計的cookie:比如cookie自動遞增,有規律可循

    3)、隱藏的表單欄位:view source是可以看到的,使用者就可以建立惡意資訊

2、查詢模式

        1)、應用程式從cookieHTTP標題、表單或者URL中讀取敏感資訊

        2)、資料用於對安全、信任或者認證進行決策

        3)、資料是通過不安全或者不可信的通道進行傳遞的

3、 測試技巧

        1)、fiddler抓包

        2)、其它軟體抓包

4、對於MagicURL以及隱藏表單的彌補措施

        1)、資料加密

        2)、通道加密

        3)、隨機數(防預測)

        4)、MAC(訊息驗證碼)對比,放置改資料

二、實現漏洞

(五)、緩衝區溢位

      1、分類

         1)、堆溢位

         2)、棧溢位

         3)、陣列溢位(變體)

      2、查詢漏洞模式

         1)、輸入

         2)、向程式內部結構傳遞資料

         3)、不安全的字串處理呼叫

         4)、使用算數運算計算空間分配大小或者剩餘緩衝區大小

      3、測試技巧

         1)、Fuzz測試

         2)、在輸入中查詢長度為使用者指定數值的內容,然後改變長度

      4、彌補措施

         1)、替換危險的字串處理函式

         2)、審計分配操作

         3)、檢查迴圈和陣列訪問

       4)、分析工具使用

       5)、其它

(六)、格式化字串(c/c++常見)

      1、查詢模式

        1)、應用程式接受了一個格式化的函式

      2、測試技巧

        1)、嚮應用程式床底格式化說明符,看是否返回16進位制數值

      3、彌補措施

        1)、不要向格式化函式直接傳遞使用者輸入

(七)、整數溢位

      1、查詢模式

1)、提供算數運算都可能出現

      2、測試技巧

        1)、加減導致數值符號變化的臨界點

      3、彌補措施

        1)、儘可能使用無符號數

        2)、檢查整數

        3)、明確的型別轉換

        4)、使用安全類

(八)、命令注入:命令和資料放一起容易發生命令注入

       1、查詢漏洞模式

         1)、命令和資料內連放在一起

         2)、資料有可能被當做命令來處理,通常某些字元具有特殊含義,比如分號和逗號

         3)、執行命令的程序在另一個系統上,或者通過命令獲取的控制權限大於使用者應該擁有的許可權

       2、測試技巧

         1)、檢查輸入,確定它會傳給哪種命令外殼,然後使用每種元字元檢查是否有問題

         2)、程式構造包含元字元的輸入依次檢驗

       3、彌補措施

         1)、檢查資料是否合法

         2)、資料不合法採取適當的措施

         3)、使用最小許可權執行應用程式

(九)、未能正確的處理錯誤

       1、錯誤型別

         1)、產生太多的資訊:在告知使用者的時候透露了系統資訊

         2)、忽略了錯誤:產生了錯誤但是沒有處理

         3)、曲解了錯誤:對於返回值沒有正確理解,比如返回值含義搞錯了

         4)、使用了無用的返回值

         5)、使用了無錯誤的返回值

       2、查詢漏洞模式

          1)、程式碼審查

       3、測試技巧

          1)、程式碼審查

(十)、資訊洩露

       1、分類

          1)、定時通道:通過測量操作執行的時間,獲取系統的內部狀態

          2)、儲存通道:比如儲存檔名、訊息長度等

          3)、詳細的版本資訊:比如通過了解伺服器資訊更有針對性的攻擊

          4)、主機網路資訊:比如MAC、機器名、IP地址等資訊

          5)、路徑資訊

          6)、棧佈局資訊

      2、查詢漏洞模式

          1)、某個程序向來自OS或者執行時環境的使用者輸出結果

          2)、在敏感或者隱私資料上進行的操作未在固定時間內完成,時間取決於該機密資料自身的特性

          3)、意外使用敏感或隱私資訊

          4)、敏感或者高許可權資料未受保護或者保護機制很弱

          5)、敏感資料從一個程序向低許可權使用者傳送

          6)、未受保護的敏感資料通過不安全的通道傳送

      3、彌補措施

          1)、許可權控制

          2)、資料保護

          3)、防護機制

(十一)、 競態條件:資源競爭

       1、查詢漏洞模式

          1)、多執行緒或者程序必須寫入同一個資源

          2)、在公共區域建立檔案或者目錄

          3)、訊號處理程式

          4)、多執行緒應用程式或者訊號處理程式中的不可重入函式

       2、測試技巧

          1)、多處理器系統執行測試

          2)、向可疑程式密集傳送訊號

          3)、開啟檔案系統日誌功能,檢測系統呼叫,留意檔案建立活動

       3、彌補措施

          1)、正確編寫可重入程式碼

          2)、正確處理鎖,物件處理,按照同樣的順序請求多個鎖,按照與請求相反的順序釋放它們。

          3)、持有鎖的時候做最少的事情,即注意鎖的範圍

          4)、不要假設系統呼叫能夠按時完成

          5)、在使用者私有儲存區建立臨時檔案

(十二)、不良可用性

       1、查詢漏洞模式

          1)、未能仔細研究典型使用者與安全特性互動的方式導致的一系列問題

       2、測試技巧

          2)、二人對話技術觀察使用者使用系統時的情況

     3、彌補措施

         1)、簡化UI以便使用者參與

         2)、為使用者做出安全決策

         3)、易於有選擇地放寬安全策略

         4)、明確指出後果

         5)、提供可操作性

         6)、提供集中管理

(十三)、不易更新

      1、分類

         1)、有漏洞的附件軟體安裝

         2)、有漏洞的訪問控制

         3)、有漏洞的提示疲勞:過多提示不太好

         4)、有漏洞的無知:該提示還是要提示

         5)、有漏洞的無通知更新:別自己就更新應用了

         6)、有漏洞的一次更新一個系統

         7)、有漏洞的強制重啟動

         8)、有漏洞的難以打補丁:打補丁步驟要簡單

         9)、有漏洞的缺乏恢復計劃:

         10)、有漏洞的信任DNS:更新用的軟體要放在可信任的伺服器上

         11)、有漏洞的信任補丁伺服器

         12)、有漏洞的更新簽名

         13)、有漏洞的開啟更新包

         14)、有漏洞的使用者應用程式的更新

     2、查詢漏洞

         1)、威脅模型

     3、測試技巧:見分類

     4、彌補措施

         1)、安轉附帶軟體的彌補措施:把附帶軟體捆綁在補丁中

         2)、訪問控制彌補措施:鎖定檔案,不允許寫入,或者把許可權改為檢查簽名之前,僅允許授權訪問

         3)、提示疲勞彌補措施:儘可能少通知使用者,讓應用程式做正確的事

         4)、使用者無知的彌補措施:儲存最近的時間,啟動程式時檢查,看更新包是否在合理的時間內應用

         5)、無通知更新彌補措施:通知一下

         6)、一次更新一個系統的彌補措施:考慮關閉系統打補丁會更快,考慮分批次更新系統防止意外發生

         7)、強制重啟動的彌補措施:系統執行期間打補丁或者使應用程式關閉

         8)、難以打補丁的彌補措施:做成可執行程式或者一系列連線好的指令碼

         9)、缺乏恢復計劃的彌補措施:做一個恢復計劃

         10)、輕信DNS和輕信補丁伺服器:給補丁簽名

         11)、更新簽名的彌補措施:MD5簽名不可靠,採用SHA-1甚至SHA-2更好

         12)、開啟更新包的彌補措施:把檔案提取到一個只有授權使用者可以訪問的目錄下

(十四)、執行程式碼許可權過大

      1、查詢漏洞模式

         1)、確定應用程式是否可以在非管理賬號或非根賬戶下正確的執行

      2、測試技巧 

         1)、不斷降低許可權執行

      3、彌補措施

         1)、降低許可權,以最小許可權執行程式碼

(十五)、未能安全的儲存資料

      1、查詢漏洞模式

         1)、設定訪問控制

         2)、為低許可權使用者授予寫操作許可權

         3)、在共享區寫配置資訊

      2、測試技巧

         1)、利用find命令查詢全域性可寫檔案和目錄( find / -type d -perm +002

         2)、加密資料最好程式碼審查做

      3、彌補措施

         1)、正確處理許可權問題

         2)、合理正確加密資料

(十六)、移動程式碼的漏洞

       移動程式碼:已經下載並且在使用者計算機上執行的程式碼

      1、查詢漏洞模式

         1)、程式碼執行任意形式的指令碼

         2)、容器在執行移動程式碼前不提示使用者

         3)、容器不限制移動程式碼的功能、許可或者許可權

         4)、移動程式碼沒有簽名

         5)、移動程式碼執行任意形式的敏感貨危險操作

      2、測試技巧

         1)、沒有統一方法,最好程式碼審查

      3、彌補措施

         1)、windows沙箱

         2)、chroot限制

三、加密漏洞

(十七)、使用基於弱密碼的系統

      1、查詢漏洞模式

         1)、密碼洩露

         2)、允許使用弱密碼:複雜性要求

         3)、迭代密碼:儲存以前的密碼歷史,需要使用一個強密碼驗證器來檢查,其次檢查密碼歷史時,應該測試常見的迭代密碼

         4)、從不改變密碼:伺服器端可以要求使用者更改密碼

         5)、預設密碼:不安全

         6)、重放攻擊:要保證傳輸通道安全,比如SSL

         7)、對密碼驗證器進行暴力攻擊:檢查密碼驗證器是否使用了優秀的鍵派生函式

         8)、儲存密碼而不是密碼驗證器

         9)、線上攻擊:程式碼審查查詢最快

         10)、返回遺忘的密碼:這沒有任何必要,重置最佳

     2、測試技巧

       1)、密碼洩露:臨時檔案、崩潰儲存

         2)、重放攻擊:捕獲驗證資料流併發送相同的資料流進行登入;檢查證書和伺服器是否匹配

         3)、暴力攻擊:效能測試 

     3、彌補措施

         1)、密碼洩露的彌補:確保密碼不儲存在記憶體中;登入頁面只能SSL/TLS訪問

         2)、弱密碼的彌補:確認密碼的複雜性和長度要求;密碼最好不包含使用者名稱

         3)、迭代密碼的彌補措施:檢查密碼中字元變體

         4)、密碼改變彌補措施:定期要求使用者更改密碼

         5)、預設密碼彌補措施:不使用預設密碼

         6)、重放攻擊彌補:驗證封裝在受保護通道中

         7)、密碼驗證器彌補:使用好的鍵派生函式

         8)、線上暴力破擊彌補:不把使用者名稱洩露給攻擊者;鎖定招呼;設定超時時間

         9)、登入資訊洩露的密碼措施:給不正確的使用者名稱和不正確的密碼返回不同的出錯資訊

         10)、忘記密碼的彌補措施:允許重置

(十八)、弱隨機數

      1、查詢漏洞模式:當需要保護資料的機密性或者防範被人猜測的時候漏洞就會出現

      2、測試技巧: FIPS測試

      3、彌補措施 :保證真的能隨機

(十九)、使用錯誤的密碼技術

      1、漏洞分類介紹

         1)、使用自制的加密演算法:

         2)、在高階協議可用時,從低階演算法中建立一個協議:別太自信

         3)、使用脆弱的密碼基元:DES加密無意義,MD4已被完全破解等

         4)、不正確的使用密碼基元:比如流密碼濫用,雜湊連續密碼,加密已知的普通文字

         5)、使用錯誤的密碼基元:加碼不能保證資料不被篡改,可以使用編碼,比如64進位制

         6)、使用錯誤通訊協議:

         7)、未使用salt

         8)、未使用隨機IV

         9)、使用脆弱的祕鑰派生函式

         10)、未提供完整性檢查

         11)、不使用敏捷加密:敏捷加密解釋起來就是前瞻性加密

      2、查詢漏洞模式

         1)、程式碼審查

      3、測試技巧:

         1)、程式碼審查

      4、彌補措施

         1)、使用自制加密演算法:刪除相關程式碼

         2)、從低階演算法中建立一個新的協議:使用已有能滿足的現有演算法

         3)、使用脆弱的密碼基元、不正確的使用密碼基元:使用更安全的加密措施

         4)、未使用salt的加密措施:加salt,保證加的salt是強隨機容器生成並且長度足夠

         5)、其它漏洞彌補參考漏洞型別

四、聯網漏洞

(二十)、未能保護好的網路通訊

      1、查詢漏洞模式

         1)、應用程式使用網路

         2)、設計者輕視或者低估網路層的威脅

      2、測試技巧

         1)、捕獲資料包分析:沒有加密的訊息,每條訊息結尾都有固定長度的奇怪資料

         2)、對資料包做一些小改動,看程式能否識別出來

      3、彌補措施

         1)、使用安全的協議,比如SSL/TLS建立網路連線

         2)、建立本地代理來實施安全措施

(二十一)、未能正確的使用PKI,尤其是SSL

    1、查詢漏洞描述

         1)、使用了PKI,例如SSL或者TLS

         2)、未使用HTTPS

         3)、庫或者應用程式程式碼未能檢查通訊通道另一端的程序所使用的證書

      2、測試技巧

         1)、工具攻擊,比如dsniffettercap

         2)、用不可信的CA簽名,可以使用microsoft Certificate Manager

         3)、自簽名的證書

         4)、證書不在有效期內(notBefore欄位)

         5)、證書過期(notAfter欄位)

         6)、主題名(subjectName)是偽造的

         7)、金鑰使用不正確

         8)、失效的簽名演算法

      3、彌補措施

         使用PKI比較合理,但是要確保

         1)、證書連線了一個有效的根CA

         2)、證書處於有效期內

         3)、將主機名和至少一個DN欄位或者X.509 v3 subjectAltName擴充套件中的對應子欄位進行比較

         4)、證書金鑰的使用時正確的:伺服器認證或者客戶端認證

         5)、證書未撤銷

         6)、程式對於上述監測中出現的問題當做證書失效來處理,並禁止建立連線

(二十二)、輕信網路域名解析

        1、查詢漏洞模式

          1)、連線已被認證的網路上扮演客戶端或者伺服器角色的任何應用程式

        2、測試技巧

          1)、搭建一個惡意客戶端和一個可以伺服器,同時實現這兩個目標的好辦法是建立一種代理客戶端和伺服器之間資訊的方式。檢查流動的資訊是否使用base64編碼或者ASN.1編碼(兩者都不安全)

          2)、如果客戶端指向某個被攻擊者控制的伺服器,看會發生的情況。

          3)、如果伺服器對客戶端有些假定,而不是隻對使用者進行驗證,那麼要質疑應用程式的設計。

       3、彌補措施

          1)、確保連線都在SSL上執行並且所有程式碼進行適當的PKI檢查

          2)、使用IPSec

          3)、使用Kerberos或者Windows進行了認證,且客戶端和伺服器都是最新版本

          4)、使用公共金鑰密碼系統,並雙向簽發資料