0x00背景

在使用目录扫描时候。经常会发现dirsearch的目录中存在使用一些特殊字符的fuzz列表。但这种得到的结果经常是错误的,例如下面两个例子:

1

2

关于这些报错。就需要思考一下特殊字符在url中是怎么样被处理的。怎么样避免报错而又发挥出特殊字符在URL中的作用。还有一个问题是否有些特殊字符可以绕过访问限制,而实现一些漏洞点(例如使用../../这样跨越目录来达到任意文件读取这种)。

0x01开始

其实针对上面的问题。自己是没有头绪的。我也不知道怎么处理,因而也只有查资料,url中首先自定义的特殊字符:

# 用来标志特定的文档位置 %23
% 对特殊字符进行编码 %25
& 分隔不同的变量值对 %26
+ 在变量值中表示空格 %2B
/ 表示目录路径 &2F
\ 表示目录路径 %5C
= 用来连接键和值 %3D
? 表示查询字符串的开始 %3F
空格 空格 %20
. 往往是文件后缀 %2E

往往被URL用来定义用法的不会造成解析出错。上面的例子中使用的%2A(*)和:与$又该怎么被解析呢。

首先我能想到的是*和$都属于一种正则中的匹配符。如果写代码中存在对url的数据进行处理的话。那么极有可能这两种特殊字符就不会被匹配到。因而导致解析出错。

百度。。了好久都没发现啥东西。

干脆就看一下Shiro权限绕过中,特殊符号;是怎么权限绕过的。

参考文章:笑狮傅写的

具体是怎么权限绕过的:

比如说后台地址是/admin/index
这个时候如果我们访问/;/admin/index就能直接进入后台

关键的鉴权代码:

@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;
}
---
@GetMapping("/admin/page")
public String admin() {
    return "admin page";
}

这里大致意思就是/admin下的页面都需要鉴权。

跟进Shiro中Url获取以及匹配的相关函数:

org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain

而假如我们访问/;/admin/index就会被 getPathWithinApplication函数 直接处理而得到路径/

进入该函数会涉及到处理url的几个函数:

getContenxtPath()
getServletPath()
getPathInfo()

但问题并不出在这几个函数中,因为在获取url路径的时候传入:/;/admin/index被处理后依然达到的效果是访问:/;/admin/index

出问题的在最后的 decodeAndCleanUriString

decodeAndCleanUriString这个函数会把;(ascii为59)进行URL截断。因而导致

访问/;/admin/index被识别成了访问/

但按理说这样的话不就没能访问到后台功能页面。

这儿就涉及到了不同框架和服务器之间配合处理登录动作的问题。

总的来说是URL中的特殊字符;在进入Tomcat后会被函数截断而只取得了/admin/index

进入到Shiro时候,/;/admin/index被截断被认为是/而不需要鉴权。

再进入Spring时又被正确处理为了/admin/index。

而整个流程中,由于采用Shiro进行登录因而只有Shiro中一个鉴权。最终就成功进入了后台。

因而这里可以看出如果不是其中的decodeAndCleanUriString函数的特性。如果仅仅采用正常/;/的话就直接被处理成/了。这个例子中把;后面的部分都截断了,最终导致了权限绕过。

因而回到之前的特殊字符出错的话。还需要结合处理URl路径的代码,以及所采用的框架服务器共同讨论最终出现错误的原因,over.