主页 > 网络知识 > Java代码审计入门篇:WebGoat 8(初见)(5)

Java代码审计入门篇:WebGoat 8(初见)(5)

如果希望为 findTop5() 创建命名查询,并与之关联,我们只需要在适当的位置定义命名查询语句,并将其命名为 “AccountInfo.findTop5″,框架在创建代理类的过程中,解析到该方法时,优先查找名为 “AccountInfo.findTop5″ 的命名查询定义,如果没有找到,则尝试解析方法名,根据方法名字创建查询。

因此识别出是JPA 命名查询语句创建查询的,需要去查看orm.xml查看定义的查询语句或在代码中查看@NamedQuery(或 @NamedNativeQuery)定义好查询语句是否安全。

总的来说:符合规范下JPA查询及其他数据库操作是比较安全的,但JPA也曾爆出漏洞(cve-2016-6652)感兴趣的朋友可以点击链接,查看详情。最后提一句,不是使用了厉害的框架,就能完全防止sql注入漏洞的,由于种种原因,在使用了安全的框架下,也会发生程序员使用直接拼接sql语句的情况。

回到AuthenticationManagerBuilder

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); //.passwordEncoder(bCryptPasswordEncoder()); }

追踪认证过程,我们可以知道,通过auth.userDetailsService(username),拿对应的对象(下图名为loadedUser),然后与从前端获取的username,password构成的authentication对象做对比,看credentials与password是否相等,决定了authenticated的值,从而完成认证过程。当然过程没有我说的那么简单,还有获取帐号的状态,然后根状态进行一系列操作的。

 

Java代码审计入门篇:WebGoat 8(初见)

 

审计注册功能

 

Java代码审计入门篇:WebGoat 8(初见)

通过/register.mvc定位代码

 

package org.owasp.webgoat.users; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @Controller @AllArgsConstructor @Slf4j public class RegistrationController { private UserValidator userValidator; private UserService userService; private AuthenticationManager authenticationManager; @GetMapping("/registration") public String showForm(UserForm userForm) { return "registration"; } @PostMapping("/register.mvc") @SneakyThrows public String registration(@ModelAttribute("userForm") @Valid UserForm userForm, BindingResult bindingResult, HttpServletRequest request) { userValidator.validate(userForm, bindingResult); if (bindingResult.hasErrors()) { return "registration"; } userService.addUser(userForm.getUsername(), userForm.getPassword()); request.login(userForm.getUsername(), userForm.getPassword()); return "redirect:/attack"; } }

重点关注:

@PostMapping("/register.mvc") @SneakyThrows public String registration(@ModelAttribute("userForm") @Valid UserForm userForm, BindingResult bindingResult, HttpServletRequest request) { //使用userRepository.findByUsername检测注册名是否已被使用,是则设置一个error //查看请求报文中密码和确认密码是否相同,不同则设置一个error userValidator.validate(userForm, bindingResult); //查看是否存在error if (bindingResult.hasErrors()) { return "registration"; } //追踪过去,addUser里面数据库操作使用自定义继承JpaRepository接口,没有注入问题。 userService.addUser(userForm.getUsername(), userForm.getPassword()); request.login(userForm.getUsername(), userForm.getPassword()); return "redirect:/attack"; }
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!