漏洞分析 | 一篇文章教你搞懂ajp文件包含

2018-11-27

高质量的安全文章,安全offer面试经验分享

尽在 # 掌控安全EDU #


作者:掌控安全学院核心成员-holic

0x01. 前言



时隔应该快一年了吧,具体ghost这个漏洞出来我也忘记了,由于我最近无聊,然后想起我使用的tomcat有没有漏洞,

 于是我就来试了试,顺便分析一下这段已经时隔许久的漏洞,依稀记得上次的文章是简单的复现~~ 反正是闲的无聊

0x02. 环境部署



idea2020.2 + tomcat7.0.99+jdk1.8

具体参考下面的文章,idea导入Tomcat源码:
环境与exp打包好,在附件中~

后台回复:“附件”即可

https://blog.csdn.net/u013268035/article/details/81349341

https://www.cnblogs.com/r00tuser/p/12343153.html

0x03.漏洞的基础




Tomcat部署的时候会有两个重要的文件

而Tomcat在 server.xml中配置了两种连接器。

其中包含的是AJP Connector和HTTP Connector

AJP Connector说明启用了8080和8009端口,这时候我们可以看一下


而相对于,8080我们是可以访问的


也就是说,8080是负责Http协议,8009负责接收ajp协议;


提问1:AJP协议和HTTP协议有什么区别吗?


HTTP协议:负责接收建立HTTP数据包,成为一个web服务器,处理HTTP协议的同时还额外可处理Servlet和jsp

AJP协议: 负责和其他的HTTP服务器建立连接, 通过AJP协议和另一个web容器进行交互

Web用户访问Tomcat服务器的两种方式

而一个Tomcat就是一个server,其中包含多个service;

而每个service由Connector、ContainerJsp引擎、日志等组件构成,造成漏洞的关键地方是Connector、Container

Connector上面已经说过分别是AJP ConnectorHTTP Connector ,是用来接受客户端的请求,请求中的数据包在被Connector解析后就会由Container处理。这个过程大致如下图:

一次请求的处理可以划分为ConnectorContainer进行处理,经历的过程大致如下:

  • 一个TCP/IP数据包发送到目标服务器,被监听此端口的Tomcat获取到。

  • 处理这个Socket网络连接,使用Processor解析及包装成request和response对象,并传递给下一步处理。

  • Engine来处理接下来的动作,匹配虚拟主机Host、上下文Context、Mapping Table中的servlet。

  • Servlet调用相应的方法(service/doGet/doPost…)进行处理,并将结果逐级返回。


    小结


对于使用HTTP协议或AJP协议进行访问的请求来讲,在解析包装成为request和response对象之后的流程都是一样的

主要的区别就是对 socket流量的处理以及使用Processor进行解析的过程的不同

也就是第二步的地方出现问题


0x04.源码分析



通过第三步中,我们知道是Processor的解析过程不同,而提供这部分功能的接口,在 org.apache.coyote.Processor主要负责请求的预处理。

而此处AjpProcessor则是处理ajp协议的请求,并通过它将请求转发给Adapter,针对不用的协议则具有不同的实现类。

我们从上面wirshark抓包可以看出

可以看出这边是设置了三个莫名其妙的东西

通过exp源码可以看到这边是设置了三个域对象的值


可以看出,我们这边是执行成功了,由于wirshark抓包没有去截图,又关闭了,所以就不截图了

这边可以假设请求参数时是写死,也就是xxx.jsp文件,而jsp后缀等等原因,然后成功进行了文件包含

那么我们的test.txt是怎么识别的?


我们继续往下看,来解决种种疑惑

知道是这个prepareRequest()问题,我们f7跟进去看看


进入了该方法的内部,我们继续跟进查看,这边进行判断,获取到了请求参数为GET

首先是一些解析数据包读取字节的操作

while循环获取,switch判断

attributeCode=10时,则进入第一条分支,继续f8进去




是不是有了有种眼熟的感觉~~~ 其实就是往域对象中存值

由于if都不满足,直接进入了最后这个比进的else分支


最后进入第二个步骤的最后一小步,f8继续下一步走,在预处理完了request headers之后,在adapter里面处理request,然后调用Adapter将请求交给Container处理


进入service方法,然后f8一直跟进

直到跟进此处,请求会发送到对应的servlet,我们请求的是一个jsp文件,根据tomcat的默认web.xml文件

通过上面假设tomcat默认将jsp/jspx结尾的请求交给org.apache.jasper.servlet.JspServlet处理,它的service()方法如下:


而jspUri等于null,满足条件,则进入该if条件分支

由于javax.servlet.include.servlet_path可控制,通过getAttribute去域对象中获取属性名为javax.servlet.include.servlet_path的值,得到值为 test.txt


此时,jspUri的值为/test.txt

pathInfo的值此时为空


最后一直到下面,传入serviceJspFile方法中

继续跟进,会先判断文件是否存在,如果存在,随后才会初始化wrapper最后调用JspServletWrapperservice方法来解析,从而导致本地文件包含

环境与exp打包好,后台回复:“附件”即可

参考


