zoukankan      html  css  js  c++  java
  • java代码审计常见漏洞点

    本人还处于代码审计的初级阶段,由于刚开始学代码审计的时候,就感觉一团代码,不知道从何下嘴。先从底层开始审计:

    底层漏洞:

    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";
    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存在,可以直接读取出来

  • 相关阅读:
    所谓的飞扬档案管理软件
    通过实例学习Virtools脚本语言VSL 解析字符串
    SQLite FAQ中文版
    通过实例学习Virtools脚本语言VSL 将物体排列于圆周上
    通过实例学习Virtools脚本语言VSL 解二次方程
    out 和 ref
    ASP.NET MVC深度接触:ASP.NET MVC请求生命周期
    ICSharpCode.SharpZipLib 压缩
    aspnet_regiis.exe 详解
    ASP.NET 配置文件 configSource 的用法
  • 原文地址:https://www.cnblogs.com/ermei/p/5846515.html
Copyright © 2011-2022 走看看