JAVA web網站代碼審計--入門


本人還處於代碼審計的初級階段,此文章類似於編碼規范,有啥建議,評論給我~

由於剛開始學代碼審計的時候,就感覺一團代碼,不知道從何下嘴。先從底層開始審計:

底層漏洞:

1. 查看該系統所用框架:

Struts2的相關安全:

    (1)  低版本的struts2,低版本的Struts2存在很多已知的版本漏洞。一經使用,很容易造成比較大的危害。

    (2)  開啟 Struts2的動態調用方法,現在發現的如s2-033 ,s2-032等漏洞,都是由於系統開啟了動態調用方法,導致遠程代碼執行。

    (3)  在jsp頁面中使用Struts2的ognl表達式傳輸數據。

    (4)  開啟Struts2的devMode,易造成遠程代碼執行

    (5)  存在Struts2本身自帶的ognl頁面

    (6)  使用Struts2自帶的redirect等方法

Spring的相關安全:

    Spring在jsp中使用el表達式時,注意spring的boot框架版本,因為有些低版本會存在遠程命令執行。

mybatis xml相關安全:

    在SQL語句中,使用$進行傳參,導致SQL注入;

其他安全:

    在使用java自帶的環境時,如weblogic或者jboss,請注意查看版本號,因為此類環境低版本,大部分包含java反序列化漏洞,導致遠程代碼執行;

     glassfish環境某些版本存在任意文件讀取;

 

2. 查找SQL注入:

DAO:是否存在拼接的SQL語句

如:String sql = "select * from user where id="+id;

XML中:是否使用$,因為在xml中,#value#此時value是以參數的形式插入進去,$value$此時value是以字符串的形式直接插入到xml中,會導致sql注入;

<select id="abdc" resultMap="result">select * from tb_card_bin where card_length = #cardLength# and instr(bin_no, '$cardNoFirstNum$') = 1</select>

3.第三方控件漏洞

如:fckeditor,wordpress等等。

查找完底層漏洞后,查看系統中相應的action或者do方法。如果用的是ssh框架的話,這些方法的相關配置保存在Struts2的配置文件中。如果用的是springmvc框架的話,這些方法可能保存在applicationContext.xml(spring的配置文件),或者采用的是掃描注入的話,建議全局搜索RequestMapping等注入路徑的關鍵字來確定action方法所在。以下,以action方法為例:

4. 文件上傳漏洞

文件上傳的action有一個比較顯著的特征:Spring MVC默認支持兩種文件上傳操作方式。一種是使用MultipartHttpServletRequest或者MultipartFile作為方法參數,第二種是使用javax.servlet.http.Part作為方法參數。

代碼舉例:

@RequestMapping(value = "/accounting/voucher/importVoucher.htm", method = RequestMethod.POST)
@SuppressWarnings("unchecked")
public String importBankGlide(@RequestParam("voucherFile")MultipartFile voucherFile, @RequestParam("returnFile") MultipartFile returnFile,ServletRequest request, ModelMap model) {
 if (voucherFile == null || voucherFile.getSize() < 1) {
   String errorMessage = "導入文件為空";
   model.put(ERROR_MESSAGE, errorMessage);
   return "/accounting/voucher/importVoucher";
 }

 String extFile = "";

 if (returnFile.getSize() > 0) {//並未對文件進行檢查,直接上傳
   File file = new File(model.get("path"));
 } else {
   model.put(ERROR_MESSAGE, "上傳附件失敗,請重新發起:" + result.getResultMessage());
   return "/accounting/voucher/importVoucher";
 }
 }

文件上傳存在的主要原因,一,未對文件名稱進行檢測直接上傳;二,未對傳入的文件內容進行檢測直接上傳;

5.  遠程命令執行

在調用本機的shell,去運行特殊的命令時,沒有對傳入的參數進行檢查,導致命令執行;

Runtime.getRuntime().exec此方法用來執行shell
com.opensymphony.xwork2.ognl.OgnlValueStack的protected Object findValue(String expr, String field, String errorMsg)該方法是用來執行ognl表達式。

6.  遠程代碼執行

第一,通過使用腳本引擎中的eval去執行些特殊的東西,這種地方要着重去看,是否會有用戶輸入的變量傳入。

第二,通過反射來執行代碼:Class c=Class.forName("com.wqx.test4.Test");
//創建這個類的實例,前提是存在這個類,並且存在此種方法
Object obj=c.newInstance();
//通過class來取得這個方法對象 並且聲明 這個類的參數類型
java.lang.reflect.Method method=c.getMethod("sayhello", Class.forName("java.lang.String"));
//invoke 來執行方法對象 記得參數類型要跟這里的參數匹配
method.invoke(obj, "wqx");

7. 越權下載

首先,fileName是用戶可以控制的,如下:

String fileName =  "../../../../1.xml";//此處為用戶輸入內容
File file = new File("/Users/dly/Desktop/test2/src/main/webapp/upload/" + fileName);
FileInputStream fileInputStream = new FileInputStream(file);
BufferedReader buff= new BufferedReader(new InputStreamReader(fileInputStream));
System.out.println(buff.readLine());

此時,1.xml存在,會導致越權下載。

8. 敏感信息泄漏

第一,代碼泄漏,.svn的文件夾和git的文件夾中可能包含代碼;

第二,mac中編程會自動生成.DS_Store文件,其中可能包含敏感信息;

第三,代碼備份。

9.邏輯漏洞

需要自己去結合傳入數據的流程和基本業務去判斷。

 

最后說一句,有些神奇的人,會為了方便自己管理服務器,自己給自己寫個webshell。別笑~這是非常可能的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM