JTL-Wawi 2.0.6.0 sendet fehlerhafte multipart/form-data-Requests – ModSecurity blockt Datenabgleich mit 403 (scheinbar hosterabhängig)

cnc

Aktives Mitglied
9. Januar 2013
8
0
Hallo zusammen, hallo liebes JTL-Team, falls hier jemand offiziell mitliest,

wir haben aktuell einen produktiven Ausfall des Datenabgleichs zwischen JTL-Shop (5.7.2) und JTL-Wawi (aktuellste Version, 2.0.6.0) über die Schnittstelle /dbeS/. Das Problem besteht seit ca. 2–3 Tagen und führt dazu, dass wir aktuell keine Bestellungen aus unserem Onlineshop in die Wawi laden können – ein direkter Geschäftsausfall.

Symptom:
POST /dbeS/mytest.php liefert HTTP 403 statt 200. Der PHP-Errorlog zeigt zu den betroffenen Zeitpunkten keine Einträge – die Blockierung erfolgt also vor der eigentlichen PHP-Verarbeitung durch ein WAF-/Sicherheitsmodul (bei uns ModSecurity beim Hoster).

Ursache (durch Hoster-Support bestätigt):
JTL-Wawi 2.0.6.0 sendet Requests, die im Content-Type-Header multipart/form-data ankündigen, den Body aber tatsächlich als urlencoded-Datenstrom (key=value) übertragen – ohne die für multipart zwingend erforderliche Boundary. ModSecurity wertet das als fehlerhaft aufgebauten Multipart-Request (Regel MULTIPART_STRICT_ERROR, Schutz vor Request-Smuggling) und blockt ihn zurecht.

Das ist aus meiner Sicht klar ein fehlerhaft aufgebauter Request seitens der Wawi, unabhängig davon, ob der jeweilige Hoster diese Prüfung streng oder weniger streng konfiguriert hat. Ein Client, der einen Header ankündigt, den der Body nicht einhält, ist schlicht nicht spezifikationskonform – das kann durch keine Server-Konfiguration "geheilt" werden, sondern muss auf Client-Seite (also in der Wawi) korrigiert werden.

Warum das dringend ist:
Ich setze bereits die neueste Wawi-Version ein, ein Update auf unserer Seite ist also keine Option. Individuelle WAF-Ausnahmen lehnt unser Hoster grundsätzlich ab. Das bedeutet: Ohne einen Patch seitens JTL ist der Datenabgleich für uns aktuell schlicht nicht nutzbar. Da diese Sicherheitsprüfung (Boundary-Validierung bei multipart) ein Standardverhalten vieler WAF-Systeme ist, dürfte das Problem perspektivisch auch andere Nutzer treffen, sobald deren Hoster ähnliche Regeln einführt oder verschärft.

Bitte an JTL:
Könnte sich bitte jemand vom JTL-Entwicklerteam dieses Themas annehmen? Konkret wäre wichtig zu klären:
  • Ist der beschriebene Header/Body-Mismatch bei multipart/form-data-Requests der Schnittstelle /dbeS/ bereits bekannt?
  • Gibt es dazu bereits ein internes Ticket bzw. einen Fix in Planung?
  • Falls nicht: Wie kann ich das offiziell als Bug melden, damit es priorisiert bearbeitet wird?
Für Rückfragen oder Details (Logs, Zeitstempel, weitere technische Angaben) stehe ich jederzeit zur Verfügung.

Vielen Dank für eure Unterstützung und Rückmeldung.
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Ich bezweifle das noch groß Dinge am Abgleich geändert werden, weil der insgesamt recht stabil läuft. Eventuell hilft es, wenn du das hier in die .htaccess im Shop-Root einträgst:

<IfModule mod_headers.c>
SetEnvIfNoCase Content-Type "^multipart/form-data$" IS_JTL_BUG
SetEnvIfNoCase Request_URI "/dbes/" IS_JTL_PATH
SetEnvIf IS_JTL_BUG 1 JTL_FIX_REQUIRED
SetEnvIf IS_JTL_PATH !1 !JTL_FIX_REQUIRED

