本人還處於代碼審計的初級階段,因爲剛開始學代碼審計的時候,就感受一團代碼,不知道從何下嘴。先從底層開始審計: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"; |
此時,若是1.xml存在,能夠直接讀取出來