3.2 漏洞分析前的准备工作
本书主要是对网站开源的CMS已知的漏洞进行复现,通过代码分析来剖析漏洞。在知道漏洞发现、产生、POC构造之前,要熟悉目标程序。下面介绍目标程序的相关知识:网站程序构成和Web程序路由。
3.2.1 网站程序构成
网站的程序大多数是用面向对象语言开发的,采用MVC设计模式。MVC的目的是将M与V的代码实现分离,以便使用同一个程序表现不同的形式。
●M(Model):业务模型,可以理解为与数据库交互(进行增删改查等操作)的具体执行行为。
●V(View):视图,用于显示页面或展示保存在数据库中的数据。
●C(Controller):控制器,负责发出命令,让Model去执行具体操作,执行结果由View显示。
图3-1展示了基于MVC设计模式的网站目录构成,具体的网站程序会有些差异,但基本结构类似。
图3-1 网站目录构成
3.2.2 Web程序路由
网站的入口请求可根据URL路由映射知晓其链接运行的代码。URL路由方式有如下几种。
第一种,通过URL参数进行映射的方式,有四个参数,分别代表功能模块、控制器类、方法、数据值。比如index.php?m=admin&c=index&a=method&team=1映射到的是admin模块下的(一般是后台程序)index控制器的method方法,参数team的值为1。
第二种,URLrewrite方式(也称伪静态方式),可以实现对非PHP结尾的其他后缀进行映射。通过rewrite也可以实现第一种方式,不过单纯使用rewrite的方法也比较常见,一般需要配置Apache或者Nginx的rewrite规则。
第三种,pathinfo方式,比如test.com/index.php/admin/index/action/team/1,Apache在处理这个URL的时候会把index.php后面的部分(/admin/index/action/team/1)输入到环境变量$_SERVER['PATH_INFO']中,然后路由器再通过解析这个字符串进行分析。index.php后面的部分根据各个框架的不同而有所区别,涉及的结构基本如下:
●http://domain.com/模块名/控制器/ => http://domain.com/?m=模块名&c=控制器
●http://domain.com/模块名/控制器/方法/ => http://domain.com/?m=模块名&c=控制器&a=方法
●http://domain.com/模块名/控制器/?参数1=值1&…参数N=值N => http://domain.com/?m=模块名&c=控制器&参数1=值1&…参数N=值N
●http://domain.com/模块名/控制器/方法/?参数1=值1&…参数N=值N => http://domain.com/?m=模块名&c=控制器&a=方法&参数1=值1&…参数N=值N