本人还处于代码审计的初级阶段,因为刚开始学代码审计的时候,就感受一团代码,不知道从何下嘴。先从底层开始审计: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存在,能够直接读取出来