回馈粉丝-Larave漏洞详解

365bet手机版网址:2020-02-27 365bet体育在线平台: 9085 次

0x0 安装

365bet体育在线平台在分析Laravel框架之前,需要先安装好,365bet体育在线平台推荐大家使用的是 composer ,因为Laravel有 很多的插件,365bet体育在线平台使用 composer 安装相当于一键安装,相当的方便。至于 composer 的安装不再 啰嗦,365bet体育在线平台直接开始安装Laravel.

因为原本的 Laravel-china 已经失效,365bet体育在线平台直接替换阿里云的镜像,在国内下载会非常快

1.composer config -g repo.packagist composer

2.https://mirrors.aliyun.com/composer/

直接实行完毕后,365bet体育在线平台安装 Laravel ,我都是安装的5.6版本

1.composer create-project laravel/laravel=5.6.* test

2.知道看到 successfully 后安装完毕, composer 会把下载好的 Laravel 放在 test 目录

我使用的是 PHPENV 的集成开发环境,365bet体育在线平台直接配置站点

0x1 路由与控制器

365bet体育在线平台先来熟悉一下Laravel框架,365bet体育在线平台拿到这个框架很明显可以发现他是 MVC 的架构,365bet体育在线平台直接访 问这个 a.com 出现的页面他是怎么产生的?365bet体育在线平台找到 routes 这个目录下的 web.php

365bet体育在线平台可以看到它是指向了模板 welcome ,他的位置在 resiyrces 下的 welcome.blade.php 365bet体育在线平台来先容一下这个路由

365bet体育在线平台来增加一个路由看一下

365bet体育在线平台来增加一条这样的路由,正常情况下 funtion() 的位置是一个控制器,但是365bet体育在线平台目前还没有 提到控制器,所以暂时写一个 function() ,这样的话365bet体育在线平台去访问 a.com/baidu 就可以看到页面 打印出 baidu

当然路由也是可以传参的,365bet体育在线平台直接修改一下

365bet体育在线平台去访问 a.com/baidu/aaa 的话就会输出 baiduaaa ,这些都是可以由365bet体育在线平台控制的。

控制器的话365bet体育在线平台就要知道365bet体育在线平台 Laravel 框架下有一个叫 artisan 的文件,他是可以做很多事情 的,365bet体育在线平台使用 cmd 进入到目录,运行命令 php artisan list ,可以发现有很多功能,它可以生 成控制器、操作数据库等等。大家可以下去看一下 Laravel 的手册,365bet体育在线平台可是使用它来生成一个 控制器来看一下:php artisan make:controller CommentController ,他就会帮365bet体育在线平台在 app/Http/Controllers 目录下生成控制器,下面365bet体育在线平台可以来写一下这个控制器。

当365bet体育在线平台写了这个 index 控制器之后,365bet体育在线平台可以去路由里面调用控制器,365bet体育在线平台回到 web.php Route::any("index","CommentController@index"); 这样365bet体育在线平台的控制器就和路由绑定在一起 了,365bet体育在线平台来访问一下 a.com/index 就会发现页面返回了 index ,365bet体育在线平台这里用的是 any ,当然也可 以用 get、post 这些,那么365bet体育在线平台就可以来试试获取一个参数,365bet体育在线平台在控制器的函数中写:

dump()其实是打印的意思 365bet体育在线平台直接使用 get 请求的方式去访问一下 a.com/index?id=111 他就会打印出 111 ,但是这里要注意就是 post 直接发包过去是不行的,会触发 Laravel 的错误, 这是因为它为了防止 CSRF 漏洞,这是 Laravel 的一个规则限制。

0x2 Laravel数据库操作内核分析

首先365bet体育在线平台在项目文件夹下有一个 .env 的文件,365bet体育在线平台先去配置一下数据库

365bet体育在线平台在目录下运行 php artisan -V ,来查看一下365bet体育在线平台的 Laravel 版本365bet体育在线平台在目录下运行 php artisan -V ,来查看一下365bet体育在线平台的 Laravel 版本

Laravel Framework 5.6.39

然后365bet体育在线平台来创建一个控制器来测试365bet体育在线平台的数据库是否可以链接正常。

php artisan make:controller UserController

找到365bet体育在线平台的 UserController.php ,然后测试一下数据库链接

然后配置 web.php 路由

Route::any("index","UserController@index");

这就是最简单的一个操作,看看是否可以查出来:

http://a.com/index?id=1

