1. 程式人生 > >程式碼審計--10--原始碼審計思路(上)

程式碼審計--10--原始碼審計思路(上)

===============================================

一個Java應用的程式碼審計工作應該從哪裡入手,對於新手來說也許會不知所措,如果在不瞭解整個應用系統情況下(包括業務功能、框架使用等)盲目的直接去閱讀專案中原始碼,往往會迷失在程式碼中導致漏洞誤報漏報情況,審計效率同樣不高。所以在審計之前要了解應用系統主要業務邏輯,其次是瞭解專案的結構和專案當中的類依賴。再次才是去根據業務模組去讀對應的程式碼,從功能去關聯業務程式碼往往比逮著段程式碼就看效率高很多。

目前企業中進行程式碼審計工作的系統有以下幾類:網銀系統、門戶類網站(包括後臺管理系統)、購物類網站等,針對這幾類系統身份許可權校驗是都需要審計的機制,網銀系統著重審計轉賬交易功能,門戶類網站主要是後臺管理系統。其次弄清楚當前原始碼專案所採用的框架結構,比如SSH(Struts+Spring+Hibernate)、Spring MVC等,這裡可以通過檢視lib目錄下所使用的第三方Jar包來判斷使用的框架型別,struts2框架需要struts2-core-xxxx.jar提供核心包,spring框架需要spring-core-xxxx.jar提供核心包。根據專案中所引入的jar包來判斷使用的框架型別是一種比較快捷的方式。如果想全面的瞭解此專案中具體的框架使用、過濾器、Servlet分佈等情況,可以通過web.xml配置檔案來檢視,最後跟蹤資料流來定位缺陷程式碼。

1 逆向回溯審計

逆向回溯審計針對於特定漏洞比較有效,因為大多數安全問題是由於函式使用不當造成的,比如命令注入通常會使用Runtime.getRuntime().exec(command)執行外部的程式或者命令,另外比如SQL注入可以直接搜尋檢視SQL語句是否使用字串動態拼接。

“逆向”挖掘SQL注入

SQL注入理論上是最容易找的,因為SQL語句的特殊性只要利用Eclipse快捷鍵Ctrl+H 搜尋select、from 等關鍵字就能夠快速找到專案下所有的SQL語句,然後根據搜尋結果基本上都能夠確定是否存在SQL注入。凡是SQL語句中出現了拼SQL(如select * from admin where id=’”+id+”’)那麼基本上80%可以確定是SQL注入。但也有特例,比如拼湊的SQL引數並不受我們控制,無法在前臺通過提交SQL注入語句的方式去控制最終的查詢SQL。而採用預編譯?佔位方式的一般不存在注入。

首先在Eclipse中匯入專案,選中需要搜尋的專案快捷鍵Ctrl+H,所有SQL語句的關鍵字將專案中的SQL語句列出來,如下圖:

在這裡插入圖片描述

搜尋jeecms專案當中的SQL語句,如下圖:

在這裡插入圖片描述

Tips:ORM框架特殊性

1、Hibernate HQL:

需要注意的是Hibernate的HQL是對物件進行操作,所以它的SQL可能是:

String hql = "from Emp";
Query q = session.createQuery(hql);

也可以
String hql = "select count(*) from Emp";
Query q = session.createQuery(hql);

甚至是
String hql = "select new Emp(e.empno,e.ename) from Emp e ";
Query q = session.createQuery(hql);

在這裡插入圖片描述

2、Mybatis(Ibatis3.0後版本叫Mybatis):

Ibatis、Mybatis的SQL語句可以基於註解的方式寫在類方法上面,更多的是以xml的方式寫到xml檔案。

在這裡插入圖片描述

在當前專案下搜尋SQL語句關鍵字,查詢疑似SQL注入的呼叫:

在這裡插入圖片描述

進入搜尋結果的具體邏輯程式碼:

在這裡插入圖片描述

最外層的Contrller:

在這裡插入圖片描述

“逆向”找到控制層URL以後構建的SQL注入請求:

在這裡插入圖片描述