初識代碼審計

代碼審計(Code Audit)是指安全代碼評估者儘可能的通過閱讀應用系統的源代碼來發現潛在的安全漏洞及隱患的技術手段。
代碼審計的技術手段,可以彌補黑盒滲透測試的未能完全覆蓋的漏洞環節與安全隱患,是一種可靠性、安全性最高的修補漏洞的方法。
可以通過對常見的編程語言如ASP、ASP.NET、PHP、JAVA、C++等語言進行源代碼審計,查找出代碼中存在的安全問題。

在這裏插入圖片描述

PHP代碼審計準備

代碼審計環境準備

搭建php環境:
php作爲一門腳本語言,要運行它必須需要一個php的運行環境。PHP作爲最流行的Web編程語言,大部分中間件都會有對php的支持。這裏爲了方便我們進行代碼審計,減少不必要的配置時間,我們選擇phpstudy。phpStudy是一個PHP調試環境的程序集成包。該程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer。
理由:
phpstudy支持php不同版本之間的切換,這對代碼審計尤爲重要。(獨特)
phpstudy一鍵集成安裝,不需要複雜的環境配置。
phpstudy默認支持多款中間件,方便我們在不同中間件下進行審計。
瀏覽器:
代碼審計過程中,我們經常需要測試代碼在瀏覽器返回的結果。安裝多款性能強大的瀏覽器可以對我們代碼審計起到很大的幫助。
Mozilla Firefox:開源,多插件,強引擎,多系統。
Chrome:穩定,快速,開發者調試工具。
編輯器:
俗話說的好,工欲善其事,必先利其器。成功的代碼審計自然離不開編輯器的幫助,一款適合自己的編輯器可以讓我們閱讀代碼的速度事半功倍。
例如:
在這裏插入圖片描述
編輯器可以給我們提供以下必不可少的優點。
語法高亮
語法摺疊
代碼補全
函數斷點
批量註釋
函數跳轉
變量追蹤
程序源碼
就好比再好的廚師也不能不用材料做飯,代碼審計的前提也是獲得審計目標的源代碼。因此在審計前,我們需要從想辦法獲得源碼。
•獲得源碼
大多數PHP程序都是開源的、找到官網下載最新的源碼包就好了。
•安裝網站
在本地搭建網站,一邊審計一邊調試。實時跟蹤各種動態變化。

代碼審計工具使用

seay代碼審計工具

  1. 一鍵化自動白盒審計:
    提供了自動審計功能,雖然不夠精確,但是卻能幫助我們迅速找出敏感函數與敏感參數。同時根據情形,簡單的分析出可能出現的漏洞,爲我們提供思路上的額幫助。
    可以看到,將我們的網站目錄選入,開始掃描後。掃描出了 敏感函數extract,同時其中含有變量,這將可能導致變量覆蓋漏洞。
    但是功能並不是十全十美的,他只是利用正則對網站整體進行了掃描,所以有沒有漏洞必須要我們人工判別。
    在這裏插入圖片描述
  2. 代碼調試:
    在這裏插入圖片描述
  3. 正則編碼:正則編碼可以幫助我們判別正則表達式。同時可以寫出字符串。利用正則進行匹配。
  4. 自定義插件與規則。
  5. 自定義審計規則。
  6. 數據庫執行監控。

代碼審計流程與方法

