外链论坛

 找回密码
 立即注册
搜索
查看: 8|回复: 0

php框架代码审计思路

[复制链接]

3011

主题

2万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99159151
发表于 6 天前 | 显示全部楼层 |阅读模式

程序员写在文案前:

本周技术分享,程序员小星想以“php框架代码审计”为题,与大众分享一下小星对代码的审计思路。但因为内容较多,此次小星先从兼容模式和path_info模式、命名空间、tp5的正常调用流程等七大部分与大众进行讨论。

(一)内容

1. MVC基本的架构

2. 漏洞挖掘

thinkphp、Yii、larevel

M 模块

V 界面

C 掌控

MVC设计模式的优点?

1)解耦合 2)多接口、降低研发成本 3)高复用

(二)运用方式

application 应用目录(放自己的代码)

|---- admin 放后台文件

|________controller

|---- index 放前台文件

|________controller

public 入口文件

|---- index.php 网站的入口文件

thinkphp 核心文件

(三)拜访方式

thinkphp所有的都是用URL来实现。

thinkphp的拜访模式:

1)http://localhost/index.php/模块名叫作/掌控器的名/办法名/参数/vaulue

2)http://localhost/index.php/模块名叫作/掌控器的名/办法名?参数=value

模块名叫作在application下,例如index文件夹是模块名。

掌控器的名:在index下有一controller,这个controller下有index.php,那他的掌控器的名便是index。

办法名:办法便是index.php下的有些办法叫作

构造URL:

http://localhost/index.php/index/Index/hello/name/11111

(四)兼容模式和path_info模式

1)tp运用兼容模式的写法:

http://localhost/index.php?s=index/Index/hello&name=1111

2)pathinfo拜访的模式:

http://localhost/index.php/index/Index/hello/name/11111

3)能够得到:

http://localhost/index.php?s=模块/掌控器/办法&参数=value

(五)关于命名空间

tp5遵循一个psr-4自动加载规范,他能够去自动加载类,需要恰当的、正确的命名空间。

一组的健康的、合格的tp5代码需要一个恰当的命名空间。

创建一个核心包下的文件kk.php。

得到一个关于命名空间的结论:

1)倘若你写在application下,那你命名空间的一个根路径是app;

2)倘若thinkphp下的think,那你命名空间的一个根路径就think;

3)倘若thinkphp下的traits,那你命名空间的一个根路径便是traits。

(六)问题根源

TP处理URL的一个特性,他运用全局变量。

http://localhost/index.php/index/\Index/hello/name/11111

http://localhost/index.php/index//Index/hello/name/11111

(七)tp5的正常调用流程

1. URL路由解析动态调试分析

1)先看他这个入口文件的调用便是public/index.php,按照他的入口文件去找相应的代码。

2)正式进入路由检测的一个办法

3)他会从下图中进一个path办法

4)他会从下图中进一个pathinfo办法

5)要从这儿进入一个server。

6)ltrim()办法能够把/index/Index/hello//name/11111这一段字符串的最左边的/index/Index/hello//name/11111,以上便是路径解析的一个过程。

2.路由解析动态调试

1)接下来会调用check办法

2)继续跟进check办法

3)后续他会用str_replace()办法来把斜杠修改成|,调用"use think\route\dispatch\Url as UrlDispatch; " 这个Url.php。

4)跟进至paresUrl中。

5)array_shift()取出第1个模块名,而后一样的手法给掌控器取出来并且赋值给$controller,再用一样的手法给$action赋值,最后他会把已然拆分的东西打包存放到这个route其中

6)后续把这一个route的内容返回到init中的$result中去。

7)接下来他会去new一个module类,然则这个module中没构造办法,因此他会调用一次父类的无参构造,而后再调用module下的初始化办法init。

8)在进入这个初始化办法后他会用parent::init();再调用一次父类的初始化办法

3. 开启debug后

1)倘若开启了debug,他就会对路由的信息进行记录。

2)这边会把请求的参数和URL位置进行参数合并,这边他会调用一次解析过滤器,然则这个过滤器他什么都没写, 因此相当于任何过滤。

3)刚才的一部分已先获取了一个字符串

/admin/index/hello

而后把上面的字符串处理成为了以下的形式

admin/index/hello

最后他会把去掉/的字符串便是路径会拆分赋值,如下:

$module = admin -->模块

$controller = index -->掌控

$action = hello -->办法

下期,咱们将就“路由动态测试”、“思路总结”两大部分与大众继续探讨,并附上小星在科研过程中的意外发掘,请大众继续支持!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-9 06:24 , Processed in 0.072456 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.