CINXE.COM

Shikata Ga Nai

<!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="ThisIsOne" data-avail-langs="ja en" data-blog="cysec148.hatenablog.com" data-blog-comments-top-is-new="1" data-blog-host="cysec148.hatenablog.com" data-blog-is-public="1" data-blog-name="Shikata Ga Nai" data-blog-owner="ThisIsOne" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://cysec148.hatenablog.com/" data-blog-uuid="26006613416130729" data-blogs-uri-base="https://cysec148.hatenablog.com" data-brand="pro" data-data-layer="{&quot;hatenablog&quot;:{&quot;admin&quot;:{},&quot;analytics&quot;:{&quot;brand_property_id&quot;:&quot;&quot;,&quot;measurement_id&quot;:&quot;&quot;,&quot;non_sampling_property_id&quot;:&quot;&quot;,&quot;property_id&quot;:&quot;&quot;,&quot;separated_property_id&quot;:&quot;UA-29716941-19&quot;},&quot;blog&quot;:{&quot;blog_id&quot;:&quot;26006613416130729&quot;,&quot;content_seems_japanese&quot;:&quot;true&quot;,&quot;disable_ads&quot;:&quot;pro&quot;,&quot;enable_ads&quot;:&quot;false&quot;,&quot;enable_keyword_link&quot;:&quot;false&quot;,&quot;entry_show_footer_related_entries&quot;:&quot;true&quot;,&quot;force_pc_view&quot;:&quot;false&quot;,&quot;is_public&quot;:&quot;true&quot;,&quot;is_responsive_view&quot;:&quot;false&quot;,&quot;is_sleeping&quot;:&quot;false&quot;,&quot;lang&quot;:&quot;ja&quot;,&quot;name&quot;:&quot;Shikata Ga Nai&quot;,&quot;owner_name&quot;:&quot;ThisIsOne&quot;,&quot;uri&quot;:&quot;https://cysec148.hatenablog.com/&quot;},&quot;brand&quot;:&quot;pro&quot;,&quot;page_id&quot;:&quot;index&quot;,&quot;permalink_entry&quot;:null,&quot;pro&quot;:&quot;pro&quot;,&quot;router_type&quot;:&quot;blogs&quot;}}" data-device="pc" data-dont-recommend-pro="false" data-global-domain="https://hatena.blog" data-globalheader-color="b" data-globalheader-type="pc" data-has-touch-view="1" data-help-url="https://help.hatenablog.com" data-hide-header="1" data-page="index" data-parts-domain="https://hatenablog-parts.com" data-plus-available="1" data-pro="true" data-router-type="blogs" data-sentry-dsn="https://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218" data-sentry-environment="production" data-sentry-sample-rate="0.1" data-static-domain="https://cdn.blog.st-hatena.com" data-version="b06a9d4929119667e7027e25c25079" data-initial-state="{}" > <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <meta name="robots" content="max-image-preview:large" /> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" /> <title>Shikata Ga Nai</title> <link rel="canonical" href="https://cysec148.hatenablog.com/"/> <meta itemprop="name" content="Shikata Ga Nai"/> <meta itemprop="image" content="https://cdn.user.blog.st-hatena.com/default_entry_og_image/155112078/1610698201922027"/> <meta property="og:title" content="Shikata Ga Nai"/> <meta property="og:type" content="blog"/> <meta property="og:url" content="https://cysec148.hatenablog.com/"/> <meta property="og:image" content="https://cdn.image.st-hatena.com/image/scale/97ee7fd0da18ea1f66e183876fbc16a3fd035058/backend=imagemagick;enlarge=0;height=1000;version=1;width=1200/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F155112078%2F1610698201922027"/> <meta property="og:image:alt" content="Shikata Ga Nai"/> <meta property="og:description" content="Private? There is no such things." /> <meta property="og:site_name" content="Shikata Ga Nai"/> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://cdn.user.blog.st-hatena.com/default_entry_og_image/155112078/1610698201922027" /> <meta name="twitter:title" content="Shikata Ga Nai" /> <meta name="twitter:description" content="Private? There is no such things." /> <meta name="twitter:app:name:iphone" content="はてなブログアプリ" /> <meta name="twitter:app:id:iphone" content="583299321" /> <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fcysec148.hatenablog.com%2F" /> <meta name="description" content="ホワイトハッカーへなるための備忘録。脆弱性の説明から脆弱性診断、ペネトレーションテストのための手順をなるべくわかりやすく説明することを心がけています。" /> <meta name="keywords" content="セキュリティ,SQLインジェクション,コマンドインジェクション,XSS,CSRF,OWASP,Burp Suite,metasploitable2,DBWA,bWAPP,BWA,webgoat,badstore,HellBound,Hack The Box,脆弱性診断,エクスプロイト,CTF,バグバウンティ,IPA,やられサイト,ハッキング,ハッカー,ハンズオン,セミナー,勉強会,ウィルス,マルウェア,CSIRT,インシデント" /> <script id="embed-gtm-data-layer-loader" data-data-layer-page-specific="" > (function() { function loadDataLayer(elem, attrName) { if (!elem) { return {}; } var json = elem.getAttribute(attrName); if (!json) { return {}; } return JSON.parse(json); } var globalVariables = loadDataLayer( document.documentElement, 'data-data-layer' ); var pageSpecificVariables = loadDataLayer( document.getElementById('embed-gtm-data-layer-loader'), 'data-data-layer-page-specific' ); var variables = [globalVariables, pageSpecificVariables]; if (!window.dataLayer) { window.dataLayer = []; } for (var i = 0; i < variables.length; i++) { window.dataLayer.push(variables[i]); } })(); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P4CXTW');</script> <!-- End Google Tag Manager --> <link rel="shortcut icon" href="https://cysec148.hatenablog.com/icon/favicon"> <link rel="apple-touch-icon" href="https://cysec148.hatenablog.com/icon/touch"> <link rel="icon" sizes="192x192" href="https://cysec148.hatenablog.com/icon/link"> <link rel="alternate" type="application/atom+xml" title="Atom" href="https://cysec148.hatenablog.com/feed"/> <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://cysec148.hatenablog.com/rss"/> <link rel="author" href="http://www.hatena.ne.jp/ThisIsOne/"> <link rel="preload" href="https://cdn-ak.f.st-hatena.com/images/fotolife/T/ThisIsOne/20200723/20200723154151.png" as="image"/> <link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=b06a9d4929119667e7027e25c25079"/> <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/26006613416130729/ac31f88dd3e3265d68adba46989b50b3eee962b1"/> <script> </script> <style> div#google_afc_user, div.google-afc-user-container, div.google_afc_image, div.google_afc_blocklink { display: block !important; } </style> <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Shikata Ga Nai","url":"https://cysec148.hatenablog.com/"}</script> </head> <body class="page-index header-image-enable globalheader-off globalheader-ng-enabled"> <div id="globalheader-container" data-brand="hatenablog" style="display: none" > <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe> </div> <div id="container"> <div id="container-inner"> <header id="blog-title" data-brand="hatenablog"> <div id="blog-title-inner" style="background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/T/ThisIsOne/20200723/20200723154151.png'); background-position: center -16px;"> <div id="blog-title-content"> <h1 id="title"><a href="https://cysec148.hatenablog.com/">Shikata Ga Nai</a></h1> <h2 id="blog-description">Private? There is no such things.</h2> </div> </div> </header> <div id="content" class="hfeed" > <div id="content-inner"> <div id="wrapper"> <div id="main"> <div id="main-inner"> <!-- google_ad_section_start --> <!-- rakuten_ad_target_begin --> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2000 words-200 mode-markdown entry-odd" id="entry-6802418398307554128" data-keyword-campaign="" data-uuid="6802418398307554128" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://cysec148.hatenablog.com/archive/2024/11/29" rel="nofollow"> <time datetime="2024-11-28T21:05:49Z" title="2024-11-28T21:05:49Z"> <span class="date-year">2024</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">29</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://cysec148.hatenablog.com/entry/2024/11/29/060549" class="entry-title-link bookmark">OAuthの仕組み、使用例、リスクについてまとめてみた</a> </h1> <div class="entry-categories categories"> <a href="https://cysec148.hatenablog.com/archive/category/API" class="entry-category-link category-API">API</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hello there, ('ω')ノ</p> <p>OAuthは、現在のウェブで最も広く使用されている認証(AuthN)および認可(AuthZ)の仕組みの一つです。この技術により、ユーザは複数のアプリケーションにわたって安全にログインし、データを共有できます。しかし、適切に実装しないと重大なセキュリティリスクが発生する可能性があります。</p> <hr /> <h2 id="1-OAuthとは"><strong>1. OAuthとは?</strong></h2> <p>OAuthは、外部サービスを使用してアプリケーションへのアクセスを安全に管理するためのプロトコルです。現在は<strong>OAuth 2.0</strong>が主流です。</p> <h3 id="主要コンポーネント"><strong>主要コンポーネント</strong></h3> <ol> <li><strong>リソース所有者(Resource Owner)</strong>: ユーザやデータ所有者。</li> <li><strong>クライアント(Client)</strong>: ユーザデータにアクセスを希望するアプリケーション。</li> <li><strong>認可サーバ(Authorization Server)</strong>: 認証プロセスを管理し、アクセストークンを発行。</li> <li><strong>リソースサーバ(Resource Server)</strong>: クライアントがアクセスしたい保護されたリソースをホスト。</li> <li><strong>アクセストークン(Access Token)</strong>: ユーザの権限を示す一時的な資格情報。</li> <li><strong>リフレッシュトークン(Refresh Token)</strong>: アクセストークンが期限切れの際に、新しいトークンを取得。</li> </ol> <hr /> <h2 id="2-OAuthの動作例"><strong>2. OAuthの動作例</strong></h2> <h3 id="21-認証フロー"><strong>2.1 認証フロー</strong></h3> <h4 id="1-Authorization-Code-Grant推奨"><strong>1. Authorization Code Grant(推奨)</strong></h4> <ul> <li><strong>流れ</strong>: <ol> <li>ユーザがクライアントアプリケーションにログイン。</li> <li>クライアントが認可サーバにリダイレクト。</li> <li>認可コードを取得。</li> <li>認可コードを使用してアクセストークンを取得。</li> </ol> </li> <li><strong>利点</strong>: ダブルチェックが行われるためセキュリティが高い。</li> </ul> <h4 id="2-Implicit-Grant"><strong>2. Implicit Grant</strong></h4> <ul> <li><strong>流れ</strong>: <ul> <li>クライアントが直接アクセストークンを取得。</li> </ul> </li> <li><strong>リスク</strong>: トークンが漏洩しやすく、セキュリティが低い。</li> </ul> <h4 id="3-Client-Credentials-Grant"><strong>3. Client Credentials Grant</strong></h4> <ul> <li><strong>用途</strong>: クライアント自身がリソースにアクセスする場合に使用。</li> </ul> <h4 id="4-Password-Grant非推奨"><strong>4. Password Grant(非推奨)</strong></h4> <ul> <li><strong>理由</strong>: ユーザの資格情報を直接送信するため、OAuth 2.0セキュリティベストプラクティスでは推奨されていない。</li> </ul> <hr /> <h2 id="3-OAuthの利点"><strong>3. OAuthの利点</strong></h2> <ol> <li><strong>シングルサインオン(SSO)</strong>:<br/> ユーザは1つの資格情報で複数のサービスにログイン可能。</li> <li><strong>資格情報の安全な管理</strong>:<br/> クライアントはユーザ名やパスワードを保存する必要がない。</li> <li><strong>トークンベースのセキュリティ</strong>:<br/> アクセストークンが特定の期間のみ有効で、特定の操作範囲を制限可能。</li> </ol> <hr /> <h2 id="4-OAuthの脆弱性とリスク"><strong>4. OAuthの脆弱性とリスク</strong></h2> <h3 id="41-クライアントIDシークレットの漏洩"><strong>4.1 クライアントID/シークレットの漏洩</strong></h3> <ul> <li>クライアントIDやクライアントシークレットはユーザに公開されるべきではありません。</li> <li><strong>リスク</strong>: <ul> <li>悪意のあるユーザが認可サーバにアクセスし、正規アプリを偽装可能。</li> <li>偽装されたリンクやアプリで資格情報を収集する<strong>フィッシング攻撃</strong>を誘発。</li> </ul> </li> </ul> <hr /> <h3 id="42-トークンの管理不備"><strong>4.2 トークンの管理不備</strong></h3> <ul> <li>トークンのローテーションや有効期限管理を怠ると、セキュリティリスクが高まります。</li> <li>一部アプリはトークンをローカルデータベースに保存し、適切に保護されないことがあります。</li> </ul> <hr /> <h3 id="44-実際の事例"><strong>4.4 実際の事例</strong></h3> <ul> <li><p><strong>Google OAuthの脆弱性(2023年)</strong>:<br/> GoogleのOAuth実装におけるメールアドレス処理の問題が発見され、特定の条件下で認証が回避可能でした。</p> <p><a href="https://trufflesecurity.com/blog/google-oauth-is-broken-sort-of/">Google OAuthの問題</a></p></li> </ul> <hr /> <h2 id="5-攻撃を防ぐためのベストプラクティス"><strong>5. 攻撃を防ぐためのベストプラクティス</strong></h2> <ol> <li><strong>クライアントシークレットの保護</strong>:<br/> シークレットは公開せず、安全なストレージに保存。</li> <li><strong>トークンのローテーション</strong>:<br/> アクセストークンとリフレッシュトークンを定期的に更新。</li> <li><strong>トークンの有効期限を設定</strong>:<br/> 長期間有効なトークンを避ける。</li> <li><strong>フィッシング対策</strong>:<br/> 正規のリンクと偽リンクを区別する教育をユーザに提供。</li> <li><strong>ログ監視</strong>:<br/> 不審なリクエストを検知する。</li> </ol> <hr /> <h2 id="まとめ"><strong>まとめ</strong></h2> <p>OAuthは強力な認証・認可メカニズムを提供しますが、適切に実装しないと脆弱性が発生する可能性があります。クライアントシークレットの管理、トークンの有効期限の設定、ブルートフォース対策などを徹底することで、より安全なアプリケーションを構築できます。</p> <p>Best regards, (^^ゞ</p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="ThisIsOne" >ThisIsOne</span></span> <span class="entry-footer-time"><a href="https://cysec148.hatenablog.com/entry/2024/11/29/060549"><time data-relative datetime="2024-11-28T21:05:49Z" title="2024-11-28T21:05:49Z" class="updated">2024-11-29 06:05</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://cysec148.hatenablog.com/entry/2024/11/29/060549" data-hatena-star-title="OAuthの仕組み、使用例、リスクについてまとめてみた" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> </div> <div class="customized-footer"> </div> <div class="comment-box js-comment-box"> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> </div> </footer> </div> </article> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2000 words-200 mode-markdown entry-even" id="entry-6802418398307299707" data-keyword-campaign="" data-uuid="6802418398307299707" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://cysec148.hatenablog.com/archive/2024/11/28" rel="nofollow"> <time datetime="2024-11-27T23:07:10Z" title="2024-11-27T23:07:10Z"> <span class="date-year">2024</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">28</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://cysec148.hatenablog.com/entry/2024/11/28/080710" class="entry-title-link bookmark">Basic認証(Basic Authentication)の基礎とリスクについてまとめてみた</a> </h1> <div class="entry-categories categories"> <a href="https://cysec148.hatenablog.com/archive/category/API" class="entry-category-link category-API">API</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hello there, ('ω')ノ</p> <p>Basic認証は、最も単純な認証方法の一つで、主にウェブサーバやAPIで利用されることがあります。しかし、セキュリティ上の問題が多く、現在では推奨されない方法です。</p> <hr /> <h2 id="1-Basic認証とは"><strong>1. Basic認証とは?</strong></h2> <p>Basic認証は、クライアントがサーバにアクセスする際に<strong>ユーザ名</strong>と<strong>パスワード</strong>を送信して認証を行う方法です。この情報は、HTTPリクエストの<strong>Authorizationヘッダー</strong>にBase64でエンコードされて送信されます。</p> <h3 id="リクエスト例"><strong>リクエスト例</strong></h3> <p>以下はBasic認証のリクエスト例です:</p> <pre class="code http" data-lang="http" data-unlink>GET /api/v2/list_resources Authorization: Basic bWF1cmljaW86TXlQYXNzd29yZCNAIQo=</pre> <ul> <li><p><strong><code>bWF1cmljaW86TXlQYXNzd29yZCNAIQo=</code></strong>:</p> <p>Base64エンコードされたユーザ名とパスワード(例: <code>mauricio:MyPassword#@!</code>)。</p></li> </ul> <hr /> <h3 id="仕組み"><strong>仕組み</strong></h3> <ol> <li>クライアントは、ユーザ名とパスワードをBase64エンコードしてAuthorizationヘッダーに追加。</li> <li>サーバは、Base64デコードを行い、資格情報を確認。</li> <li>認証成功の場合:リクエストに応答。</li> <li>認証失敗の場合:HTTPステータスコード401(Unauthorized)を返す。</li> </ol> <hr /> <h2 id="2-Basic認証の問題点"><strong>2. Basic認証の問題点</strong></h2> <h3 id="21-平文でのエンコード"><strong>2.1 平文でのエンコード</strong></h3> <p>Base64は暗号化ではなく、単なるエンコード方式です。以下のように簡単にデコード可能です:</p> <pre class="code bash" data-lang="bash" data-unlink>echo &#34;bWF1cmljaW86TXlQYXNzd29yZCNAIQo=&#34; | base64 --decode # 出力: mauricio:MyPassword#@!</pre> <hr /> <h3 id="22-TLSがない場合の脆弱性"><strong>2.2 TLSがない場合の脆弱性</strong></h3> <p>通信が暗号化されていない場合(TLS未使用)、以下のリスクが発生します:</p> <ul> <li><strong>パケットスニッフィング</strong>: ネットワークを監視するツール(例: Wireshark)で認証情報が平文で盗まれる。</li> <li><strong>中間者攻撃(MiTM)</strong>: 攻撃者が通信を傍受し、資格情報を収集。</li> </ul> <hr /> <h3 id="23-認証情報の管理不備"><strong>2.3 認証情報の管理不備</strong></h3> <p>サーバ側で認証情報を適切に管理していない場合、以下のリスクが発生します:</p> <ul> <li>パスワードが暗号化されずに保存されている。</li> <li>ハッシュやソルト(追加データ)の欠如により、パスワードが簡単に復元される。</li> </ul> <hr /> <h2 id="3-Basic認証の判別方法"><strong>3. Basic認証の判別方法</strong></h2> <h3 id="31-リクエストの解析"><strong>3.1 リクエストの解析</strong></h3> <p>HTTPリクエストに以下のヘッダーが含まれている場合、Basic認証が使用されています:</p> <pre class="code http" data-lang="http" data-unlink>Authorization: Basic &lt;Base64エンコードされた資格情報&gt;</pre> <hr /> <h3 id="32-サーバ応答の確認"><strong>3.2 サーバ応答の確認</strong></h3> <p>サーバから返される以下のヘッダーでBasic認証を検出可能:</p> <pre class="code http" data-lang="http" data-unlink>WWW-Authenticate: Basic realm=&#34;example&#34;</pre> <hr /> <h3 id="33-ネットワークトラフィックの監視"><strong>3.3 ネットワークトラフィックの監視</strong></h3> <p>Wiresharkなどのネットワーク監視ツールを使用して、認証情報を確認できます。特にTLSが未使用の場合、資格情報が容易に解析されます。</p> <hr /> <h2 id="4-Basic認証に対する攻撃手法"><strong>4. Basic認証に対する攻撃手法</strong></h2> <h3 id="41-パケットスニッフィング"><strong>4.1 パケットスニッフィング</strong></h3> <p>通信が暗号化されていない場合、認証情報がネットワークトラフィックに平文で現れます。</p> <h3 id="42-ブルートフォース攻撃"><strong>4.2 ブルートフォース攻撃</strong></h3> <p>攻撃者が資格情報を体系的に推測して認証を突破する。</p> <h3 id="43-フィッシング攻撃"><strong>4.3 フィッシング攻撃</strong></h3> <p>ユーザを騙して認証情報を入力させる。</p> <hr /> <h2 id="5-推奨される代替手段"><strong>5. 推奨される代替手段</strong></h2> <h3 id="51-OAuth-20"><strong>5.1 OAuth 2.0</strong></h3> <p>トークンベースの認証を提供し、資格情報を直接共有する必要がありません。</p> <h3 id="52-APIキー"><strong>5.2 APIキー</strong></h3> <p>一意のキーを使用して、認証とアクセス制御を行います。</p> <h3 id="53-JSON-Web-Tokens-JWT"><strong>5.3 JSON Web Tokens (JWT)</strong></h3> <p>自己完結型のトークンで、分散システムやマイクロサービスに適しています。</p> <hr /> <h2 id="6-Basic認証を使用する場合の注意点"><strong>6. Basic認証を使用する場合の注意点</strong></h2> <p>もしBasic認証を使用する必要がある場合は、以下を徹底してください:</p> <ul> <li><strong>必ずTLSを使用</strong>: 通信を暗号化して資格情報を保護。</li> <li><strong>パスワードの暗号化</strong>: データベース内でパスワードをハッシュ化。</li> <li><strong>レートリミットを設定</strong>: ブルートフォース攻撃を防ぐ。</li> </ul> <hr /> <h2 id="まとめ"><strong>まとめ</strong></h2> <p>Basic認証はシンプルで使いやすいですが、セキュリティ上のリスクが多いため、現代のAPI開発では避けるべき方法です。TLSの使用、代替手段への移行などを検討し、APIセキュリティを強化することが重要です。</p> <p>Best regards, (^^ゞ</p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="ThisIsOne" >ThisIsOne</span></span> <span class="entry-footer-time"><a href="https://cysec148.hatenablog.com/entry/2024/11/28/080710"><time data-relative datetime="2024-11-27T23:07:10Z" title="2024-11-27T23:07:10Z" class="updated">2024-11-28 08:07</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://cysec148.hatenablog.com/entry/2024/11/28/080710" data-hatena-star-title="Basic認証(Basic Authentication)の基礎とリスクについてまとめてみた" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> </div> <div class="customized-footer"> </div> <div class="comment-box js-comment-box"> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> </div> </footer> </div> </article> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2400 words-200 mode-markdown entry-odd" id="entry-6802418398307191121" data-keyword-campaign="" data-uuid="6802418398307191121" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://cysec148.hatenablog.com/archive/2024/11/27" rel="nofollow"> <time datetime="2024-11-27T11:13:16Z" title="2024-11-27T11:13:16Z"> <span class="date-year">2024</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">27</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://cysec148.hatenablog.com/entry/2024/11/27/201316" class="entry-title-link bookmark">APIキーとその管理に関する基本とツールの使い方についてまとめてみた</a> </h1> <div class="entry-categories categories"> <a href="https://cysec148.hatenablog.com/archive/category/API" class="entry-category-link category-API">API</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hello there, ('ω')ノ</p> <p>APIキーは、クライアント(アプリケーション、ユーザ、または他のサービス)がAPIサーバと通信するときに使用する認証(AuthN)および認可(AuthZ)の基本メカニズムです。</p> <hr /> <h2 id="1-APIキーとは"><strong>1. APIキーとは?</strong></h2> <ul> <li><strong>APIキーの役割</strong>:<br/> APIキーは、クライアントがAPIにアクセスする際に、APIサーバがクライアントを認識するために使用される一意の文字列です。</li> <li><strong>シングルキーとペアキー</strong>: <ul> <li><strong>シングルキー</strong>: 1つのキーでアクセスを管理。</li> <li><strong>ペアキー</strong>: 1つのキーがユーザ名/ログイン名として機能し、もう1つがパスワードのように動作。</li> </ul> </li> </ul> <h3 id="なぜAPIキーを使用するのか"><strong>なぜAPIキーを使用するのか?</strong></h3> <ul> <li>ユーザ名/パスワードの認証は人間向け。APIキーはアプリケーション間の通信に特化。</li> <li>1つのユーザに複数のAPIキーを割り当て、異なる権限を付与可能(AuthZの柔軟性)。</li> </ul> <hr /> <h2 id="2-APIキーの管理とセキュリティ"><strong>2. APIキーの管理とセキュリティ</strong></h2> <h3 id="21-APIキーの提供方法"><strong>2.1 APIキーの提供方法</strong></h3> <ul> <li><strong>全リクエストに必須</strong>: APIキーはすべてのリクエストに含める必要があります。</li> <li><strong>保存方法</strong>: <ul> <li>環境変数に格納(推奨)。</li> <li>設定ファイルに保存(ただし暗号化またはアクセス制御が必須)。</li> </ul> </li> <li><strong>漏洩リスク</strong>:<br/> 開発者がAPIキーを公開リポジトリやHTML/JavaScriptファイルにハードコードすると、攻撃者がアクセスする可能性があります。</li> </ul> <hr /> <h2 id="3-APIキーの検出ツール"><strong>3. APIキーの検出ツール</strong></h2> <p>以下のツールは、APIキーの検出やセキュリティ管理に役立ちます:</p> <table> <thead> <tr> <th> ツール名 </th> <th> 概要 </th> </tr> </thead> <tbody> <tr> <td> <strong>badsecrets</strong> </td> <td> 多様なプラットフォームで秘密情報を検出するライブラリ。 </td> </tr> <tr> <td> <strong>Gitleaks</strong> </td> <td> Gitリポジトリ内のキーを検出する最も人気のあるツール。 </td> </tr> <tr> <td> <strong>KeyFinder</strong> </td> <td> Web閲覧中にキーを検出するChrome拡張機能。 </td> </tr> <tr> <td> <strong>Keyhacks</strong> </td> <td> 公開されたバグバウンティプログラムで見つかったキーを集約。</td> </tr> <tr> <td> <strong>Mantra</strong> </td> <td> HTMLやJavaScriptファイルからキーを検索。 </td> </tr> <tr> <td> <strong>Nuclei Templates</strong> </td> <td> APIエンドポイントに対してキーをテスト可能。 </td> </tr> <tr> <td> <strong>TruffleHog</strong> </td> <td> GitHubリポジトリやコンテナイメージで秘密情報を検出。 </td> </tr> </tbody> </table> <hr /> <h2 id="4-TruffleHogでAPIキーを検出する手順"><strong>4. TruffleHogでAPIキーを検出する手順</strong></h2> <h3 id="41-TruffleHogの基本使用例"><strong>4.1 TruffleHogの基本使用例</strong></h3> <p>以下のコマンドを使用してGitHubリポジトリ内でキーを検索します:</p> <pre class="code bash" data-lang="bash" data-unlink>$ docker run --rm -it -v &#34;$PWD:/pwd&#34; trufflesecurity/trufflehog:latest github --repo https://github.com/username/repo --issue-comments --pr-comments</pre> <h4 id="コマンドのポイント"><strong>コマンドのポイント</strong></h4> <ul> <li><strong><code>--repo</code></strong>: 対象のリポジトリURLを指定。</li> <li><strong><code>--issue-comments</code></strong>: イシューのコメントもスキャン。</li> <li><strong><code>--pr-comments</code></strong>: プルリクエストのコメントもスキャン。</li> </ul> <h4 id="出力例"><strong>出力例</strong></h4> <pre class="code plaintext" data-lang="plaintext" data-unlink>TruffleHog. Unearth your secrets. 2024-11-03T12:12:34Z info trufflehog running source... 2024-11-03T12:12:36Z info trufflehog finished scanning { &#34;verified_secrets&#34;: 0, &#34;unverified_secrets&#34;: 0, &#34;scan_duration&#34;: &#34;2.502645278s&#34; }</pre> <p><strong>結果</strong>: この例では秘密情報は見つかりませんでした。</p> <hr /> <h3 id="42-Secrets-Patterns-DBとの連携"><strong>4.2 Secrets Patterns DBとの連携</strong></h3> <p>TruffleHogの検出能力を拡張するため、<strong>Secrets Patterns DB</strong>を使用して正規表現パターンを追加します。</p> <h4 id="手順"><strong>手順</strong></h4> <ol> <li>Secrets Patterns DBのルールをJSON形式に変換:</li> </ol> <pre><code class="```bash"> $ ./convert-rules.py --db ../db/rules-stable.yml --type trufflehog &gt; /tmp/regex.json </code></pre> <ol> <li>JSONパターンを使用してTruffleHogを実行:</li> </ol> <pre><code class="```bash"> $ ./trufflehog github --repo https://github.com/username/repo --include-paths=/tmp/regex.json --issue-comments --pr-comments </code></pre> <h4 id="結果"><strong>結果</strong></h4> <p>追加パターンを使用してスキャンを強化できます。ただし、ツール間のバージョン互換性に注意が必要です。</p> <hr /> <h2 id="5-セキュリティ強化のポイント"><strong>5. セキュリティ強化のポイント</strong></h2> <ol> <li><p><strong>キーの漏洩防止</strong></p> <ul> <li>キーを環境変数に保存し、コードにハードコードしない。</li> <li>公開リポジトリにキーをコミットしない。</li> </ul> </li> <li><p><strong>キーの監視</strong></p> <ul> <li>定期的にAPIキーをスキャンして漏洩を確認。</li> <li>使用状況を監視し、不審な活動を検知。</li> </ul> </li> <li><p><strong>キーのローテーション</strong></p> <ul> <li>定期的にAPIキーを更新し、古いキーを無効化。</li> </ul> </li> <li><p><strong>権限管理</strong></p> <ul> <li>各キーに必要最小限の権限を割り当てる(プリンシプル・オブ・リースト・プリビレッジ)。</li> </ul> </li> </ol> <hr /> <h2 id="まとめ"><strong>まとめ</strong></h2> <p>APIキーは、APIセキュリティの基盤となる重要な認証メカニズムですが、適切に管理しないとリスクを伴います。GitleaksやTruffleHogなどのツールを活用して、漏洩リスクを定期的にチェックしましょう。また、キーの保存、監視、ローテーションを徹底することで、APIの安全性を高めることができます。</p> <p>Best regards, (^^ゞ</p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="ThisIsOne" >ThisIsOne</span></span> <span class="entry-footer-time"><a href="https://cysec148.hatenablog.com/entry/2024/11/27/201316"><time data-relative datetime="2024-11-27T11:13:16Z" title="2024-11-27T11:13:16Z" class="updated">2024-11-27 20:13</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://cysec148.hatenablog.com/entry/2024/11/27/201316" data-hatena-star-title="APIキーとその管理に関する基本とツールの使い方についてまとめてみた" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> </div> <div class="customized-footer"> </div> <div class="comment-box js-comment-box"> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> </div> </footer> </div> </article> <article class="entry hentry test-hentry js-entry-article date-last autopagerize_page_element chars-2000 words-200 mode-markdown entry-even" id="entry-6802418398307030826" data-keyword-campaign="" data-uuid="6802418398307030826" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date last"> <a href="https://cysec148.hatenablog.com/archive/2024/11/27" rel="nofollow"> <time datetime="2024-11-26T21:56:17Z" title="2024-11-26T21:56:17Z"> <span class="date-year">2024</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">27</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://cysec148.hatenablog.com/entry/2024/11/27/065617" class="entry-title-link bookmark">APIの認証メカニズムの理解と比較についてまとめてみた</a> </h1> <div class="entry-categories categories"> <a href="https://cysec148.hatenablog.com/archive/category/API" class="entry-category-link category-API">API</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hello there, ('ω')ノ</p> <p>API認証(Authentication、AuthN)は、システムやデータへのアクセスを制御するために不可欠な仕組みです。</p> <hr /> <h2 id="1-認証不要なAPIの例"><strong>1. 認証不要なAPIの例</strong></h2> <p>一部のAPIは、<strong>認証なし(AuthN不要)</strong>で機能します。これらは主に<strong>読み取り専用</strong>の操作を提供し、公開データの利用を促進します。</p> <h3 id="11-CKANフレームワーク"><strong>1.1 CKANフレームワーク</strong></h3> <ul> <li><strong>概要</strong>: オープンデータの公開を支援するPythonベースのRESTful API。</li> <li><strong>用途</strong>: 認証なしでデータの読み取りが可能。</li> </ul> <h3 id="12-OSINT-Framework"><strong>1.2 OSINT Framework</strong></h3> <ul> <li><strong>概要</strong>: IP位置情報や地理情報サービスなど、一部のツールは認証なしで提供。</li> <li><strong>用途</strong>: 無料で公開データを利用可能。ただし、バックエンドの保護が必須。</li> </ul> <hr /> <h2 id="2-API認証メカニズムの種類"><strong>2. API認証メカニズムの種類</strong></h2> <p>認証が必要な場合、APIは以下のような認証メカニズムを採用します。特にRESTful APIで一般的です。</p> <h3 id="21-APIキー"><strong>2.1 APIキー</strong></h3> <ul> <li><strong>概要</strong>: アプリケーションやユーザを識別するための一意の識別子。</li> <li><strong>利点</strong>: シンプルで実装が簡単。</li> <li><strong>リスク</strong>: APIキーが漏洩すると悪用される可能性が高い。</li> </ul> <h4 id="利用例"><strong>利用例</strong></h4> <pre class="code bash" data-lang="bash" data-unlink>curl -H &#34;Authorization: Api-Key YOUR_API_KEY&#34; https://api.example.com/resource</pre> <hr /> <h3 id="22-Basic認証"><strong>2.2 Basic認証</strong></h3> <ul> <li><strong>概要</strong>: ユーザ名とパスワードをBase64でエンコードして送信。</li> <li><strong>利点</strong>: 実装が簡単。</li> <li><strong>リスク</strong>: Base64エンコードは暗号化ではなく、容易にデコード可能。TLSで暗号化された接続が必須だが、推奨されない。</li> </ul> <h4 id="利用例-1"><strong>利用例</strong></h4> <pre class="code bash" data-lang="bash" data-unlink>curl -u &#34;username:password&#34; https://api.example.com/resource</pre> <hr /> <h3 id="23-OAuth-20"><strong>2.3 OAuth 2.0</strong></h3> <ul> <li><strong>概要</strong>: ユーザの資格情報を共有せずにアクセスを委任するオープン標準。</li> <li><strong>特徴</strong>: <ul> <li><strong>アクセストークン</strong>: APIリクエストに含めて使用。</li> <li><strong>OIDC(OpenID Connect)</strong>: OAuthに認証レイヤーを追加したもの。ユーザの識別を可能にする。</li> </ul> </li> </ul> <h4 id="利用例-2"><strong>利用例</strong></h4> <pre class="code bash" data-lang="bash" data-unlink>curl -H &#34;Authorization: Bearer YOUR_ACCESS_TOKEN&#34; https://api.example.com/resource</pre> <hr /> <h3 id="24-セッショントークン"><strong>2.4 セッショントークン</strong></h3> <ul> <li><strong>概要</strong>: 初回ログイン後に生成される一時的なキー。ユーザの認証状態を維持。</li> <li><strong>利点</strong>: <ul> <li>ログイン不要で利便性が向上。</li> <li>トークンは期限が設定され、比較的安全。</li> </ul> </li> </ul> <hr /> <h3 id="25-JSON-Web-Tokens-JWTs"><strong>2.5 JSON Web Tokens (JWTs)</strong></h3> <ul> <li><strong>概要</strong>: 認証情報を含む自己完結型のトークン。クライアントとサーバー間でのやり取りを最小化。</li> <li><strong>利点</strong>: <ul> <li><strong>署名付き</strong>: トークンが改ざんされていないことを検証可能。</li> <li><strong>自己記述型</strong>: 必要なデータがトークン内に格納されるため、データベースへの問い合わせが不要。</li> </ul> </li> </ul> <h4 id="JWTの例"><strong>JWTの例</strong></h4> <pre class="code lang-json" data-lang="json" data-unlink><span class="synSpecial">{</span> &quot;<span class="synStatement">header</span>&quot;: <span class="synSpecial">{</span> &quot;<span class="synStatement">alg</span>&quot;: &quot;<span class="synConstant">HS256</span>&quot;, &quot;<span class="synStatement">typ</span>&quot;: &quot;<span class="synConstant">JWT</span>&quot; <span class="synSpecial">}</span>, &quot;<span class="synStatement">payload</span>&quot;: <span class="synSpecial">{</span> &quot;<span class="synStatement">sub</span>&quot;: &quot;<span class="synConstant">1234567890</span>&quot;, &quot;<span class="synStatement">name</span>&quot;: &quot;<span class="synConstant">John Doe</span>&quot;, &quot;<span class="synStatement">admin</span>&quot;: <span class="synConstant">true</span> <span class="synSpecial">}</span>, &quot;<span class="synStatement">signature</span>&quot;: &quot;<span class="synConstant">abc123...</span>&quot; <span class="synSpecial">}</span> </pre> <h4 id="利用例-3"><strong>利用例</strong></h4> <pre class="code bash" data-lang="bash" data-unlink>curl -H &#34;Authorization: Bearer YOUR_JWT_TOKEN&#34; https://api.example.com/resource</pre> <hr /> <h2 id="3-各認証メカニズムの比較"><strong>3. 各認証メカニズムの比較</strong></h2> <table> <thead> <tr> <th> <strong>認証方式</strong> </th> <th> <strong>利点</strong> </th> <th> <strong>リスク</strong> </th> <th> <strong>用途</strong> </th> </tr> </thead> <tbody> <tr> <td> <strong>APIキー</strong> </td> <td> 簡単に実装可能 </td> <td> キー漏洩時の悪用リスク </td> <td> 単純な認証 </td> </tr> <tr> <td> <strong>Basic認証</strong> </td> <td> 実装が簡単 </td> <td> セキュリティが非常に低い </td> <td> テストや非機密データ向け </td> </tr> <tr> <td> <strong>OAuth 2.0</strong> </td> <td> 安全なアクセス委任 </td> <td> 実装が複雑 </td> <td> 機密性の高いデータ </td> </tr> <tr> <td> <strong>セッショントークン</strong> </td> <td> ログイン不要で利便性向上 </td> <td> トークンの不適切な管理 </td> <td> ウェブアプリケーション </td> </tr> <tr> <td> <strong>JWT</strong> </td> <td> 高い効率性とセキュリティ </td> <td> トークンが長すぎるとパフォーマンスに影響 </td> <td> 分散システムやマイクロサービス </td> </tr> </tbody> </table> <hr /> <h2 id="4-セキュリティ強化のポイント"><strong>4. セキュリティ強化のポイント</strong></h2> <ul> <li><strong>TLSの活用</strong>: すべてのAPI通信を暗号化。</li> <li><strong>トークンの期限設定</strong>: 有効期限を設けて、無期限トークンを防止。</li> <li><strong>トークンのローテーション</strong>: 定期的にトークンを更新。</li> <li><strong>IP制限</strong>: 信頼できるIPアドレスからのアクセスのみを許可。</li> <li><strong>ログ監視</strong>: 不正アクセスを早期に発見。</li> </ul> <hr /> <h2 id="まとめ"><strong>まとめ</strong></h2> <p>API認証は、システムを安全に保つための重要な基盤です。それぞれの認証方式には利点とリスクがありますが、利用目的やデータの機密性に応じて適切な方法を選択することが求められます。</p> <p>Best regards, (^^ゞ</p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="ThisIsOne" >ThisIsOne</span></span> <span class="entry-footer-time"><a href="https://cysec148.hatenablog.com/entry/2024/11/27/065617"><time data-relative datetime="2024-11-26T21:56:17Z" title="2024-11-26T21:56:17Z" class="updated">2024-11-27 06:56</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://cysec148.hatenablog.com/entry/2024/11/27/065617" data-hatena-star-title="APIの認証メカニズムの理解と比較についてまとめてみた" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> </div> <div class="customized-footer"> </div> <div class="comment-box js-comment-box"> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> </div> </footer> </div> </article> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2000 words-200 mode-markdown entry-odd" id="entry-6802418398306976957" data-keyword-campaign="" data-uuid="6802418398306976957" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://cysec148.hatenablog.com/archive/2024/11/26" rel="nofollow"> <time datetime="2024-11-26T13:17:53Z" title="2024-11-26T13:17:53Z"> <span class="date-year">2024</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">26</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://cysec148.hatenablog.com/entry/2024/11/26/221753" class="entry-title-link bookmark">OSINT(オープンソース情報収集)の活用法とAPI調査についてまとめてみた</a> </h1> <div class="entry-categories categories"> <a href="https://cysec148.hatenablog.com/archive/category/API" class="entry-category-link category-API">API</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hello there, ('ω')ノ</p> <p>OSINT(Open Source Intelligence)は、公開されている情報を収集・分析するための一連の技術を指します。近年、この分野は急成長しており、APIセキュリティやエンドポイントの調査でも非常に役立ちます。</p> <hr /> <h2 id="1-OSINTとは"><strong>1. OSINTとは?</strong></h2> <p>OSINTは、公開情報を利用して有益な情報を収集する技術です。APIに関してOSINTを使用すると、以下のことが可能です:</p> <ul> <li>ドキュメント化されていないAPI情報の発見</li> <li>新しいエンドポイントの特定</li> <li>既存エンドポイントの変更内容の発見</li> <li>APIのセキュリティ脆弱性の発見</li> </ul> <hr /> <h2 id="2-OSINTリソースとツール"><strong>2. OSINTリソースとツール</strong></h2> <h3 id="21-主なリソース"><strong>2.1 主なリソース</strong></h3> <ul> <li><strong>検索エンジン</strong>: GoogleやBingでドキュメント化されていないAPIを探す。</li> <li><strong>ソーシャルメディア</strong>: X(旧Twitter)やGitHubで新しいエンドポイントや脆弱性情報を発見。</li> <li><strong>オンラインフォーラム</strong>: Stack OverflowやRedditでAPIの使い方や問題解決法を確認。</li> </ul> <h3 id="22-おすすめツール"><strong>2.2 おすすめツール</strong></h3> <ul> <li><strong>OSINT Framework</strong>: OSINTリソースのオンラインカタログ。無料ツールと商用ツールがリスト化されています。 <ul> <li><a href="https://osintframework.com/">https://osintframework.com/</a></li> </ul> </li> <li><strong>Shodan</strong>: IoTデバイスやAPIエンドポイントを検索できるデータベース。APIの脆弱性も確認可能です。 <ul> <li><a href="https://www.shodan.io/">https://www.shodan.io/</a></li> </ul> </li> <li><strong>Google Hacking Database</strong>: Google検索クエリ(Google Dorks)のリストで、APIに関連する情報を効率的に探せます。 <ul> <li><a href="https://www.exploit-db.com/google-hacking-database/">https://www.exploit-db.com/google-hacking-database/</a></li> </ul> </li> </ul> <hr /> <h2 id="3-API調査に役立つクエリ例"><strong>3. API調査に役立つクエリ例</strong></h2> <h3 id="31-Google-Dorks"><strong>3.1 Google Dorks</strong></h3> <p>以下のクエリは、APIに関連する重要な情報を収集するのに役立ちます:</p> <ul> <li><strong>APIキーを含むファイルを検索</strong>:</li> </ul> <pre><code class="``plaintext"> allintext:"API_SECRET*" ext:env | ext:yml </code></pre> <p> <code>.env</code>や<code>.yml</code>ファイルに含まれる<code>API_SECRET</code>を探します。</p> <ul> <li><strong>APIディレクトリを一覧表示</strong>:</li> </ul> <pre><code class="``plaintext"> intitle:"Index of /api/" </code></pre> <p> <code>/api/</code>ディレクトリ内のファイルや構造を一覧表示。</p> <ul> <li><strong>Amazon API GatewayのURLを検索</strong>:</li> </ul> <pre><code class="``plaintext"> inurl:execute-api site:amazonaws.com </code></pre> <p> Amazon API Gatewayを利用しているサイトを特定。</p> <hr /> <h3 id="32-Shodanクエリ"><strong>3.2 Shodanクエリ</strong></h3> <ul> <li><strong>特定ドメインに関連するホスト名を検索</strong>:</li> </ul> <pre><code class="``plaintext"> hostname:targetdomain.com </code></pre> <ul> <li><strong>JSONやXML形式のコンテンツをフィルタリング</strong>:</li> </ul> <pre><code class="``plaintext"> content-type:application/json </code></pre> <ul> <li><strong>HTTPステータスコード200(成功)のみを表示</strong>:</li> </ul> <pre><code class="``plaintext"> 200 OK </code></pre> <hr /> <h2 id="4-GitHubでのAPI情報収集"><strong>4. GitHubでのAPI情報収集</strong></h2> <p>GitHubのリポジトリには、APIキーや機密情報が含まれている場合があります。以下のクエリを使用して情報を収集できます:</p> <h3 id="41-ファイルパスに基づくクエリ"><strong>4.1 ファイルパスに基づくクエリ</strong></h3> <ul> <li><code>/config/</code>ディレクトリ内のファイルを検索:</li> </ul> <pre><code class="``plaintext"> path:/config/ </code></pre> <h3 id="42-言語に基づくクエリ"><strong>4.2 言語に基づくクエリ</strong></h3> <ul> <li>JSONファイルのみを検索:</li> </ul> <pre><code class="``plaintext"> language:json </code></pre> <h3 id="43-拡張子に基づくクエリ"><strong>4.3 拡張子に基づくクエリ</strong></h3> <ul> <li><code>.yml</code>や<code>.json</code>ファイルを検索:</li> </ul> <pre><code class="``plaintext"> extension:yml extension:json </code></pre> <h3 id="44-サイズに基づくクエリ"><strong>4.4 サイズに基づくクエリ</strong></h3> <ul> <li>サイズが1KB以上のファイルを検索:</li> </ul> <pre><code class="``plaintext"> size:&gt;1000 </code></pre> <hr /> <h2 id="5-注意点"><strong>5. 注意点</strong></h2> <h3 id="51-プライバシーとセキュリティの配慮"><strong>5.1 プライバシーとセキュリティの配慮</strong></h3> <p>OSINTは強力な情報収集手段ですが、不正使用は避けるべきです。調査対象の同意を得る、または合法的な範囲内で活動することが重要です。</p> <h3 id="52-APIのレスポンスデータの確認"><strong>5.2 APIのレスポンスデータの確認</strong></h3> <p>APIのレスポンスボディには、開発者が気づいていない情報が含まれている場合があります。例えば:</p> <ul> <li>他のユーザのデータやID</li> <li>内部のエンドポイント構造</li> </ul> <p>これらの情報を活用することで、脆弱性の特定や改善提案が可能です。</p> <hr /> <h2 id="まとめ"><strong>まとめ</strong></h2> <p>OSINTを活用すれば、APIのエンドポイントや脆弱性情報を効率的に収集できます。ShodanやGoogle Dorks、GitHub検索を組み合わせて、公開情報から最大限のデータを引き出しましょう。</p> <p>Best regards, (^^ゞ</p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="ThisIsOne" >ThisIsOne</span></span> <span class="entry-footer-time"><a href="https://cysec148.hatenablog.com/entry/2024/11/26/221753"><time data-relative datetime="2024-11-26T13:17:53Z" title="2024-11-26T13:17:53Z" class="updated">2024-11-26 22:17</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://cysec148.hatenablog.com/entry/2024/11/26/221753" data-hatena-star-title="OSINT(オープンソース情報収集)の活用法とAPI調査についてまとめてみた" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> </div> <div class="customized-footer"> </div> <div class="comment-box js-comment-box"> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> </div> </footer> </div> </article> <!-- rakuten_ad_target_end --> <!-- google_ad_section_end --> <div class="pager autopagerize_insert_before"> <span class="pager-next"> <a href="https://cysec148.hatenablog.com/?page=1732627073" rel="next">次のページ</a> </span> </div> </div> </div> <aside id="box1"> <div id="box1-inner"> </div> </aside> </div><!-- #wrapper --> <aside id="box2"> <div id="box2-inner"> <div class="hatena-module hatena-module-profile"> <div class="hatena-module-title"> プロフィール </div> <div class="hatena-module-body"> <a href="https://cysec148.hatenablog.com/about" class="profile-icon-link"> <img src="https://cdn.profile-image.st-hatena.com/users/ThisIsOne/profile.png?1572593258" alt="id:ThisIsOne" class="profile-icon" /> </a> <span class="id"> <a href="https://cysec148.hatenablog.com/about" class="hatena-id-link"><span data-load-nickname="1" data-user-name="ThisIsOne">id:ThisIsOne</span></a> <a href="https://blog.hatena.ne.jp/-/pro?plus_via=blog_plus_badge&amp;utm_source=pro_badge&amp;utm_medium=referral&amp;utm_campaign=register_pro" title="はてなブログPro"><i class="badge-type-pro">はてなブログPro</i></a> </span> <div class="profile-activities"> 最終更新: <time datetime="2024-11-28T21:05:49Z" data-relative data-epoch="1732827949000" class="updated">2024-11-29 06:05</time> </div> <div class="profile-about"> <a href="https://cysec148.hatenablog.com/about">このブログについて</a> </div> </div> </div> <div class="hatena-module hatena-module-search-box"> <div class="hatena-module-title"> 検索 </div> <div class="hatena-module-body"> <form class="search-form" role="search" action="https://cysec148.hatenablog.com/search" method="get"> <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required> <input type="submit" value="検索" class="search-module-button" /> </form> </div> </div> <div class="hatena-module hatena-module-archive" data-archive-type="calendar" data-archive-url="https://cysec148.hatenablog.com/archive"> <div class="hatena-module-title"> <a href="https://cysec148.hatenablog.com/archive">月別アーカイブ</a> </div> <div class="hatena-module-body"> </div> </div> <div class="hatena-module hatena-module-recent-entries "> <div class="hatena-module-title"> <a href="https://cysec148.hatenablog.com/archive"> 最新記事 </a> </div> <div class="hatena-module-body"> <ul class="recent-entries hatena-urllist "> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://cysec148.hatenablog.com/entry/2024/11/29/060549" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">OAuthの仕組み、使用例、リスクについてまとめてみた</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://cysec148.hatenablog.com/entry/2024/11/28/080710" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">Basic認証(Basic Authentication)の基礎とリスクについてまとめてみた</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://cysec148.hatenablog.com/entry/2024/11/27/201316" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">APIキーとその管理に関する基本とツールの使い方についてまとめてみた</a> </div> </li> </ul> <div class="urllist-see-more recent-entries-see-more"> <a href="https://cysec148.hatenablog.com/archive" class="urllist-see-more-link recent-entries-see-more-link"> もっと見る </a> </div> </div> </div> <div class="hatena-module hatena-module-category"> <div class="hatena-module-title"> カテゴリー </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li> <a href="https://cysec148.hatenablog.com/archive/category/Bug%20Bounty" class="category-Bug-Bounty"> Bug Bounty (700) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/PortSwigger" class="category-PortSwigger"> PortSwigger (225) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E8%84%86%E5%BC%B1%E6%80%A7%E8%A8%BA%E6%96%AD" class="category-脆弱性診断"> 脆弱性診断 (91) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/OSINT" class="category-OSINT"> OSINT (90) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/bWAPP" class="category-bWAPP"> bWAPP (80) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Burp%20Suite" class="category-Burp-Suite"> Burp Suite (80) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Juice%20Shop" class="category-Juice-Shop"> Juice Shop (76) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%83%9A%E3%83%8D%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88" class="category-ペネトレーションテスト"> ペネトレーションテスト (72) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/DVWA" class="category-DVWA"> DVWA (52) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/WEBGOAT" class="category-WEBGOAT"> WEBGOAT (41) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Kali%20Linux" class="category-Kali-Linux"> Kali Linux (34) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Metasploit" class="category-Metasploit"> Metasploit (33) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Generative%20AI" class="category-Generative-AI"> Generative AI (24) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0" class="category-プロンプトエンジニアリング"> プロンプトエンジニアリング (23) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Mutillidae%E2%85%A1" class="category-MutillidaeⅡ"> MutillidaeⅡ (22) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2" class="category-セキュリティエンジニア"> セキュリティエンジニア (21) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/OWASP%20ZAP" class="category-OWASP-ZAP"> OWASP ZAP (18) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/API" class="category-API"> API (18) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E8%84%86%E5%BC%B1%E6%80%A7" class="category-脆弱性"> 脆弱性 (18) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Mobile" class="category-Mobile"> Mobile (18) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/WackoPicko" class="category-WackoPicko"> WackoPicko (16) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%95%E3%82%A9%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%83%E3%82%AF" class="category-デジタルフォレンジック"> デジタルフォレンジック (16) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Nmap" class="category-Nmap"> Nmap (16) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Wireshark" class="category-Wireshark"> Wireshark (15) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Pentesterlab" class="category-Pentesterlab"> Pentesterlab (14) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/HellBound" class="category-HellBound"> HellBound (12) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%81%9D%E3%81%AE%E4%BB%96" class="category-その他"> その他 (12) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/MITRE" class="category-MITRE"> MITRE (11) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/OWASP" class="category-OWASP"> OWASP (10) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/%E3%82%84%E3%82%89%E3%82%8C%E3%82%B5%E3%82%A4%E3%83%88" class="category-やられサイト"> やられサイト (10) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Shepherd" class="category-Shepherd"> Shepherd (9) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Gruyere" class="category-Gruyere"> Gruyere (9) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/SecureCodingDojo" class="category-SecureCodingDojo"> SecureCodingDojo (8) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Bad%20Store" class="category-Bad-Store"> Bad Store (8) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/BodgeIt" class="category-BodgeIt"> BodgeIt (8) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Red%20Team" class="category-Red-Team"> Red Team (8) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Qualys" class="category-Qualys"> Qualys (7) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Shodan" class="category-Shodan"> Shodan (7) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/IPA" class="category-IPA"> IPA (7) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/WAHH" class="category-WAHH"> WAHH (6) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/AI%20Attack" class="category-AI-Attack"> AI Attack (6) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Peruggia" class="category-Peruggia"> Peruggia (6) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/WSTG" class="category-WSTG"> WSTG (5) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/Neo4j" class="category-Neo4j"> Neo4j (4) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/YouTube" class="category-YouTube"> YouTube (4) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/LangChain" class="category-LangChain"> LangChain (4) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/VEGA" class="category-VEGA"> VEGA (3) </a> </li> <li> <a href="https://cysec148.hatenablog.com/archive/category/arachni" class="category-arachni"> arachni (3) </a> </li> </ul> </div> </div> </div> </aside> </div> </div> </div> </div> <script async src="https://s.hatena.ne.jp/js/widget/star.js"></script> <script> if (typeof window.Hatena === 'undefined') { window.Hatena = {}; } if (!Hatena.hasOwnProperty('Star')) { Hatena.Star = { VERSION: 2, }; } </script> <div class="quote-box"> <div class="tooltip-quote tooltip-quote-stock"> <i class="blogicon-quote" title="引用をストック"></i> </div> <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet"> <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once> <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=b06a9d4929119667e7027e25c25079" title="引用して投稿する" > </a> </div> </div> <div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000"> <div class="message-box" id="quote-stock-succeeded-message" style="display: none"> <p>引用をストックしました</p> <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="message-box" id="quote-login-required-message" style="display: none"> <p>引用するにはまずログインしてください</p> <button class="btn btn-primary" id="quote-login-button">ログイン</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="quote-stock-failed-message" style="display: none"> <p>引用をストックできませんでした。再度お試しください</p> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;"> <p>限定公開記事のため引用できません。</p> </div> </div> <script type="x-underscore-template" id="js-requote-button-template"> <div class="requote-button js-requote-button"> <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button> </div> </script> <div id="hidden-subscribe-button" style="display: none;"> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> </div> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&amp;version=b06a9d4929119667e7027e25c25079"></script> <script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=b06a9d4929119667e7027e25c25079"></script> <script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=b06a9d4929119667e7027e25c25079" crossorigin="anonymous"></script> <script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=b06a9d4929119667e7027e25c25079" crossorigin="anonymous" data-page-id="index"></script> <script>Hatena.Diary.GlobalHeader.init()</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10