当前位置:   article > 正文

JAVA代码审计(函数定位)_java代码审计项目

java代码审计项目

2023年将会持续于B站、CSDN等各大平台更新,可加入粉丝群与博主交流:838681355,为了老板大G共同努力。
【商务合作请私信或进群联系群主】

一、准备工作

先了解开发环境:
1. JAVA版本
2. 中间件
3. 数据库
4. 是否使用框架
  • 1
  • 2
  • 3
  • 4
  • 5
常见的开发环境:
JDK + Eclipse + Tomcat + SQL(Orcla/MYSQL)
    
IDE: EclipseIDEANetbeans
Web Server: TomcatResinJBossWebSphereWebLogicSQL: MYSQLOrclaRedisSQLserverPostgreSQL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.1 审计流程

1. JAVA-WEB中有些程序Maven项目会存在pom.xml文件,pom.xml文件定义程序需要的各类组件,可以查看组件是否存在高危漏洞来第一步收获高危漏洞。
2. 可以直接全局搜RequestMapping找到cotroller层路径,如果不是springboot框架,需要去看web.xml去定位路由
  • 1
  • 2

1.2 代码跟踪流程

用户请求URL发送到服务器,服务器解析请求后发送到后端代码处理请求。在后端代码处,首先经过Filter(过滤器)Interceptor(拦截器),然后根据请求的URL映射到绑定的controller,之后调用Service接口类,然后再调用serviceImpl接口实现类,最后调用DA0.controller:负责简单的逻辑处理和参数校验功能,之后调用Service
                                                                                           
service: 接口类,主要负责业务模块逻辑处理
serviceImpl: 接口实现类,实现类实现service接口中的方法。
DA0: 如果service涉及数据库操作就会调用dao。DA0主要处理数据库操作。DA0只做中间传递角色
  • 1
  • 2
  • 3
  • 4
  • 5

二、常见漏洞审计关键字

2.1 SQL注入

