Laravel漏洞详解-第二弹
作者:Catsay
圈子本着回馈粉丝的原则,免费给我们的粉丝分享精华文案,请大家不用用于商业,维护圈子的版权违者必究!有需要完整版pdf的小伙伴,最后有小编的微信,小编会将文档发送给您。
——圈子社区
0x3 不规范的写法导致的注入
我们先来说一下 Laravel 是可以记录语句的
我们来看下面的风骚怪一号写法:
这是百分百会出现注入的一个写法,他没有过滤直接就拼接了语句拿去执行。我们去执行一下看看。
返回了 true ,那么我们去加一个单引号呢?
多么熟悉的数据库报错!这就是典型的 SQL 注入。
我们的 Laravel 是带了有直接拼凑语句的写法的。
就是使用 whereRaw或者selectRaw
这时候我们去查询一下。
正常是都可以查出来的,这时候我们去注入一下。http://a.com/index?id=1 union select 1,2,3,4 #
然后我们可以看到这里引发了注入。如果说见到了拼凑出来的 SQL 语句,这里我们就要当心一下了,我们如何在这里修复这个漏洞 呢?
修改这一条语句为:
$data = DB::table("users")->whereRaw("id=?",$id)->get();
这样就不会存在注入了。我们再去查询一下
我们就发现会把绑定值带进去,这里下面的带入 SQL 语句就无效了。我们下面就来大概分析一下这个注入是怎么产生的。
首先得到 $id ,我们跟进去看到实例化对象
我们继续走,来到 whereRaw
$this->wheres[] = ['type' => 'raw', 'sql' => $sql, 'boolean' => $boolean]; 这里我们走下去看一下 $this 的值
然后 addBinding
也是对 $this 进行赋值,继续走来到 get()
我们来看一下它怎么带入我们的 SQL 语句的 来到 onceWithColumns 还是跟之前分析一样走进 SQL 查询,我们直接走到 compileSelect ,看 他如何进行拼接
我们可以看到经过拼凑的语句是带着注入的,然后一路 F8 到 getBindings
我们可以看到我们的 Bindings 值是空的,所以不会进行任何替换 紧接着来到了 select ,走进去
跟到 prepared 这里
我们的 $query 没有任何变化,所以执行之后就会引发注入。这就是我们完整的注入流程
本文始发于微信公众号(Secquan圈子社区):Laravel漏洞详解-第二弹
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论