回馈粉丝-Larave漏洞详解

澳门十大网赌网址:2020-02-27 澳门十大正规网站: 9412 次

0x0 安装

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

因为原本的 Laravel-china 已经失效,大家直接替换阿里云的镜像,在国内下载会非常快

1.composer config -g repo.packagist composer

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

直接实行完毕后,大家安装 Laravel ,我都是安装的5.6版本

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

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

我使用的是 PHPENV 的集成开发环境,大家直接配置站点

0x1 路由与控制器

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

大家可以看到它是指向了模板 welcome ,他的位置在 resiyrces 下的 welcome.blade.php 大家来先容一下这个路由

大家来增加一个路由看一下

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

当然路由也是可以传参的,大家直接修改一下

大家去访问 a.com/baidu/aaa 的话就会输出 baiduaaa ,这些都是可以由大家控制的。

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

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

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

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

首先大家在项目文件夹下有一个 .env 的文件,大家先去配置一下数据库

大家在目录下运行 php artisan -V ,来查看一下大家的 Laravel 版本大家在目录下运行 php artisan -V ,来查看一下大家的 Laravel 版本

Laravel Framework 5.6.39

然后大家来创建一个控制器来测试大家的数据库是否可以链接正常。

php artisan make:controller UserController

找到大家的 UserController.php ,然后测试一下数据库链接

然后配置 web.php 路由

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

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

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

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

首先大家来分析一下 input 做了什么操作,大家 F7 跟进去 来到了这个地方:

大家可以发现是 get 请求。

继续往下走。

再接着走下去之后可以看到这个 parameters 其实就是大家传入的参数。走出去之后大家来到

此时大家就可以看到 $key 就是一个数组了。再往下是一个 array_shift ,把 $key 传给了 $segment ,然后 $segment 不等于空直接走

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

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

然后大家就来到了 where ,这里主要是为了得到 where 语句的,前面都是一些判断。

这些地方的 value 的值都是大家的参数。

在这边将 $type = 'Basic'; 

然后

这里其实是有东西的。大家可以直接看一下这个 $this

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

继续返回到 get() ,大家看一下 get 里面是怎么回事,跟进函数 来到了 onceWithColumns 函数,大家走下去看看情况~

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

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

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

走下去可以看到大家的 $sql 已经拼接完毕了 sql 语句。大家看一下这个语句

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

走完全部循环就拿到了需要绑定的值。然后大家来到 select 语句的位置

大家前面已经把 sql 语句和绑定的值准备好了,下面就要去 select 查询了。大家跟进 run

首先去重连了一下 

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

大家回顾一下PDO编译实行的三个步骤:

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

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

 

转自:圈子社区

分享到:
×

微信扫一扫分享

XML 地图 | Sitemap 地图