GlassFish 任意文件读取漏洞复现
GlassFish 任意文件读取漏洞
漏洞原理
glassfish 是一款 java 编写的跨平台的开源的应用服务器。
java语言中会把 解析为 ,最后转义为ASCCII字符的(点)。利用 来向上跳转,达到目录穿越、任意文件读取的效果。所以 glassfish 这个 poc 实际上就是//https://www.freebuf.com/articles/etc/passwd。
影响版本:
< 4.1.1(不含 4.1.1)
漏洞复现
如下测试环境借助 vulhub 的 docker 镜像,附上 P 师傅的链接:https://github.com/vulhub/vulhub?
编译、运行测试环境,本环境超级管理员密码在 中设置,默认为 ,在4848端口利用该密码可以登录管理员账户。
docker-compose up -d环境运行后,访问 和 即可查看 web 页面。其中,8080 端口是网站内容,4848 端口是 GlassFish 管理中心。
无需登录,直接访问 ,发现已成功读取 内容:
POC & EXP
如下是 Xray 的 POC,其只穿越了上级目录,检测了版本信息,不涉及敏感信息,但同样也验证了漏洞存在。
漏洞修复
1. 关闭远程管理关闭远程管理,关闭后只允许本地访问,会提示要求输入用户名和密码,开发环境或者对服务器安全要求较高的环境可以选择这么做,修改该设置后应该重启 GlassFish 服务
https://www.freebuf.com/articles/web/asadmin change-admin-password https://www.freebuf.com/articles/web/asadmin disable-secure-admin https://www.freebuf.com/articles/web/asadmin stop-domain https://www.freebuf.com/articles/web/asadmin start-domain asadmin.bat change-admin-password asadmin.bat disable-secure-admin asadmin.bat stop-domain asadmin.bat start-domain需要注意的是,关闭远程访问只能禁用远程 login 登录,但是攻击 url 还是可以访问,任意文件读取依然存在
2. IPtables 规则
iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '..\%c0\%af' -j DROP iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '\%c0\%ae/' -j DROP iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string 'https://www.freebuf.com/articles/' -j DROP //该规则无法防御HTTPS SSL方案3. 禁用 web.xml theme 映射\glassfish4\glassfish\lib\install\applications__admingui\WEB-INF\web.xml
<!-- <servlet-mapping> <servlet-name>ThemeServlet</servlet-name> <url-pattern>/theme/*</url-pattern> </servlet-mapping> -->重启 glassfish 后生效
参考资料
https://www.trustwave.com/Resources/Security-Advisories/Advisories/TWSL2015-016/?fid=6904