ORM注入

ORM通过抽象数据库层,是开发者通过使用对象而不是表和行来进行数据库数据的操作

运行逻辑

插入信息:

use App\Models\User;

// Create a new user
$user = new User();
$user->name = 'Admin';
$user->email = 'admin@example.com';
$user->password = bcrypt('password'); 
$user->save();

查询数据:

use App\Models\User;

// Find a user by ID
$user = User::find(1);

// Find all users
$allUsers = User::all();

// Find users by specific criteria
$admins = User::where('email', 'admin@example.com')->get();

其中 where('email', 'admin@example.com')->get(); 相当于常规sql语句中的 SELECT * FROM users WHERE email = 'admin@example.com'

注入识别

检测方法

  • 代码审计
  • 自动化工具
  • 黑盒测试
  • 报错测试

框架&ORM注入测试

框架 ORM库 易受攻击的方法/函数
Laravel Eloquent ORM whereRaw(), DB::raw()
Ruby on Rails Active Record where("name = '#{input}'")
Django Django ORM extra(), raw()
Spring Hibernate createQuery()concatenation
Node.js Sequelize sequelize.query()

框架识别

通过检查cookie、查看源码、分析http头、报错信息、url结构等

cookie验证

框架通常使用独特的命名约定或格式来设置会话 cookie,这可以提供关于底层技术的线索。

比如laravel的cookie:

image-20250326102638191

通过源码

查看网页源代码,顶部的 <header> 标签内的声明中可能存在,但这种方法可能并不总是具有决定性。

比如:

image-20250326102806831

注入

以laravel为例,通过一些写法让orm在构建语句的时候,形成注入,比如:

原始语句:SELECT * FROM users ORDER BY name ASC LIMIT 2

通过从url中获取name的值,如果构建payload:->" ')) SQL INJECTION QUERY #

原理:name->"value" 会被orm识别为:

json_unquote(json_extract(`name`, '$."value"'))

而构建的语句 name-> "')) SQL INJECTION QUERY # 会被转为:

json_unquote(json_extract(`name`, '$." "')) SQL INJECTION QUERY #"'))

可以看到 # 把后面的内容注释掉了,把相关的引号和括号也合并了,后面就是攻击者可以自行构建的注入语句

posted @ 2025-12-02 09:21  shinianyunyan  阅读(27)  评论(0)    收藏  举报