主页 > 网络编程 > ThinkPHP 5.1框架结合RCE漏洞的深入分析(5)

ThinkPHP 5.1框架结合RCE漏洞的深入分析(5)

index.php?s=index/Test/hello/a/1&b=2

这时,我们知道了URL访问规则,当然也要了解下程序是怎样对URL解析处理,最后将结果输出到页面上的。

4.3 URL路由解析动态调试分析

URL路由解析及页面输出工作可以分为5部分。

1. 路由定义:完成路由规则的定义和参数设置

2. 路由检测:检查当前的URL请求是否有匹配的路由

3. 路由解析:解析当前路由实际对应的操作。

4. 路由调度:执行路由解析的结果调度。

5. 响应输出及应用结束:将路由调度的结果数据输出至页面并结束程序运行。

我们通过动态调试来分析,这样能清楚明了的看到程序处理的整个流程,由于在Thinkphp中,配置不同其运行流程也会不同,所以我们采用默认配置来进行分析,并且由于在程序运行过程中会出现很多与之无关的流程,我也会将其略过。

4.3.1 路由定义

通过配置route目录下的文件对路由进行定义,这里我们采取默认的路由定义,就是不做任何路由映射。

4.3.2 路由检测

这部分内容主要是对当前的URL请求进行路由匹配。在路由匹配前先会获取URL中的pathinfo,然后再进行匹配,但如果没有定义路由,则会把当前pathinfo当作默认路由。

首先我们设置好IDE环境,并在路由检测功能处下断点。

然后我们请求上面提到的Test.php文件。

http://127.0.0.1/tp5.1.20/public/index.php/index/test/hello/name/world

我这里是以pathinfo模式请求的,但是其实以不同的方式在请求时,程序处理过程是有稍稍不同的,主要是在获取参数时不同。在后面的分析中,我会进行说明。

F7跟进routeCheck方法。

route_check_cache路由缓存默认是不开启的。

然后我们进入path方法。

继续跟进pathinfo方法。

这里会根据不同的请求方式获取当前URL的pathinfo信息,因为我们的请求方式是pathinfo,所以会调用$this->server(‘PATH_INFO’)去获取,获取之后会使用ltrim函数对$pathinfo进行处理去掉左侧的’/’符号。Ps:如果以兼容模式请求,则会用$_GET方法获取。

然后返回赋值给$path并将该值带入check方法对URL路由进行检测。

这里主要是对我们定义的路由规则进行匹配,但是我们是以默认配置来运行程序的,没有定义路由规则,所以跳过中间对于路由检测匹配的过程,直接来看默认路由解析过程,使用默认路由对其进行解析。

4.3.3 路由解析

接下来将会对路由地址进行了解析分割、验证、格式处理及赋值进而获取到相应的模块、控制器、操作名。

new UrlDispatch 对UrlDispatch(实际上是think\route\dispatch\Url这个类)实例化,因为Url没有构造函数,所以会直接跳到它的父类Dispatch的构造函数,把一些信息传递(包括路由)给Url类对象,这么做的目的是为了后面在调用Url类中方法时方便调用其值。

赋值完成后回到routeCheck方法,将实例化后的Url对象赋给$dispatch并return返回。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!