首先,这个漏洞属于网站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($ID, $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() { ... ... }
我们看下关键的代码变更:
Illuminate\ValIDation\Rules\Unique.PHPV5.8.7【最新版】 public function __toString() { $this->ignore ? '"'.addslashes($this->ignore).'"' : 'NulL', } Illuminate\ValIDation\Rules\Unique.PHPV5.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注入。
更多Laravel相关技术文章,请访问Laravel框架入门教程栏目进行学习! 总结
以上是内存溢出为你收集整理的浅析PHP框架Laravel最新SQL注入漏洞全部内容,希望文章能够帮你解决浅析PHP框架Laravel最新SQL注入漏洞所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)