java代碼審計常見漏洞點

本人還處於代碼審計的初級階段,因爲剛開始學代碼審計的時候,就感受一團代碼,不知道從何下嘴。先從底層開始審計:java

底層漏洞:web

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

Struts2的相關安全:sql

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

    (2)  開啓 Struts2的動態調用方法,如今發現的如s2-033 ,s2-032等漏洞,都是因爲系統開啓了動態調用方法,致使遠程代碼執行。安全

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

    (4)  開啓Struts2的devMode,易形成遠程代碼執行mvc

    (5)  存在Struts2自己自帶的ognl頁面app

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

Spring的相關安全:

    Spring在jsp儘可能使用el表達式,spring的boot框架遠程命令執行就是因爲el表達致使的。

mybatis xml相關安全:

    在SQL語句中,使用$進行傳參;

其餘安全:

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

 

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.  遠程代碼執行

經過反射來執行代碼: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.  越權下載

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存在,能夠直接讀取出來

相關文章
相關標籤/搜索