RequestHeader set Content-Type "application/x-www-form-urlencoded" env=JTL_FIX_REQUIRED early
</IfModule>

Das könnte allerdings auch schon zu spät sein, wenn mod_security davor triggert (besser als das early das dahinter hängt gehts glaub ich nicht), oder ein nginx vor dem Apache läuft und das blockt bevor das überhaupt zu Apache durchdringt.
 

cnc

Aktives Mitglied
9. Januar 2013
8
0
Der Hoster möchte nicht whitelisten.

Genau, .htaccess hilft nicht, weil bereits vorher schon abgelehnt wird.

Stabil läuft es nicht, wenn der HTTP POST nachweislich nicht korrekt ausgeführt wird. Niemand garantiert, dass andere Hoster ihre Sicherheitseinstellungen nicht auch anpassen werden.
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Der Hoster möchte nicht whitelisten.

Genau, .htaccess hilft nicht, weil bereits vorher schon abgelehnt wird.

Stabil läuft es nicht, wenn der HTTP POST nachweislich nicht korrekt ausgeführt wird. Niemand garantiert, dass andere Hoster ihre Sicherheitseinstellungen nicht auch anpassen werden.
Das ist aber nunmal rein Hostingseitig. Ohne die mod_security einschränkung gibts da keine Probleme. Ich bin mir relativ sicher das am Abgleich an sich schon seit langem nichts grundlegendes mehr geändert wurde. Nicht mal sowas simples wie einen User-Agent beim Verbindungstest mitzusenden.

Edit: Zum effektiven melden musst du übers Kundencenter ein Support-Ticket aufmachen.
 

mvh

Sehr aktives Mitglied
26. Oktober 2011
1.180
451
Die Aussage zumindest für 2.X stimmt nicht.
Laut den 2.0.6-Code ist es allerdings MultipartFormDataContent und das ist der DbeSClient selbst und das ist der Standard MS HttpClient
C#:
private HttpContent CreateContent(long zipContainerMemoryStreamLength, string stepName, Stream payloadStream)
        {
            if (zipContainerMemoryStreamLength > 0L)
            {
                this.LogPayLoad(payloadStream, stepName);
            }
            MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent();
            multipartFormDataContent.Add(new StreamContent(payloadStream)
            {
                Headers =
                {
                    {
                        "Content-Disposition",
                        "form-data; name=\"data\"; filename=\"data.zip\""
                    }
                }
            }, "data", "data.zip");
            multipartFormDataContent.Add(new StringContent(this._username), "userID");
            multipartFormDataContent.Add(new StringContent(this._password), "userPWD");
            DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(0, 1);
            defaultInterpolatedStringHandler.AppendFormatted<int>(this._clientVersion, "000000");
            multipartFormDataContent.Add(new StringContent(defaultInterpolatedStringHandler.ToStringAndClear()), "vers");
            return multipartFormDataContent;
        }
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Das ist nur eine Funktion. Ich denke mal nicht das du Zugriff auf den Wawi-Quellcode hast. Was davor oder danach passiert, kannst du also nicht wissen. Das ist schließlich nur ein return der da passiert und nicht das senden an sich.
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Aber das ist nur CreateContent. Du weißt alleine damit halt nicht was danach noch passiert. Die schlussendlich gesendeten Header kann man auch danach noch ändern.
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Okay, das würde die Sachlage ändern. Das wäre dann eher ein Problem beim Hoster, das er ggf. den Header umschreibt. Oder ModSecurity liefert einen FalsePositive. Da wäre ein Mitschnitt via Fiddler oder Wireshark interessant, oder die raw http capture vom Hoster. Ich teste das mal mit ModSecurity und OWASP CRS.
 

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Was ich hier kriege ist folgendes:

