文章来源:奇安信攻防社区(苏苏的五彩棒)
原文地址:https://forum.butian.net/share/942
在安全从业人员的日常工作中,Java相关组件出现高危漏洞的频率比较高。而代码审计就是挖掘源程序中的代码安全问题,其一直是发现应用程序漏洞的一种非常有效的方法。代码审计是黑盒渗透测试的重要补充,可以发现更多的隐藏问题。因此,代码审计通常被认为是 SDL 中非常重要的一部分。
随着Java Web应用的普及,安全审计成为了安全测试人员需要直面的工作。尽管PHP在中小互联网中仍然占有一席之地,但Java仍然是主流大型应用程序的首选开发语言,国内外大部分大型公司都使用Java作为核心开发语言。因此,对于安全从业者来说,Java代码审计成为了需要掌握的关键技能。
代码审计在攻防两方面都具有重要意义。在攻击方面,可以从各个平台找到系统泄露的源代码,进行审计,然后利用审计的漏洞获取系统权限。在防御方面,代码审计可以发现更多更隐蔽的漏洞,在产品上线之前将问题扼杀在摇篮中,做到安全左移。
代码审计与渗透测试的主要区别。
传统的开发存在结构混乱易用性差耦合度高可维护性差等多种问题,为了解决这些毛病分层思想和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框架应用
现在绝大多数的新项目都变成了基于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
先查看项目的开发框架、根据框架特性查找所有的API接口,然后查看从接口接收的参数,并跟踪参数,判断参数数据进入的每一个代码逻辑是否有可利用的点,此处的代码逻辑可以是一个函数,或者是个条件判断语句。
对于Spring框架,我们可以直接利用Spring注解查找API接口:@(.*?)Mapping(
注意打开idea 上的正则表达式
根据危险函数逆向追踪参数传递,这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的,只要找到这些函数,就能够快速挖掘想要的漏洞。
根据经验判断该类应用通常会在哪些功能中出现漏洞,直接审计该类功能的代码。
在源码中的pom.xml或Libraries中查看应用是否使用了带有已知漏洞的第三方组件或中间件。
对于某些漏洞,使用代码静态扫描工具代替人工可以显著提高效率。但是工具的误报率高,还需要人工去确认。
一般常用的工具有:Fortify
关注公众号李白你好后台回复Fortify免费获取
巧用burp安排某系统
2022-08-19
记一次对学校某系统的黑盒测试到教育SRC
2022-08-18
微信小程序渗透测试技巧
2022-08-16