https://gitee.com/wdragondragon/javasec/blob/master/tomcat%20ajp%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.md

https://www.cnblogs.com/r00tuser/p/12343153.html

https://xz.aliyun.com/t/7325#toc-6

https://zhishihezi.net/b/5d644b6f81cbc9e40460fe7eea3c7925#



回顾往期内容


扫码白嫖视频+工具+进群+靶场等资料


 


 扫码白嫖


 还有免费的配套靶场交流群哦!



相关文章

Linux学习笔记 day15

2019-09-24
表示本地,Virbro是一个虚拟桥接网络接口,主要用于虚机主机.up表示接口为启用状态;inet表示IPv4地址;netmask表示子网掩码;...

澜起津逮C6248R处理器评测

2019-06-04
安装虚拟化宿主机非常顺利,大压力下CPU运行平稳.虚拟机操作系统本次虚拟机测试了IC圈内主流的操作系统Centos6.9(可以一统...

Jmeter 性能常见问题集锦

2019-04-13
3、不支持虚拟主机,不支持相关的方法,不支持存储证书的请求HttpClient4.1:使用的是Apache HttpClient4.1部件空白:使用Http默...

昭棠:快速搭建企业类网站的方法

2019-04-04
第一步:虚拟主机找到FTP,账号和密码第二步:下载工具下载FTP:http://soft.onlinedown.net/soft/2506.htm第三步:网站安装,这里举...

原创|NO.C.0009——OpenStack|实例创建|启动一个实例|创建密钥对|添加额外云硬盘|通过控制台访问实例|

2019-03-20
一、实例创建(这也就是我们购买云主机的步骤)创建秘钥对:提供一个密钥对的认证方式,是可选选项,也是可以自动识别的启动一...

VMware vSphere 6.7 虚拟化搭建及配置完整详细手册 | 周末送资料

2019-03-07
与主机名三 、配置 Starwind V8 虚拟存储1、配置 ISCSI Targets1.1、右键 Targets,选择 Add Target1.2、输入 Target 名称,直到完成...

ASP.NET--WebForm框架

2019-02-26
获取服务器上ASP.NET虚拟应用程序的根目录路ertLengertLength:指定客户端发送的内容长度7.Cookies:获取客户端发送的Cookie...

40题

2019-01-31
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP通告信息,BACKUP不会抢占MASTER,除非它的优先级更...

再见虚拟机,手把手教会你在 Kubernetes 中安装 Windows 10 操作系统

2019-01-25
确保虚拟机实例的启动状态,与虚拟机实例是 1:1 的关系,类似与 spec.replica 为 1 的 StatefulSet.VirtualMachineInstanceReplicaSet ...

TurnKeyInternet:无限硬盘 数据库 email虚拟主机1折促销 1美元/月 带独立IP 3美元/月 VPS

2019-01-18
无限email SSD硬盘虚拟主机C5 cPanel Web Hosting 1折 90% OFF配置:Unlimited Disk Databases, Email价格:1美元/月https://...

随机推荐

跨界IT:开发我的PLC跨平台操控系统

2020-09-06
php环境搭建,WAMP的搭建以及概念的理解注意:本课程并不是上位机课程,而是真正意义自己编写上位机软件课程,其中包含了云...

开源PHP论坛关闭,项目停止,作者出走开源

2020-08-31
国内较为有名的开源 PHP 开源论坛修罗 BBS(Xiuno BBS)已于 7 月 6 日关闭,目前未见官方公告,访问该网站可见简单的说明:国内...

PHP开发岗位,互联网金融不仅仅有P2P--By OfferCome

2020-07-09
要求:后端开发:需3年以上一二线互联网公司PHP开发经验;架构师:如有app后端开发经验者优先.薪水:35~50W+期权地点:中...

LAMP架构应用实战——PHP环境安装配置

2020-05-14
and assign it the style x-httpd-php. All files in it willINSTALL: AddType application/x-httpd-php .phpINSTALL: AddType application/x-...

【编码技巧】python字符串格式化教你正确打印

2018-05-09
截取2位字符串整数%o八进制%d十进制%x十六进制%10d右对齐,取10位,不够则补位%-10d左对齐,取10位,不够则补位%010d右...

Python中map是什么意思

2018-03-04
意思就是可以传很多个iterable,如果有额外的iterable参数,并行... Python基础文章总汇岁月有你 惜惜相处

「For the Love of It」

2017-02-08
——Russell WestbrookJordan BrandFOR THE LOVE OF IT.RW FOR JUMPMAN 2020全新Russel Westbrook服饰已上架

JAVA8快速写入和读取文件

2015-11-16
Java IO读取文件的方式 * @return * @throws Exception */public static List readFileIO() throws Exception { File file = new File(FILE_...

漫画:什么是时间复杂度?

2015-04-23
时间复杂度的意义究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司......一天过后,小灰和...

支付宝小程序公开测试 向微信致敬

2015-01-06
今日,支付宝小程序正式开启公测,面向开发者入驻.公测期间,支付宝小程序开放了6大类目,涵盖航旅交通、商业及生活服务、生...