[Wed Jul 29 18:04:40.896482 2026] [security2:error] [pid 2497583:tid 2497683] [client XXX] ModSecurity: Access denied with code 400 (phase 2). Match of "eq 0" against "MULTIPART_STRICT_ERROR" required. [file "/etc/modsecurity/modsecurity.conf"] [line "93"] [id "200003"] [msg "Multipart request body failed strict validation: PE 0, BQ 1, BW 0, DB 0, DA 0, HF 0, LF 0, SM 0, IQ 0, IP 0, IH 0, FL 0"] [hostname "XXX"] [uri "/Shop/dbeS/mytest.php"] [unique_id "amokmC2UXZ7TlTBmbkSCQAAAAFQ"]

Der einzige Fehlerflag hier ist BQ -> Quoted Boundary. Das ist allerdings laut RFC 2046 nicht falsch und erlaubt.

Bei mir ist mit den Standardeinstellungen der Fehler also, das sowas wie

Content-Type: multipart/form-data; boundary="---------------------123"

Von der Wawi geliefert wird statt:

Content-Type: multipart/form-data; boundary=---------------------123

Und *nicht* das der Content-Type falsch ist.

Edit: Kann DomainFactory da den tatsächlichen Fehler liefern? Ausreichend anonymisiert.
 
  • Gefällt mir
Reaktionen: mvh

NoOne

Sehr aktives Mitglied
16. März 2024
645
221
Noch mal was nachgeliefert: Ich hab die MULTIPART_STRICT_ERROR Regel so angepasst, das MULTIPART_BOUNDARY_QUOTED nicht gewertet wird und danach einen Komplettabgleich gestartet (ohne eine Bestellung im Shop zu haben allerdings). Der lief problemlos durch. Außer den Quoted Boundaries scheint die Wawi hier nichts falsch zu machen (und nicht mal das ist wirklich falsch, ModSecurity prüft strikter als nötig gegen die RFC). Wenn du an JTL gemeldet hast, das der Content-Type falsch ist, dann wird JTL da also vermutlich keinen Fehler finden, weil das an den Boundary Quotes liegt.
 

mvh

Sehr aktives Mitglied
26. Oktober 2011
1.180
451
Laut .Net Core 8 Dokumentation wird immer Double-Quote Verhalten verwendet und es kann nur manuell geändert werden. Hier macht JTL nichts falsch.
 
Zuletzt bearbeitet:

cnc

Aktives Mitglied
9. Januar 2013
8
0
Kurzes Update von meiner Seite – und zunächst eine Entschuldigung für meine ursprüngliche Annahme.

Ich war zunächst davon ausgegangen, dass die Wawi fehlerhafte multipart/form-data-Requests (fehlende bzw. inkonsistente Boundary) sendet. Nach meinen Tests muss ich diese Vermutung korrigieren.

Ich habe das Verhalten mit curl direkt gegen den Shop reproduziert:
  • application/x-www-form-urlencoded → HTTP 200 OK
  • multipart/form-data mit ungequoteter Boundary (boundary=...) → HTTP 200 OK
  • multipart/form-data mit gequoteter Boundary (boundary="...") → HTTP 403 Forbidden
Der Request-Body war dabei identisch. Der einzige Unterschied war, ob die Boundary im Content-Type in Anführungszeichen stand oder nicht.

Damit scheint weder der dreifach vorkommende User-Agent noch Multipart an sich die Ursache zu sein. Die Blockierung tritt ausschließlich bei einer gequoteten Boundary auf.
 

cnc

Aktives Mitglied
9. Januar 2013
8
0
Kurzes Update von meiner Seite, auch als Dank an @NoOne und @mvh für die Unterstützung bei der Eingrenzung.

Domain Factory hat sich gemeldet und bestätigt im Kern genau das, was wir hier rausgearbeitet haben: Die betreffende ModSecurity-Regel wurde Anfang der Woche zu strikt aktiviert und wird jetzt von Security-Team und Fachabteilung angepasst, sodass sie nicht mehr auf die Wawi-Requests (gequotete Boundary) anschlägt. Die Änderung ist aktuell in Prüfung und wird danach plattformweit ausgerollt – laut DF frühestens ab dem späten Vormittag/Mittag, kann sich aber je nach Prüfung noch verschieben.

