关于java的任意文件读取

关于java web中web.xml详情

web.xml是用于描述应用的类、资源和配置,以及网络服务器如何使用它们处理网络请求。当网络服务器收到应用请求时,它使用部署描述符将请求网址映射到应处理该请求的代码,以<web-app>为根节点,简易示例如下:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>comingsoon</servlet-name>
        <servlet-class>mysite.server.ComingSoonServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>comingsoon</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

其中web-app为根节点,第一个配置描述是servlet,定义了servet-name与下servlet-mapping节点对应,用于将mysite.server.ComingSoonServlet中的服务映射到/*中。在servlet节点下,支持

  • servlet-name => servlet名称,与servlet-mapping节点对应
  • servlet-class => servlet所对应的java类,例子 =》 com.metawerx.servlets.URLRewriter 其对应的路径应该是 =》 /WEB-INF/classes/com/metawerx/servlets/URLRewriter
  • init-param => 初始化参数, 可以在java代码中利用 String teamColor = getServletConfig().getInitParameter("teamColor");调用
  • load-on-startup => 定义调用参数时间?这里没太懂
  • jsp-file 此处可直接定义jsp文件,会自动编译执行,此节点的值就是jsp文件的路径

servlet节点类似的还有filter节点,是用于声明过滤器

<filter>
    <filter-name>logSpecial</filter-name>
    <filter-class>mysite.server.LogFilterImpl</filter-class>
    <init-param>
        <param-name>logType</param-name>
        <param-value>special</param-value>
    </init-param>
</filter>


<!-- Log for all URLs ending in ".special" -->
<filter-mapping>
    <filter-name>logSpecial</filter-name>
    <url-pattern>*.special</url-pattern>
</filter-mapping>

<!-- Log for all URLs that use the "comingsoon" servlet -->
<filter-mapping>
    <filter-name>logSpecial</filter-name>
    <servlet-name>comingsoon</servlet-name>
</filter-mapping>

过滤器是java中给web服务器管理的所有web资源的方法,在调用<filter-map>中的url之前,首先会交给<filter-class>去处理,详细配置参数参考servlet
过滤器详细作用

<security-constraint>在google文档里的解释如下:

用于为与格式匹配的网址定义安全约束。如果用户访问的网址路径具有安全约束,并且用户没有登录,则 App Engine 会将用户重定向到 Google 帐号登录页面。在用户成功登录或注册新帐号后,Google 帐号会重定向用户,使其返回应用网址。该应用无需执行任何其他操作,即可确保只有已登录用户才能访问该网址。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>profile</web-resource-name>
        <url-pattern>/profile/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

<welcome-file-list>和名字一样,是定义index主页的节点,如下:

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

基于任意文件读取设计自动化信息搜集工具

写这篇文章的原因就是最近做项目,遇见了很多关于java的任意文件读取的漏洞,包括解析失效而导致(这个真的很奇葩,遇见过几个漏洞,如果是域名访问,就是解析后返回的动态信息,但是如果是利用ip访问就是jsp源码 + WEB-INF目录遍历,初步猜测可能是类似Nginx的代理功能导致,对ip并没设置proxy_pass而是root路径,并且直接对应到了web目录导致的信息泄漏)
对于这个脚本,基于任意文件读取,我们的输入应该是https://xxx.xxx/?file=../WEB-INF/web.xml,告诉程序泄漏的web.xml位置,让程序自动分析,并且将整个能猜测到的项目爬下来,减少我们人工的工作量,我们主要会关注的是servletfilter节点,从而拿到引用的class。以及尽可能多的搜集到配置文件,JavaWeb 中,配置文件一般以xml文件的形式存在服务器上,所以需要一个正则去迭代匹配xml文件并下载,并还原远程的目录情况。

🔗GitHub链接地址

效果如下:
1

2

*** 由于是真实环境就把一些敏感信息作马赛克处理 ***
v1.0需改进地方:

  • 无法解析classes拿到里面引用包信息
  • 只考虑了代码在classes的情况(能读到的是不是只能在com?后续学习java web再补全)
  • ……
# 基本上这是我第一次用git,大概记一下push步骤吧
git init .
# 在github上面建立新库
git commit -m "v1.0"
# 增加commit
git remote add origin "https://github.com/xxxxx"
# 增加远程仓库
git pull --rebase origin master
# 拉下刚之g前的版本
git push origin master
# push代码

关于任意文件读取的信息收集

一般会尝试去读取这些敏感目录:

# bash基础配置文件:
/etc/passwd  # 读取用户情况,服务情况,若有某用户有bash 可读取其 bash_history
/root/.bash_history   #查找用户bash输入历史,可能可以读到mysql密码,web服务器路径等
/etc/shadow  # 密码,很难解密
/etc/hosts  #
/root/.ssh/known_hosts # ssh记录登陆过的hosts,可配合bash_history登陆旁站
/etc/ssh/sshd_config # ssh config ,如果开启了密钥登陆,可以读取密钥文件


# nginx:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx-x-x/conf/nginx.conf #x-x是版本号
/usr/local/etc/nginx/nginx.conf

# apach: 
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf

参考:
http://wiki.metawerx.net/wiki/Web.xml
https://cloud.google.com/appengine/docs/standard/java/config/webxml?hl=zh-cn

发表评论