JAVA代码审计基础(一)

admin 2022年8月20日14:44:58评论64 views字数 3759阅读12分31秒阅读模式
免责声明
由于传播、利用本公众号李白你好所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号李白你好及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!


文章来源:奇安信攻防社区(苏苏的五彩棒)

原文地址:https://forum.butian.net/share/942

0x01 前言

在安全从业人员的日常工作中,Java相关组件出现高危漏洞的频率比较高。而代码审计就是挖掘源程序中的代码安全问题,其一直是发现应用程序漏洞的一种非常有效的方法。代码审计是黑盒渗透测试的重要补充,可以发现更多的隐藏问题。因此,代码审计通常被认为是 SDL 中非常重要的一部分。

0x02 Java审计意义

随着Java Web应用的普及,安全审计成为了安全测试人员需要直面的工作。尽管PHP在中小互联网中仍然占有一席之地,但Java仍然是主流大型应用程序的首选开发语言,国内外大部分大型公司都使用Java作为核心开发语言。因此,对于安全从业者来说,Java代码审计成为了需要掌握的关键技能。
代码审计在攻防两方面都具有重要意义。在攻击方面,可以从各个平台找到系统泄露的源代码,进行审计,然后利用审计的漏洞获取系统权限。在防御方面,代码审计可以发现更多更隐蔽的漏洞,在产品上线之前将问题扼杀在摇篮中,做到安全左移。

0x03 与渗透测试的区别

代码审计与渗透测试的主要区别。
JAVA代码审计基础(一)

0x04 MVC框架

传统的开发存在结构混乱易用性差耦合度高可维护性差等多种问题,为了解决这些毛病分层思想和MVC框架就出现了,它强制性地使应用程序的输入、处理和输出分开。MVC即模型(Model)、视图(View)、控制器(Controller), MVC模式的目的就是实现Web系统的职能分工。最典型的MVC就是JSP + servlet + javabean的模式。

M---数据模型层1、javaBean(数据库表对应的映射类)2、JDBC工具类JDBCutiljava3、Dao(针对表的所有操作,点)4、Service (服务,事)

V----显示层
Html,Jsp

C----控制层
servlet,action,handler

下图就是一个典型的MVC框架应用
JAVA代码审计基础(一)
现在绝大多数的新项目都变成了基于Spring Boot的Spring MVC实现,曾经的Struts2框架已经逐渐没落,我们这里也主要以Spring MVC框架展开讲解。

在Spring3.0版本,引入了Java注解,我们只需要使用Spring MVC注解就可以轻松完成Spring MVC的配置了。下面就是一个基于Spring 注解配置的关于登录的控制器:

import java.util.List;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.system.common.annotation.Log;
import com.system.common.domain.Tree;
import com.system.common.utils.MD5Utils;
import com.system.common.utils.R;
import com.system.common.utils.ShiroUtils;
import com.system.domain.MenuDO;
import com.system.service.MenuService;

@Controllerpublic class loginCotrller extends BaseController {private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
MenuService menuService;

@GetMapping({ "/", "" })String welcome(Model model) { return "redirect:/login";
}

@Log("请求访问主页")
@GetMapping({ "/index" })String index(Model model) { List<Tree<MenuDO>> menus = menuService.listMenuTree(getUserId());
model.addAttribute("menus", menus);
model.addAttribute("name", getUser().getName());
model.addAttribute("username", getUser().getUsername()); return "index_v1";
}

@GetMapping("/login")String login() { return "login";
}

@Log("登录")
@PostMapping(value="/login")
@ResponseBody
R ajaxLogin(String username, String password) {
password = MD5Utils.encrypt(username, password);
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Subject subject = SecurityUtils.getSubject(); try {
subject.login(token); return R.ok();
} catch (AuthenticationException e) { return R.error("用户或密码错误");
}
}

@GetMapping("/logout")String logout() {
ShiroUtils.logout(); return "redirect:/login";
}

@GetMapping("/main")String main() { return "main";
}

@GetMapping("/403")String error403() { return "403";
}

}
Spring Controller注解:

@Controller
@RestController
@RepositoryRestController

Spring MVC请求配置注解:

@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

0x05 Java审计思路

(1)接口排查

先查看项目的开发框架、根据框架特性查找所有的API接口,然后查看从接口接收的参数,并跟踪参数,判断参数数据进入的每一个代码逻辑是否有可利用的点,此处的代码逻辑可以是一个函数,或者是个条件判断语句。
对于Spring框架,我们可以直接利用Spring注解查找API接口:@(.*?)Mapping(
注意打开idea 上的正则表达式

JAVA代码审计基础(一)

(2)危险函数

根据危险函数逆向追踪参数传递,这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的,只要找到这些函数,就能够快速挖掘想要的漏洞。

(3)功能点审计

根据经验判断该类应用通常会在哪些功能中出现漏洞,直接审计该类功能的代码。

(4)第三方组件、中间件版本

在源码中的pom.xml或Libraries中查看应用是否使用了带有已知漏洞的第三方组件或中间件。

(5)“工具”+“人工”

对于某些漏洞,使用代码静态扫描工具代替人工可以显著提高效率。但是工具的误报率高,还需要人工去确认。

一般常用的工具有:Fortify

JAVA代码审计基础(一)

0x05 Fortify获取

关注公众号李白你好后台回复Fortify免费获取

巧用burp安排某系统

2022-08-19

JAVA代码审计基础(一)

记一次对学校某系统的黑盒测试到教育SRC

2022-08-18

JAVA代码审计基础(一)

微信小程序渗透测试技巧

2022-08-16

JAVA代码审计基础(一)

JAVA代码审计基础(一)

原文始发于微信公众号(李白你好):JAVA代码审计基础(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月20日14:44:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JAVA代码审计基础(一)http://cn-sec.com/archives/1244862.html

发表评论

匿名网友 填写信息