本人還處於代碼審計的初級階段,此文章類似於編碼規范,有啥建議,評論給我~
由於剛開始學代碼審計的時候,就感覺一團代碼,不知道從何下嘴。先從底層開始審計:
底層漏洞:
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。別笑~這是非常可能的。