Wichtig: Keine Aktion auf unserer Seite nötig – weder an der Wawi noch am Shop muss etwas geändert werden. Sobald der Fix verteilt ist, sollte der Datenabgleich wieder normal laufen.

Damit bestätigt sich noch mal: Es war kein Wawi-Bug, sondern eine zu strenge, kürzlich verschärfte WAF-Regel beim Hoster (Flag BQ / Boundary Quoted), die eine laut RFC 2046 gültige Syntax fälschlich blockiert hat.

Ich melde mich hier, sobald der Abgleich bei uns wieder läuft.
 
Zuletzt bearbeitet:
Ähnliche Themen
Titel Forum Antworten Datum
Neu JTL-Wawi REST API (Beta): HTTP 402 "Zahlung erforderlich" auf allen Endpunkten trotz gebuchter Beta-Lizenz Schnittstellen Import / Export 2
Kasse in JTL-Wawi 2.0 einbinden JTL-Wawi 2.0 1
Neu JTL-WAWI 2.0.5 Worker läuft nicht mehr und Versandarten werden falsch ausgegeben. JTL-Wawi - Fehler und Bugs 1
JTL-WAWI 2.0.5 Worker läuft nicht mehr und Versandarten werden falsch ausgegeben. JTL-Wawi 2.0 10
Verbesserungsvorschlag: JTL-POS – Artikel mit Preisabfrage und vollständiger Wawi-Statistik JTL-Wawi 2.0 4
Neu JTL-Wawi 1.11.7: Shopify-PDF aus Bestellmetafeld automatisch als Auftragsanhang übernehmen Shopify-Connector 1
Seit dem Update meines JTL-Shops auf Version 5.7.1 funktioniert die Verbindung zwischen JTL-Wawi 2.0.4.0 und dem Shop nicht mehr. JTL-Wawi 2.0 6
Neu Belege aus JTL Wawi zu Lexoffice Schnittstellen Import / Export 5
Neu Copy/Paste Abstürze seit JTL-Wawi 2.0.5 User helfen Usern - Fragen zu JTL-Wawi 4
Neu JTL Wawi 1.11.11 - Zahlungsabgleich bei FYRST Bank verlangt immer Passwort User helfen Usern - Fragen zu JTL-Wawi 0
Neu Installationsdatei für JTL‑Wawi 1.9.6.5 Installation von JTL-Wawi 2
Neu kostenlos: DHL Sendungsverfolgung für JTL-Wawi – Web-Dashboard mit Frühwarnsystem Schnittstellen Import / Export 0
Neu JTL Wawi 2.0 oder höher WooCommerce-Connector 0
Changelog jtl Wawi 2.0.5 JTL-Wawi 2.0 13
JTL Wawi 1.11.xx langsam unbenutzbar! JTL-Wawi 1.11 4
Neu Plugin: JTL Exportformat Google Shopping gibt <g:google_product_category> unter Shop 5.7.1 und Wawi 2.0.4 nicht aus Plugins für JTL-Shop 1
Neu Rabatte aus dem JTL-Shop werden in der Wawi nur als Netto-Preis übernommen, Rabatt % gehen verloren Onlineshop-Anbindung 0
Neu Ab Wawi 1.10 - JTL.Wawi.Pos.exe direkt ohne JTL-Administrator starten? Allgemeine Fragen zu JTL-POS 2
JTL APP - Fehlermeldung nach Update auf Wawi 1.11. JTL-Wawi App 6
JTL Wawi 1.11. - Fenstergröße - Artikel auf Einkaufsliste setzen JTL-Wawi 1.11 13
Neu JTL-Wawi Shopabgleich per E-Mail überwachen (Warnungen & Fehler) Onlineshop-Anbindung 1
Neu Bug? Führende Nullen bei Sendungsnummern verschwinden in JTL-Wawi 2.0.3 JTL-ShippingLabels - Fehler und Bugs 1
DPD Cloud Labeldruck auf Zebra LP 2844-Z seit Update auf JTL-Wawi 1.11.x fehlerhaft JTL-Wawi 1.11 3
JTL-Wawi sucht falschen ShopType nach Gambio-Update JTL-Wawi 1.7 2
Nach update 1.8>1.11 Kein Mandant in JTL-Wawi gefunden JTL-Wawi 1.11 5
Neu Eignes Feld aus Auftrag in Rechnung anzeigen lassen JTL-WaWi 1.11.10 Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu Freelancer für JTL-Wawi, Shop & Prozessautomatisierung Dienstleistung, Jobs und Ähnliches 2
Neu Umzug von sehr alter JTL Wawi Version auf neuen PC User helfen Usern - Fragen zu JTL-Wawi 3
Neu JTL REST API (on premise) - welche API Version ab welcher Wawi-Version? Changelog? Schnittstellen Import / Export 0
Neu Ab welcher JTL Wawi Version ist der OnPremise REST API Endpoint POST /v2/returns oder POST /v1/returns für Create Return verfügbar? Schnittstellen Import / Export 0
Keine Rückmeldung in JTL Wawi sobald SQL Server Memory durch Database Cache ausgeslastet ist JTL-Wawi 2.0 9
Neu Nach Update auf JTL-Wawi 2.0.3 keine WMS-Lager mehr auswählbar – Versand komplett blockiert JTL-Wawi 2.0 3
Problem mit Hermes Österreich Sendungsnummern – Fehler beim Amazon-Abgleich in JTL-Wawi JTL-Wawi 1.10 0
Ameise.exe Fundort bei JTL WAWI 2.02 JTL-Wawi 2.0 2
Bestellabgleich mit JTL Wawi und WooCommerce 1h verzögert JTL-Wawi 2.0 0
Neu jtl POS und wawi 1.11.9 Bestände User helfen Usern - Fragen zu JTL-Wawi 3
Neu JTL-Wawi mit Claude, ChatGPT, Openclaw/Hermes oder CRM System verbinden User helfen Usern 8
Neu ❓JTL Wawi Update von 1.8 auf ??? User helfen Usern - Fragen zu JTL-Wawi 1
Using short screen recordings for JTL-Wawi workflow documentation – anyone doing this? JTL-Wawi 2.0 3
JTL-Wawi 1.11.7 Sporadischer Fehler - Zugriff verweigert. JTL-Wawi 1.11 4
Neu JTL Wawi Einloggen geht nicht!! User helfen Usern - Fragen zu JTL-Wawi 4
Neu Gutscheincodes aus Shopware 6 in JTL Wawi als Anmerkung zeigen? Shopware-Connector 0
Neu Database connection timeouts and interface lag in JTL-Wawi with background script managers User helfen Usern 0
Neu css Einstellungen Paypal Plugin von JTL JTL-Shop - Fehler und Bugs 0
Neu Eigenen JTL-SCX-Marktplatzkanal für Multi-Vendor-Marktplatz erstellen – Erfahrungen gesucht Einrichtung und Installation von JTL-eazyAuction 3
Neu JTL-Shop 5.7.2: Zahlungsbetrag weicht vom Auftragswert ab JTL-Shop - Fehler und Bugs 4
Neu JTL-Shop 5.7.2: Unterschiedliche Standardsprachen in tsprache – widersprüchliche Canonical- und Hreflang-Ausgabe der Startseite Allgemeine Fragen zu JTL-Shop 4
Neu Versandetikett bei Aufträgen aus dem JTL Shop Arbeitsabläufe in JTL-Wawi 0
Neu JTL Search blockiert unsere Shops JTL-Shop - Fehler und Bugs 1
Wichtig JTL-ShippingLabels 1.0: Support-Ende GLS/DPD und Migration von JTL-Start-Kunden nach dem 30. September News, Events und Umfragen 14

Ähnliche Themen