这样365bet体育在线平台其实可以在 dump 的时候 dump($data[0]) 就好了 365bet体育在线平台发现数据成功的查出来了。这时候365bet体育在线平台在 $id、$data 两行下断点来进行调试,分析一下它 们。

首先365bet体育在线平台来分析一下 input 做了什么操作,365bet体育在线平台 F7 跟进去 来到了这个地方:

365bet体育在线平台可以发现是 get 请求。

继续往下走。

再接着走下去之后可以看到这个 parameters 其实就是365bet体育在线平台传入的参数。走出去之后365bet体育在线平台来到

此时365bet体育在线平台就可以看到 $key 就是一个数组了。再往下是一个 array_shift ,把 $key 传给了 $segment ,然后 $segment 不等于空直接走

来到这里,这里365bet体育在线平台走下去看一下, $target = $target[$segment]; 其实就是把365bet体育在线平台的参数 1 赋值给了 $target ,然后直接返回掉。这就是365bet体育在线平台的 input() ,也没有进行任何的过滤就拿过来 了,但是它底层其实是一个PDO,大家可以看一下 Laravel 的手册,他的过滤限制可以在路由里 面进行限制的(使用替换后)。然后365bet体育在线平台继续分析 F7 走进去,看到 load()

他这里其实是在实例化对象。然后往下走,进入 return class_alias($this->aliases[$alias], $alias); 来到 __callStatic ,这些都是魔术方法,直接走过去

然后365bet体育在线平台就来到了 where ,这里主要是为了得到 where 语句的,前面都是一些判断。

这些地方的 value 的值都是365bet体育在线平台的参数。

在这边将 $type = 'Basic'; 

然后

这里其实是有东西的。365bet体育在线平台可以直接看一下这个 $this

365bet体育在线平台解这往下走,在下方看到 $this->addBinding($value, 'where'); 这里的一个加入绑定,继 续跟进,进入了 addBinding 之后看到它还是对 $this 进行了一些赋值。

继续返回到 get() ,365bet体育在线平台看一下 get 里面是怎么回事,跟进函数 来到了 onceWithColumns 函数,365bet体育在线平台走下去看看情况~

来到 $result = $callback(); 的时候注意,在这里下个断点。因为下面他直接 return $result 了,365bet体育在线平台下个断点之后直接 F8 走过去看看效果

365bet体育在线平台可以发现,这时 $result 已经被查出来了,所以365bet体育在线平台很有必要进入这个函数看一下。365bet体育在线平台一 直往里跟进到拼凑 SQL 语句的地方。365bet体育在线平台来到了 compileSelect 这个函数,这里还不是核心的地方,继续 F8 往下走

这里就是一个核心点了。365bet体育在线平台走下去看看,365bet体育在线平台这里就要对 $sql 加一个监视,仔细看他的操作 在下面的 foreach 中365bet体育在线平台看到 $this->selectComponents 这里选择组件依次遍历并赋值给 $sql 在循环内做了一个判断 ! is_null($query->$component) ,判断它是不是空的,无关紧要的就进 不来,365bet体育在线平台运行下去

走下去可以看到365bet体育在线平台的 $sql 已经拼接完毕了 sql 语句。365bet体育在线平台看一下这个语句

这边直接走下去看 $result 把。

走完全部循环就拿到了需要绑定的值。然后365bet体育在线平台来到 select 语句的位置

365bet体育在线平台前面已经把 sql 语句和绑定的值准备好了,下面就要去 select 查询了。365bet体育在线平台跟进 run

首先去重连了一下 

mysql :$this->reconnectIfMissingConnection(); 然后记录实行的开始时间:$start = microtime(true); 来到 $result = $this->runQueryCallback($query, $bindings, $callback); 这里实行完毕 就会返回实行结果,所以365bet体育在线平台要跟进去。看到了 $result = $callback($query, $bindings); 这里的 $query 就是365bet体育在线平台的语句, $bindings 就是365bet体育在线平台要绑定的值。365bet体育在线平台继续往里走,发现又到了 run ,他会首先 pretending , 然后下面的东西365bet体育在线平台就很熟悉了

365bet体育在线平台回顾一下PDO编译实行的三个步骤:

然后就 prepared 结束下去进行 bindValues ,绑定结束后就去 execute 实行了,然后 return $statement->fetchAll(); 就拿到结果了。然会回去

这时候数据就查询完毕了。分析完毕后365bet体育在线平台就可以看到 Laravel 就是PDO的方式,可以有效的防 止注入,但是不规范的写法依然会造成注入。

 

转自:圈子社区

分享到:
×

微信扫一扫分享

XML 地图 | Sitemap 地图