关键字:
    Statement
    createStatement
    PrepareStatement
    like '%${
    in (${
    select
    update
    insert
    Dao
    from
修复:使用参数化查询语句避免将未经过滤的输入直接拼接到SQL查询语句中。对用户输入的特殊字符进行严格过滤,如and、or、select、union。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2 二次注入

一般出现注册处。

经典漏洞示例:
从session中取出username值,拼入SQL语句查询,注册逻辑调用UserMapper进行入库操作,并没有对用户名做过滤,同时入库时采用#号的安全写法,会通过预编译执行SQL语句。
出发漏洞流程:
注册一个存在SQL注入的语句并进行用户名登录,通过触发逻辑导致二次注入。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3 任意文件上传

关键字:
    org.apache.commons.fileupload
    java.io.File
    MultipartFile
    RequestMethod
    MultipartHttpServletRequest
    CommonsMutipartResolver
    upload
    write
    fileName
    filePath
    fileUpload
修复:
1.设置白名单条件方式上传:"String picwhite[]={".jpg",".jpeg",".png",".gif",".bmp"}
2.避免获取文件名真实后缀:"String Suffix = fileNmae.substring(fileName.lastIndexOf("."))"
3.对文件类型的判断(可以通过抓包Content-Type修改绕过):"String whitetype[]={"image/gif","image/jpeg","image/jpg","image/png"}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.4 XSS注入

关键字:
    <%=
    ${
    <c:out
    <c:if
    <c:forEach
    ModelAndView
    ModelMap
    Model
    .getParameter
    .setAttribute
    .getWriter().print()
    .getWriter().writer()
    getParamter
    print
    insert
    save
    update
        
反射型XSS<%=
    ${
    .getParameter
    .getWriter().print()
    .getWriter().writer()
    getParamter
    print
存储型XSS.setAttribute
    .getWriter().print()
    .getWriter().writer()
    print
    insert
    save
    update
DOMXSS<%=
    ${
    <c:out
    <c:if
    <c:forEach
    ModelAndView
    ModelMap
    Model
        
修复:
1. 编写全局过滤器实现拦截。
2. 采用开源就安全控制库(OWASP)企业安全应用接口(ESAPI)实现,类似还有谷歌xssProtect等
    //HTML Context
    String html = ESAPI.encoder().encodeForHTML("><script>alert('xss')</script>");
    //HTML Attribute Context
    String htmlAttr = ESAPI.encoder().encodeForHTMLAttribute("<script>alert('xss')</script>");
    // Javascript Attribute Context
    String jsAttr = ESAPI.encoder().encodeForJavaScript("<script>alert('xss')</script>");
3. 对所有字符采用HTML实体编码
<%
    String Str="<script>alert('XSS')</script>",
    Str = Str.replaceAll("\"","&quot;");
    Str = Str.replaceAll("&","&amp;");
    Str = Str.replaceAll("\\(","&#40;");
    Str = Str.replaceAll("<","&lt;");
    Str = Str.replaceAll(">","&gt;");
    Str = Str.replaceAll("\'","&#39;");
    Str = Str.replaceAll("\\)","&#41;");
    out.println(Str);
%>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

2.5 目录穿越

一般涉及java.io.File类,审计时优先查找java.io.File引用。
关键字:
    Paths
    path
    System.getProperty("user.dir")
修复:
1.对文件名进行过滤
2.防止出现"./"特殊符号
3.采用ID索引下载文件
4.对目录进行限制
5.合理配置权限
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.6 URL重定向

关键字:
    redirect
    sendRedirect
    ModelAndView
    Location
    addAttribute  
修复:
1. 严格控制跳转域名。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.7 命令执行

关键字:
    Runtime.exec
    ProcessBuilder.command
    System.exec
    System.load
    System.loadLibrary
    Process.getInputStream
    Process.getOutputStream
    Process.getErrorStream
修复:
1.禁止使用Runtime.exec()发出"mail"命令
2.清楚所有输入以查找恶意字符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.8 XXE漏洞

关键字:
    NodeList
    DocumentHelper
    DocumentBuilderFactory
    Digester
    SAXParserFactory
    SAXBuilder
    XMLReader
修复:
1. 禁用DTD或者禁用外部实体
    //实例化解析类之后通常支持三个配置
    obj.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
    obj.setFeature("http://xml.org/sax/features/external-general-entities",false);
    obj.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
2. "DocumentBuilder builder=dbf.newDocumentBuilder()"代码需要将dbf.setFeature()之后才会生效。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.9 SSRF漏洞

关键字:
    HttpURLConnection.getInputStream
    URLConnection.getInputStream
    HttpClient.execute
    OkHttpClient.newCall.execute
    Request.Get.execute
    Request.Post.execute
    URL.openStream
    ImageIO.read
支持sun.net.www.protocol中所有协议,使用方法:
    URLConnection
    URL
只支持HTTPHTTPS协议:
    HttpURLConnection
    HttpClient
    OkHttpClient.newCall.execute
        
修复:
1.正确处理302跳转(业务角度看不能直接禁止302,而是对跳转地址重新做检查)
2.限制协议只能为HTTP/HTTPS,防止跨协议
3.设置内网IP黑名单(正确判定内网IP、正确获取host)
4.防火墙设置Web端口白名单(防止端口扫描)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.10 SpEL表达式注入

关键字:
    org.springframework.expression.spel.standard
    SpelExpressionParser
    parseExpression
    expression.getValue()
    expression.setValue()
        
修复:
    使用SimpleEvaluationContext安全类防御,支持SpEL语法的子集,抛弃JAVA类型引用、构造函数及Beam引用
    ExpressionParser parser = new SpelExpressionParser();
    EvaluationContext context=SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject(a).build();
    String name = (String) exp.getValue(context);
    System.out.println(name);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.11 JAVA反序列化

关键字:
    ObjectInputStream.readObject
    ObjectInputStream.readUnshared
    XMLDecoder.readObject
    Yaml.load
    XStream.fromXML
    ObjectMapper.readValue
    JSON.parseObject
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.12 SSTI模板注入

关键字:
    org.apache.velocity
        
修复:
1. 避免用户直接控制模板注入对其进行过滤,如果要向用户公开模板编辑则使用无逻辑模板引擎:Handlebars/Moustache等。
  • 1
  • 2
  • 3
  • 4
  • 5

2.13 整数溢出漏洞

关键字:
    int
  • 1
  • 2

2.14 硬编码密码漏洞

硬编码: 系统中采用铭文形式存储密码。
    
危害: 通常导致严重身份验证失败,系统管理员较难检测,检测到也难以修复。该漏洞会造成密码泄露。
1. 开发人员将代码托管到github等互联网平台,可能造成源码泄露,有权限即可读取。
2. 将后端凭证硬编码刷到前端软件中,使该程序任何用户可提取密码,从二进制文件提取密码非常简单。

使用硬编码的密码连接到数据库示例:
DriverManager.getConnection (url,"scott","tiger");

可以通过 javap -c 命令来访问反汇编代码,反编译代码将包含使用的密码值
javap -c ConnMngr.class
22:ldc #36; //String jdbc:mysql://ixne.com/rxsql
24:ldc #38; //String scott
26:ldc #17; //String tiger
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.15 不安全的随机数生成器

随机数是专门的随机试验结果。分为三类:
1. 统计学伪随机数生成器(PRNG): 伪随机数生成器从一个初始化种子值开始计算得到序列,从种子开始然后从种子计算出后续之,当种子确定后生成的随机数也确定,但其输出结果容易预测,容易复制数值流。
2. 密码学安全随机数生成器(CSPRNG): 密码学安全伪随机性是统计学伪随机数生成器的一个特例,给定随机样本的一部分和随机算法,不能有效演算处随机样本剩余部分。
3. 真随机数生成器: 其定义为随机样本不可重视。给定边界条件,真随机数并不存在,可如果产生一个真随机数样本边界条件十分复杂且难以捕捉(比如计算机当地本底辐射波动值),则可以认为用这个方法演算出真随机数。
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/682192
推荐阅读
相关标签
  

闽ICP备14008679号