【注意】このサイトに記載されていることを他人に試すことは「不正アクセス禁止法」に該当する場合があります。詳しくはこちらから

ハッカーはSQL Injection(Login Form)を利用して、意図的に安全でないウェブアプリケーションbWAPPを攻撃して脆弱性を確認する

ペネトレーションテスト&バグバウンティ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)の操作は簡単にできるのですが「不正アクセス禁止法」に違反します。
「三年以下の懲役又は百万円以下の罰金に処する」ので、確認するならテスト環境を作成して行ってください。