浅析PHP框架Laravel最新SQL注⼊漏洞PHP知名开发框架Laravel,之前在官⽅博客通报了⼀个⾼危SQL注⼊漏洞,这⾥简单分析下。
⾸先,这个漏洞属于⽹站coding写法不规范,官⽅给了提⽰:
但官⽅还是做了修补,升级最新版本V5.8.7可修复。
我们先定位下这⾥:
Illuminate\Validation\Rule
官⽅推荐的写法是:
Rule::unique('users')->ignore($id),
如果⽹站coding没有预先对$id的值做处理时,⽤户可以直接传递恶意数据给ignore函数,就会导致SQL注⼊。我们来跟⼀下函数:
\Illuminate\Validation\Rules\Unique.php class Unique {
... public function ignore($id, $idColumn = null) { if ($id instanceof Model) { return $this->ignoreModel($i
d, $idColumn);
} $this->ignore = $id; $this->idColumn = $idColumn ?? 'id'; return $this;
}
这⾥我们不考虑把$id写成实例的情况,$id是⽤户可控的话,$idColumn直接写为空即可,最后赋值情况如下:$this->ignore = $id; $this->idColumn = 'id';
如果⽹站代码类似这样构造的话,⿊客输⼊的值就属于可控状态:
$id = $request->input('id');
最后我们会⾛到这⼉:
Illuminate\Validation\Rules\Unique.php public function __toString() {
...
...
}
validation框架我们看下关键的代码变更:
Illuminate\Validation\Rules\Unique.php
V5.8.7【最新版】 public function __toString() { $this->ignore ? '"'.addslashes($this->ignore).'"' : 'NULL',
}
Illuminate\Validation\Rules\Unique.php
V5.8.4 public function __toString() { $this->ignore ? '"'.$this->ignore.'"' : 'NULL',
}
这⾥最新的代码v5.8.7,把$this->ignore直接给addslashes了,以前这⾥是没有防护的。
有趣的是,笔者对⽐了下diff,期间官⽅还试图对其他引⽤的地⽅进⾏过滤。最后还是在__toString处,进⾏了统⼀的过滤。最后提⼀句,后⾯的代码会进⼊DatabaseRule,进⾏后续SQL规则匹配。
Illuminate\Validation\Rules\DatabaseRule.php
这之后就没有再进⼀步处理,接着形成了SQL注⼊。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。