新手代码审计①

  • A+
所属分类:代码审计

导语

小明从乙方转为做甲方后,安全将不再仅仅是利用工具、扫描等进行黑盒测试了。还涉及到白盒测试——对代码进行审计,作为小白的我虽然懂得一些PHP语法,但却并不了解框架,看着一大堆的目录,并不知道一个请求地址过来,是执行的哪个文件中的哪一段代码。因此本文将带着大家一起来了解当我们访问一个页面时,框架是如何处理的,并执行的哪段代码。由此开启小白的代码审计之路。

MVC设计模式

在开始之前,我们需要先了解一下mvc设计模式的基本概念。

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,通俗一点的理解就是把前端静态资源、数据库操作、业务逻辑代码分开的方式组织代码。其中:

Model(模型)一般用于放置对数据库进行存取等操作的代码

View(视图)一般用于放置静态资源如前端代码、css等

Controller(控制器)用于存放接受用户输入和业务逻辑处理的代码。

看框架入口文件

本文将以ThinkPHP3.2框架为例来讲解,一个web项目文件如图1-1一样会存在很多的文件和文件夹。在原生PHP网站中,当我们访问一个url如http://127.0.0.1/aa/bb.php时,服务器执行的就是aa目录下的bb.php文件中的代码。但框架并不是如此。

我们的每一次url请求都会先执行框架入口文件即index.php文件,它的主要作用主要有4点:1、定义框架路径、项目路径;2、定义框架运行模式;3、定义系统相关常量;4、载入框架类。框架入口文件(index.php)

新手代码审计①

因此当我们在审计项目之前,应首先查看入口文件,查看框架运行模式(debug)是否开启,如果开启当程序出错时,将会在页面返回详细的错误提示。其次是查看框架自动加载的函数或文件,有些程序员为了方便会把一些xss、sql注入过滤放在自动加载函数或文件里,这样就实现了全局过滤,不用再每次获取参数时都进行一次安全过滤了。

在了解了上面两点之后,我们还需要查看他的应用目录配置,即define(‘APP_PATH’,’./Application/’)配置。其实当我们一个请求过来时,我们执行的是此配置目录下的某一模块中的文件。

新手代码审计①

在了解了index.php的配置之后,我们就应该查看Application/Common目录下的config.php文件。它是一个公共配置文件,主要会在此配置文件中写路由规则、数据库配置、模块配置等,如图1-4。在ThinkPHP框架中所有配置文件的定义格式均采用返回PHP数组的方式。

新手代码审计①

因此,当我们访问一个url地址为http://127.0.0.1/bb/Citystation/的时候其实执行的就是Application/Home/Controller下的bbController.class.php中的Controller方法。

还有一种就是当我们访问的是http://127.0.0.1/Admin/aa/Citystation/的时候,其实是访问的Application/Admin/Controller下的aaController.class.php中的Controller方法。有人会问了,为什么第一个没有加Home呢,那是在配置文件中,我们设置了默认的模块。框架的更多配置信息,可查看官方手册,这里不多说啦~~~

框架访问控制

在知道了这些知识之后,我们就可以定位文件了,但还不一定能定位到某一段代码。如图1-5所示,当我们请求地址为http://127.0.0.1/bb/Citystation的时候,我们到底是执行的哪段代码呢?

新手代码审计①

一般框架中可访问的方法都要求属性为public并且方法名要符合命名规范才能被浏览器访问到,在ThinkPHP中默认的规则要求就是只要方法名为public就可以被访问。(如SlightPHP中不仅需要方法为public,还需要方法名前缀为page.具体可以参考各框架说明)。这样我们就可以完美的定位文件和方法了。(框架小白的我真是开心O(∩_∩)O~~)

框架传参规则

在我们的日常测试中可能会遇到如下三种url请求类型:

http://127.0.0.1/?c=bb&a=Citystation&id=1

http://127.0.0.1/bb-Citystation-id-1

http://127.0.0.1/bb/Citystation/id/1

我们可以简单的理解为它们使用了不同的分隔符而已,第一二个参数都是告诉框架此次请求的是哪个文件中的哪个方法,而后面的参数就是我们的get传参了一个变量一个值.如本例中我们请求的是bb.page.php中的Citystation方法,get传递了一个id为1的值。

总结

1、当拿到一个框架开发的项目后,首先找入口文件,然后查看他的相应配置文件,看看它都加载了哪些东西,配置了哪些参数,是否有做全局安全过滤。

2、所有可以访问url页面逻辑,都会放在Controller目录里,除非遇到了搞怪的程序猿们。

3、如果找不到对应的文件,那一定是框架路由在作怪,那就去看看配置文件中的路由规则,一个应用目录下只有一个配置文件,每个应用目录下的模块也有一个配置文件。

mvc框架中的这些概念都是万变不离其宗的,变的只是不同的名字,不同的调用方式。了解了这些基本概念后,我们就可以愉快的找到对应的代码进行审计了。但这样还不能做到像大牛一样,从头到尾的全看代码来审计漏洞,因此在日常工作中,我们可以结合黑盒测试,每次发现有问题的点,就去看看有问题的代码都长什么样。当有了一些灵感,能准确的看出代码哪里写的有问题后,在日常的测试中,就可以对每个地址,针对某一个功能抓一个包,看看请求的哪个文件,传递了哪些参数,然后就可以直接审计代码是否有问题了。当你完全了解了业务逻辑和框架之后,就可以从头到尾只读代码来审计漏洞了。

转自:白帽大神 独行者 

本文始发于微信公众号(飓风网络安全):新手代码审计①

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: