Ajp任意文件读取和包含漏洞调试
漏洞简述
Apache Tomcat AJP协议(默认8009端口)由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp目录下的任意文件。若服务器端同时存在文件上传功能,攻击 者可进一步结合文件包含实现远程代码的执行。
影响范围
1 | Tomcat 6.* |
遇到几个问题
Ajp如何到HTTP
漏洞触发原理及利用
调试过程中的问题
1. Ajp如何到HTTP
AJP协议是定向包(面向包)协议,采用二进制形式代替文本形式,以提高性能。
tomcat web路由 conf/web.xml
- 第一条:url 为
/开头
default路由,对应servlet,org.apache.catalina.servlets.DefaultServlet
- 第二条:url为
*.jsp,*.jspx
的路由,对应servle,org.apache.jasper.servlet.JspServlet
2. 漏洞触发原理及利用过程
漏洞原理:
在Ajp接受到数据后, 先进行prepareRequest()
获取request属性,然后getAdapter().service(request, response)
根据web路由发送servlet对象处理。
其中以*.jsp
, *.jspx
结尾的URI
会经JspServlet
处理,而其他请求资源使用DefaultServlet
处理。
在处理过程中使用了用户可控的request 属性,然后造成文件读取,及文件包含漏洞(需能上传文件)。
触发过程:
tomcat开启调试:
任意文件读取
执行poc:
Ajp处理数据:
- AjpProcessor->prepareRequest()取出request属性
getAdapter().service(request, response);
发送给HTTP servlet处理
- 获取get资源
- 通过
getRelativePath
获取资源路径
getAttribute
需要三个属性request_uri
= RequestDispathcher.INCLUDE_REQUEST_URLpath_info
= RequestDispathcher.INCLUDE_PATH_INFOservlet_path
= RequestDispathcher.INCLUDE_SERVLET_PATH可控路径
path
=servletPath
+pathinfo
即/WEB-INF/web.xml
- url目录来源resource对象根据url进行了一个路径匹配 然后在设置context的值
最终路径 =
url目录+ path
即/manager/WEB-INF/web.xml
获取资源
- 输出
文件包含RCE
运行poc , 这个1.jsp并不要实际存在,目的只是为了走JspServlet路由
test.xml是提前上传的文件
1 | //test.xml |
可控路径 = jspUri = servlet_path + path_info
最终路径 = url目录+jspUri
,即/manager/test.xml
由我们控制的 jspuri 被封装成了一个 JspServletWrapper 添加到了Jsp运行上下文 JspRuntimeContext 中.最后 wrapper.service() 会编译 test.xml ,并执行它的 _jspService() 方法来处理当前请求,我们的代码被执行。
在其他目录也是如此:
3. 调试过程中的问题
1. 为何不能跳出wabapps目录读取/etc/passwd
测试传递 ../../../../etc/passwd
- 存在
validate
对路径做验证
RequestUtil.normalize(String, boolean) line: 100
因为匹配到/../
返回0,然后报错
2. 有的目录下文件读取或包含不成功
原因:如访问/docs会先重定向/docs/
3. 调试时出现sourece not found
无法看到源码
解决方法:
debug配置中导入项目源码包
- 先导出,项目右键
export->jar
- 配置导入,
Debug config -> Add -> External Archive -> tomcat.jar
修复方法
1 | //tomcat修复 |
####参考链接