セキュアコーディングの概念とDVWAを使った一般的なセキュリティの脆弱性
1. 紹介
デジタル化が進む現代社会では、情報セキュリティがプロジェクトの存続と成功に欠かせない要素となっています。セキュアコーディングは、システムをハッカーによって悪用される脆弱性から保護するために重要な方法です。セキュアコーディングは、プログラムが正しく動作するだけでなく、セキュリティホールを排除することを目的としています。
サイバー攻撃とセキュリティ脅威が増加する中で、セキュアコーディングの原則を理解し実践することがますます重要になっています。この記事では、セキュアコーディングの基本的な原則から、セキュリティを強化し、持続可能なソフトウェアを開発するためのベストプラクティスを探ります。
1.1 セキュアコーディングとは?
セキュアコーディングは、ソフトウェア開発中にセキュリティホールを最小限に抑え、排除するための原則と実践のセットです。セキュアコーディングの目的は、ソフトウェアが正しく機能するだけでなく、外部からの潜在的な攻撃に対して保護できるようにすることです。
簡単に言うと、「セキュアコーディング」とは、セキュリティホールを生じさせないようにソフトウェアを開発することです。
経験と知識なしでは、セキュリティホールをイメージしにくいため、次に紹介する「DVWA」という安全な環境で実際に試すことをお勧めします。
1.2 DVWAとは?
DVWA(Damn Vulnerable Web Application)は、一般的なセキュリティ脆弱性をシミュレートするウェブアプリケーションで、セキュリティの専門家や開発者、テスト担当者がウェブアプリケーションのセキュリティについて実践的に学べるツールです。DVWAは、実際のシステムに害を与えることなく、攻撃技術と防御技術を試すための安全な環境を提供します。
1.3 DVWAのインストール
DVWAのインストールは非常に簡単で、次のDocker記事を参考にしてすぐにセットアップできます。こちらの記事をご覧ください。
git clone https://github.com/digininja/DVWA.git cd DVWA docker-compose up -d
インストール後、アプリケーションはポート4280で動作します。
デフォルトの管理者アカウント:admin/admin
一般ユーザーアカウント:gordonb/abc123
アクセスしてログイン:http://localhost:4280/security.php
その後、セキュリティレベルを“medium”に設定します。
2. Webアプリケーションでよくあるセキュリティの脆弱性
次に、Webアプリケーションを開発する際によく遭遇するセキュリティの脆弱性について見ていきましょう。
2.1 アクセス制御の欠如 (Broken Access Control)
アクセス制御が不十分で、ユーザーが許可されていない情報にアクセスしたり、データが漏洩したりする脆弱性です。
詳細はこちらを参照してください。
例:
アクセスするには、http://localhost:4280/vulnerabilities/authbypass/を使用します。
このページはユーザー管理ページで、管理者のみがアクセスできます。ログインしたアカウントを一般ユーザーに変更した後、ユーザー管理ページにアクセスできません。
しかし、このページは、http://localhost:4280/vulnerabilities/authbypass/get_user_data.phpというAPIを使用してユーザーデータを取得します。一般ユーザーアカウントでこのエンドポイントにアクセスすると、ユーザー情報が表示されます。
原因: 開発者がAPIアクセス制御を確認していないため、管理者だけが見るべき情報が漏洩してしまいました。
2.2 SQLインジェクション (SQL Injection)
攻撃者がアプリケーションの入力フィールドに悪意のあるコードを挿入し、データの漏洩を引き起こす脆弱性です。
詳細はこちらをご覧ください。
例:
アカウント「gordonb」で、http://localhost:4280/vulnerabilities/sqli/にアクセスします。
「Submit」ボタンをクリックすると、ユーザーID 1の情報が表示されます。
「Developer Tool」を使用して、オプション1の値を次のように変更します:
1 union select version(), GROUP_CONCAT(table_name) AS all_table_names FROM information_schema.tables;--
「Submit」をクリックすると、データベース内のすべてのテーブル情報が表示されます。
原因: 開発者が入力検証を適切に行わず、データを十分にサニタイズしていませんでした。
2.3 クロスサイトスクリプティング (XSS)
攻撃者が悪意のあるJavaScriptコードをウェブページに挿入し、ユーザー情報の漏洩を引き起こす脆弱性です。XSSは、ブラウザのセキュリティ機構であるSame-origin policyを回避するために使われることが多いです。
XSSには3種類あります:Reflected XSS、Stored XSS、DOM Based XSS。このセクションではDOM Based XSSを取り上げます。
例:
http://localhost:4280/vulnerabilities/xss_d/にアクセスします。
「Select」をクリックすると、URLが次のようになります:
http://localhost:4280/vulnerabilities/xss_d/?default=English
「default」の値を変更してもアプリケーションは内容をそのまま表示します。
http://localhost:4280/vulnerabilities/xss_d/?default=ABC
次に「default」の値を以下のように変更します:
ABC></option></select><script>alert(document.cookie)</script><select>
URLは次のようになります:
http://localhost:4280/vulnerabilities/xss_d/?default=ABC></option></select><script>alert(document.cookie)</script><select>
このエラーが表示されることで、攻撃者は他の方法で悪意のあるコードを実行することができることがわかります。
原因: 開発者がユーザー入力を適切に検証せず、表示時にエスケープ処理を行っていないことです。
3. 結論
上記の脆弱性はすべてユーザー入力を適切に制御していないことに起因します。したがって、開発者として常に覚えておくべきことは、「NEVER TRUST USER INPUT」です。
![]() | Nguyễn Hữu Phận Developer |