本人還處於代碼審計的初級階段,由於剛開始學代碼審計的時候,就感覺一團代碼,不知道從何下嘴。先從底層開始審計:
底層漏洞:
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框架遠程命令執行就是由於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"; |
此時,如果1.xml存在,可以直接讀取出來