代碼審計過程中應該先對大局有所把握,瞭解要審計的整個網站大概框架是什麼,工作流程是什麼等。把握大局可以有以下幾點:
網站結構:瀏覽源碼文件夾,瞭解該程序的大致目錄
入口文件:index.php、admin.php文件一般是整個程序的入口,詳細讀一下index文件可以知道程序的架構、運行流程、包含那些配置文件,包含哪些過濾文件以及包含那些安全過濾文件,瞭解程序的業務邏輯。
配置文件:一般類似config.php等文件,保存一些數據庫相關信息、程序的一些信息。先看看數據庫編碼,如果是gbk則可能存在寬字節注入。如果變量的值用雙引號、則可能存在雙引號解析代碼執行的問題。
過濾功能:通過詳讀 公共函數文件 和 安全過濾文件 等文件,清晰掌握用戶輸入的數據,哪些被過濾,哪些無過濾,在哪裏被過濾了,如何過濾的,能否繞過過濾的數據。過濾的方式是替換還是正則?有沒有GPC?有沒有使用addslasher()處理?
瞭解網站目錄結構,重要文件目錄作用
在這裏插入圖片描述
幾種常見審計方法:
通讀全文法
通讀全文發作爲一種最麻煩的方法也是最全面的審計方法。特別是針對大型程序,源碼成千上萬行,這要讀到什麼時候。但是該方法也是一種必要的方法。瞭解整個應用的業務邏輯,才能挖掘到更多更有價值的漏洞。
這種方法一般是企業對自身產品的審計,當然,對於小型應用,未嘗不可以讀一讀。
前面的把把握大局也包含在通讀全文法裏面,也是通讀全文的第一步。
當然通讀全文也不是傻乎乎的順着目錄一個一個代碼全部讀一遍,而是根據網站的目錄文件,對每個功能點進行完全的代碼通讀,這樣纔可以更好的理解整個Web程序,完成審計。
例如:
首先看程序的大體代碼結構,比如主目錄存在哪些文件,模塊目錄存在哪些文件。
除了關注有哪些文件,我們還要注意文件的大小,創建時間。我們根據這些文件的命名就可以大致瞭解程序具體功能,尋找核心文件。在看程序目錄結構的時候,我們要特別注意幾個文件,分別如下:
函數集文件,通常命名中包含functions或者common等關鍵字,這些文件裏面是一些公共的函數,提供給其他文件統一調用,所以大多數文件都會在文件頭部包含到它們,尋找這些文件一個非常好用的技巧就是去打開index.php或者一些功能性文件,在頭部一般都能找到。
配置文件,通常命名裏面包括config這個關鍵字,配置文件包括Web程序運行必須的功能性配置選項以及數據庫等配置信息,從這個文件裏面可以瞭解程序的小部分功能,另外看這個文件的時候注意觀察配置文件中參數值是用單引號還是用的雙引號包起來,如果是雙引號,則很大可能會存在代碼執行漏洞,例如下面kuwebs的代碼,只要我們在修改配置的時候利用PHP可變變量的特性即可執行代碼。
$kuWebsiteURL = “http://www.kuwebs.com”; $kuWebsiteSupportEn= “1”; 安全過濾文件,安全過濾文件對我們做代碼審計至關重要,關係到我們挖掘到的可疑點能不能利用,通常命名中有filter、safe、check、clean、dirty、waf等關鍵字,這類文件主要是對參數進行過濾,比較常見的是針對SQL注入和XSS過濾,還有文件路徑、執行的系統命令的參數,其他的則相對少見。而目前大多數應用都會在程序的入口循環對所有參數使用addslashes()函數進行過濾。
index文件,index是一個程序的入口文件,所以通常我們只要讀一遍index文件就可以大致的瞭解整個程序的架構,運行的流程,包含到的文件,其中核心的文件又有哪些,而不同目錄的index文件也有不同的實現方式,建議最好是先把幾個核心目錄的index文件都簡單讀一遍。
敏感函數參數回溯法
敏感函數參數回溯法就是根據敏感函數,逆向追蹤參數傳遞的過程。這個方法是最高效,最常用的方法。
大多數漏洞的產生是因爲函數的使用不當導致的。我們只要找到這樣的一些使用不當的函數,就可以快速挖掘想要的漏洞。
這方面,Seay法師大大有一款神器 Seay源代碼審計系統,主要是利用正則匹配一些高危函數、關鍵函數以及敏感關鍵字。
然後,我們就可以分析判斷敏感函數的上下文,追蹤參數源頭。嘗試控制可控的參數變量。
例如:
首先可以利用抓包軟件,觀察我們GET或者POST的參數名稱,在php代碼中進行參數名的回溯追蹤。
發現了php接受參數的函數,觀察函數對參數的處理流程,直到最後一步完成,完成追蹤。
通常在提交請求前的變量,都是攻擊者可控都是不安全的,因此我們觀察是否對參數進行完整的處理。
我們也可以使用一些軟件自帶的變量追蹤,方便我們調試,可以看到具體變量傳遞到函數,以及函數處理完之後的變化。
定向功能分析法
定向功能分析法主要是根據程序的業務邏輯來說審計的。首先是用瀏覽器逐個訪問瀏覽,看看這套程序有那些功能。根據相關功能,大概推測可能存在那些漏洞。找到具體的功能模塊,主要審計此模塊。
常見功能漏洞:(包括但不限於)
程序初始安裝
如,有些安裝程序可能存在重裝漏洞,網站數據庫被重置。
站點信息泄漏
如:某些關鍵目錄信息,如adnmin登陸界面,數據庫管理界面,網站源碼等。
文件上傳漏洞
如:文件上傳全套每部存在問題。
文件管理
如:服務器文件可以被遠程讀取,寫入。
登陸認證
如:暴力破解,沒有多重認證系統。
數據庫備份恢復
如:利用數據庫備份拿shell。
越權(橫向越權,縱向越權)
如:越權執行敏感操作,如修改其他用戶信息。
投票,積分,抽獎活動
如:單用戶多次抽獎。
任意密碼重置
如:充值他人密碼。
驗證碼繞過
如:驗證碼過於簡單,可以被繞過等。
審計總結
審計過程中,我們不要侷限於固定的方法,適當的天馬行空,找到適合自己的審計思路。
同時審計時,經常需要結合多種方法,不要侷限於定性知識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章