ハッカーはSQL Injection(Login Form)を利用して、意図的に安全でないウェブアプリケーションbWAPPを攻撃して脆弱性を確認する
WEBサイトにある、ログインフォームのハッキングについて「SQL Injection」の攻撃方法を用いて試験環境で確認します。
SQL Injection(Login Form)とは
SQL Injection(Login Form)は、Webアプリケーションに対する攻撃の一種で、ログインフォームに攻撃するための命令を、直接入力データに書き込み、実行することによって、データベースに対する不正アクセスを試みます。
不正アクセスが成功すると、ログイン情報(ログイン名、パスワードなど)を入力しなくても、ログインできるようにすることができます。
これにより、攻撃者はデータベース内のユーザー情報を取得したり、データベース内の他の重要な情報にアクセスしたりすることができます。
テスト環境の作成とテスト準備
Oracle VM VirtualBox(仮想環境)を用いて、Open Web Application Security Project(OWASP)の意図的に安全でない脆弱なウェブアプリケーションbWAPPを利用して、Kali Linuxで確認します。
Oracle VM VirtualBoxの環境が無い方は、
ディスクトップパソコンに仮想環境を作成してKali Linux 2021.3をインストール(手順)
OWASPの環境が無い方は、
VM VirtualBox6.1でやられサーバOWASP BWAを構築します
をご覧ください。
テスト環境を立ち上げます。
1.Oracle VM VirtualBoxを起動します。
2.OWASP BWAを起動します。
3.OWASP BWAのIPアドレスを確認します。
この環境では192.168.56.108
4.OWASP BWAにログインします。
username:root
password:owaspbwa
5.Kali Linuxを起動します。
6.Kali Linuxiにログインします。
username:kali
password:kali
7.ブラウザを開きます。
8.ブラウザのアドレス欄に先ほど調べたOWASP BWAのIPアドレスを入力します。
9.OWASP BWAのサイトが立ち上がりました。
これで、テストの準備ができました。
SQL Injection(Login Form)を利用して、bWAPPを用い脆弱性を確認する
1.bWAPPを起動します。Training Applicationsの「bWAPP」をクリックします。
2.bWAPP(buggy web app)のページが表示されました。
3.bWAPPにログインします。
Login:bee
Password:bug
Set the security level:low
でログインします。
4.bWAPPのPortal画面が表示されました。
HTMLインジェクション:ログインフォームのテストを行うため、「SQL Injection(Login Form)」を選択して「Hack」ボタンを押下します。
セキュリティレベル「low」(セキュリティ無し)
セキュリティレベル「low」に設定して、「Set」ボタンを押下します。
※初期値として「low」になっています。
1.SQL Injection (Login Form):ログインフォームです。
下記コメントに
「Enter your 'superhero’ credentials.(スーパーヒーローの資格情報を入力してください。)」とあります。
ちなみに、Login情報が「superhero」だとして、パスワードがわかりません。
2.このフォームのソースを確認します。
ソースにログインのヒントはなさそうです。
3.とりあえず、適当なワードを入力して動作確認してみます。
Login:superhero
Password:superhero を入力して「Login」ボタンを押下。
4.「Invalid credentials!(無効な認証情報です!)」エラーになりました。
適当にデータを入力したのでエラーになるのは当然ですね。
適当にデータを入力したのでエラーになるのは当然ですね。
5.次に、SQL Injectionとして攻撃するための命令を直接入力データに書き込みます。
攻撃するための命令は
「' or 'a’ = 'a’ — 」 最後の半角スペースも入ります。
です。
「おまじない」みたいな文字列ですね。
Login:' or 'a’ = 'a’ —
Password:(未入力)
を入力して「Login」ボタンを押下。
6.「Welcome Neo.Your secret: Oh Why Didn’t I Took That BLACK Pill?」
ようこそ Neo.あなたの秘密: ああ、なぜ私はその黒い錠剤を服用しなかったのですか?
上記の意味は良くわかりませんが、ログインが成功しました。
7.なぜ、成功したのでしょうか?
表現の方法が難しいのですが・・・
データベースのアクセスで、上記のフォームの例では
◎ログイン名とパスワードが正しい場合は「真(正しい)」
◎ログイン名が正しくない、パスワードが正しくない または
ログインメイとパスワード両方が正しくない場合は「偽(誤り)」と判定されます。
データベースをアクセスするときに「select文」を使用するのですが、
先ほどエラーになった
Login:superhero
Password:superhero を例にすると
select * from ログインテーブル where login = 'superhero’ and pass = 'superhero’;
このようなSQLクエリ(命令)を出します。
whereの後の条件を注目してもらいたいのですが
where login = 'superhero' and pass = 'superhero';
ログインできる条件が
loginの情報が「superhero」でかつ、
passの情報が「superhero」の場合
残念ながら、上記の情報はデータベースになかったので「偽」と判断されてエラーになりました。
SQL Injectionとして攻撃するための命令(おまじない)として
Login:' or 'a’ = 'a’ —
Password:(未入力) と入力しました。
条件は以下のようになります。
where login = " or 'a’ = 'a’ — and pass = ";
これは、
【SQL Injection ここがポイント1】
上記の情報で、loginの情報が(未入力) または 'a’ が 'a’であるため「真」と判断されて正しくログインできました。
【SQL Injection ここがポイント2】
本来は 「and pass = ";」 の条件もあるのですが、
「 —
」の文字を追加すると「 — 」以下の条件はコメントになるため「and pass = ";」の条件は無視されるのです。
よって、
where login = " or 'a’ = 'a’;
の条件で判定され「真」になっていたのですね。
セキュリティレベル「medium」(セキュリティ弱)
セキュリティレベル「medium」に設定して、「Set」ボタンを押下します。
先ほどと同様に
SQL Injectionとして攻撃するための命令を直接入力データに書き込みます。
SQL Injectionとして攻撃するための命令として
Login:' or 'a’ = 'a’ —
Password:(未入力) と入力しました。
実行すると、「Invalid credentials!」(無効な認証情報です!)でエラーになりました。
セキュリティが強化されたのですね。
ハッカーはSQL Injection(Login Form)を利用して、意図的に安全でない脆弱なウェブアプリケーションbWAPPの攻撃方法を確認するのまとめ
このSQL Injection(Login Form)攻撃を防ぐためには、Webアプリケーションに対する入力を慎重に検証し、SQLクエリーに入力されるデータをエスケープする必要があります。
基本的には、SQL Injection(Login Form)の脆弱性のほとんどは対応されていると思います。
しかし、昨年に「大規模接種センターの新型コロナワクチン接種予約システム」にSQL Injectionの脆弱性が発見されたそうです。これからwebアプリを作成される方は十分注意してくださいね。
SQL Injection(Login Form)の操作は簡単にできるのですが「不正アクセス禁止法」に違反します。
「三年以下の懲役又は百万円以下の罰金に処する」ので、確認するならテスト環境を作成して行ってください。