发现一个可能会被注入的地方

bug问题 · sumic · 于 5年前 发布 · 1809 次阅读
// 明确了指定要搜索的列,在此处传递标量或数组将始终只是查找出单个记录而已
$model = Post::findOne(['id' => Yii::$app->request->get('id')]);

// 不要使用下面的代码!可以注入一个数组条件来匹配任意列的值!
$model = Post::findOne(Yii::$app->request->get('id'));

service里面的public function getByPrimaryKey($primaryKey) $one = $this->_model->findOne($primaryKey); 都是直接代入了id,有注入风险。

共收到 4 条回复
Fecmall#15年前 0 个赞

这个bug,Yii2官方已经修复了吧?

Fecmall#35年前 0 个赞

https://github.com/yiisoft/yii2/pull/15688/commits/8beeb0545bceb9bb52e7304e187b839396bc3fb0

找到了,yii2已经修复这个问题了

 fix ActiveRecord findByCondition

Exploit example:
// REQUEST: http://localhost/test/test?id[%60id%60%3D%60id%60%20and%201]=1
public function actionTest()
{
    $id = Yii::$app->request->get('id');
    var_dump($id); // Id параметр приходит как массив
    $user = User::findOne($id); // Find one стал использоваться посвсеместно, тк. в мануалах идет именно он, и старую функцию findByPk убрали. При этом ключи массива не проверяются, добавляются как есть.
    // SQLREQUEST: SELECT * FROM `user` WHERE `id`=`id` and 1='1'
    var_dump($user);
}

fecshop 现在需要使用 "yiisoft/yii2": ">=2.0.15" ,, https://github.com/fecshop/yii2_fecshop/blob/master/composer.json

因此,这样写没问题的

sumic#45年前 0 个赞

恩,那就没事儿了。可能是官方API没有更新手册。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics