1.跨目录上传
发现返回包返回了重命名后的文件名称和系统的绝对路径
继续看上传的文件
DownloadServlet?type=W***J&filename=QQ%E5%9B%BE%E7%89%8720230414145425.jpg&pyName=9be6c164-d5a9-4a1e-a555-139ec1ce383d.jpg
至此得到一个上传路径可控的有效上传点,且通过上传返回的绝对路径知道了当前的user名称(这个后面很关键)。
那么接下来的思路就是寻找系统的web路径,直接上传脚本getshell。尝试了一些常用的手法例如构造报错等均未找到目标,尬住了一会儿后,想到了之前的跨目录上传,既然上传处可以使用../进行跨目录,那么上传后的预览处呢?
2.任意文件读取
回到刚才的上传预览处
将预览功能处的请求链接中的filename与pyname进行构造尝试,果不其然,发现一处任意文件读取
DownloadServlet?type=W***J&filename=QQ%E5%9B%BE%E7%89%8720230414145425.jpg&pyName=9be6c164-d5a9-4a1e-a555-139ec1ce383d.jpg
得到任意文件读取后可以通过读取中间件的默认配置文件寻找更多信息,例如
tomcat
/usr/local/tomcat(tomcat-1.1.1(具体版本号))/conf/tomcat-users.xml
/usr/local/tomcat(tomcat-1.1.1(具体版本号))/bin/catalina.sh(其中日志的配置路径)
apache
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/httpd/access_log
/etc/httpd/logs/access_log
/etc/httpd/logs/error_log
/etc/httpd/logs/error.log
nginx
/var/log/nginx(nginx-1.1.1(具体版本号))/access.log
/var/log/nginx(nginx-1.1.1(具体版本号))/error.log
/usr/local/var/log/nginx(nginx-1.1.1(具体版本号))/access.log
/usr/local/nginx(nginx-1.1.1(具体版本号))/logs
/etc/nginx(nginx-1.1.1(具体版本号))/nginx.conf
通过旁站的其他端口的web指纹,发现使用的是tomcat
直接尝试读取tomcat的默认配置文件,均失败:)
接着尝试读取操作系统的默认路径,linux下常用路径如下
/etc/passwd 账户信息
/etc/shadow 账户密码文件
/etc/my.cnf mysql配置文件
/root/.ssh/id_rsa ssh-rsa私钥
/etc/redhat-release 系统版本
/root/.bash_history 用户历史命令记录文件
/home/user/.bash_history 特定用户的历史命令记录文件
/root/.mysql_history mysql历史命令记录文件
/var/lib/mlocate/mlocate.db 全文件路径
/proc/net/fib_trie 内网IP
/proc/self/environ 环境变量
/proc/self/loginuid 当前用户uid
最终通过/home/user/.bash_history中成功找到了tomcat的web路径
3.getshell
万事具备,直接上传至根目录下,访问
根目录下不解析,直接跳转到了登录页面,但是可以看到跳转目录携带了我们访问的jsp。
这种情况下,有账号的话(本系统提供了注册功能),直接登录后访问即可
4.一些拓展
上述的情况都是登录后测试的,如果上传点是fuzz出来的,没有目标系统的账号,也可以采取如下几种方案。
目录白名单绕过
例如本案例中的
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
前面有同学问我有没优惠券,这里发放100张100元的优惠券,用完今年不再发放