CodeZine(コードジン)

特集ページ一覧

Rubyを使ってWebアプリケーションの脆弱性を早期に検出する

Webアプリケーションファジングの仕組みと実装方法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/04/25 08:00

目次

Fuzzクラス

 図2にFuzzクラスのメソッドを示します。

  • target=……Fuzzの対象を設定します。"t"として設定できます。
  • payload……ファジングの負荷を格納する@payload変数を表示します。
  • loadfile……定義済みファイルからファジングの負荷を取得し、@payloadに設定します。
  • run……対象へのファジングを実行します。
  • result……最終結果の配列が格納されるインスタンス変数@resultへのハンドラを提供します。
図2 FuzzクラスのRDoc出力
図2 FuzzクラスのRDoc出力

 コードとその実行内容を詳しく見てみましょう。最初にFuzzのインスタンスを作成します。

>> fuzz = Fuzz.new
=> #<Fuzz:0x2bdc3cc @target=#<Target:0x2bdc37c @port="", @ip="",
 @response="", @request="">, @result=[], @payload=[]>
>>

 Fuzzのコンストラクタコードは次のようになっています。

# File webfuzz.rb, line 50
  def initialize()
    @payload = []
    @result = []
    @target = Target.new()
  end

 ここでは2つの配列を作成しています。ファジングのペイロード用の@payloadと、すべての結果を格納する@resultです。また、Targetクラスのインスタンスを格納する@targetも定義しています。

 Fuzzクラスのインスタンスを定義したら、対象を次のように指定できます。

>> fuzz.target=t

 次に、ファジングの負荷を設定します。例えばSQLインジェクションの"id"パラメータをファジングする場合は、一重引用符(')、二重引用符(")、1+or+1=1などの値を送信する必要があります。次のようにloadfileメソッドを使ってファイルから値を読み込み、@payload変数に渡します。

# File webfuzz.rb, line 60
  def loadfile(file)
    File.open(file,'r') do |temp|
      while line = temp.gets
        @payload.push(line.chomp)
      end
    end
  end

 ここではファイルを開き、イテレータを使って@payload配列に値を追加しています。ファイルの各行がファジングの負荷として読み込まれ、@payloadに代入されます。「sqlfuzz」というファイルがあるとしましょう。このファイルを読み込むには次のようにします。

>> fuzz.loadfile("sqlfuzz")
=> nil
>> fuzz.payload
=> ["'", "\"", "1+or+1=1", ""]
>>

 ここではファジング用に3つの文字列を読み込んでいますが、大きなファイルを読み込んで対象に実行することもできます。

 次にrunメソッドを見てみましょう。このメソッドは対象へのファジングを開始します。次のコードのrunメソッドは、cloneメソッドを使ってTargetのインスタンスを複製します。

# File webfuzz.rb, line 68
  def run
    @payload.each do |attack|
      temp = @target.clone
      temp.request = temp.request.sub("$fuzz$",attack)
      temp.send
      @result.push(temp)
    end
  end

 次に、@payload配列の各要素を取得し、要求文字列で渡した$fuzz$に置き換えます。ネットワーク経由で要求を送信すると、応答がインスタンスの@response変数に格納されるので、"temp"を結果配列に書き込みます。次のコマンドを使うと、@payloadの各要素が送信されるまで、これがループ処理で実行されます。

>>fuzz.run

 ループ処理によってファジングの負荷がすべて送信された後は、次のコマンドを使って結果を確認できます。

>>fuzz.result[0].show

 または、次のメソッドで応答のみを確認することもできます。

>> fuzz.result[0].response
=> "HTTP/1.1 500 Internal Server Error\r\nServer: Microsoft-IIS/5.0\r
\nDate: Thu, 28 Dec 2006 06:21:58 GMT\r\nX-Powered-By: ASP.NET\r\nCon
nection: Keep-Alive\r\nContent-Length: 4531\r\nContent-Type: text/htm
l\r\nExpires: Thu, 28 Dec 2006 06:21:58 GMT\r\nSet-Cookie: ASPSESSION
IDACBRRQTB=HCGJELKBPBGDPJOOGEHOPEOK; path=/\r\nCache-control: private
\r\n\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">
\r\n\r\n<html dir=ltr>\r\n\r\n<head>\r\n<style>\r\na:link\t\t\t{font:
8pt/11pt verdana; color:FF0000}\r\na:visited\t\t{font:8pt/11pt verdan
a; color…………

 このブロックには、最初の要求に対応する要求と応答のセット全体が表示されています。同様に、すべての結果を表示することができます。この結果配列を操作して、SQLの潜在的な脆弱性を示す特定のパターンを探すことができます。

 例えば、対象から返されたすべての応答の中に特定の正規表現パターンが含まれていないかどうかをチェックできます。"odbc"という文字列を探すには、irbで次のコマンドを実行し、/odbc/i(大文字と小文字を区別しない)を指定してすべての応答をチェックします。

>> i=0
=> 0
>> while (i<fuzz.result.length)
>> if(fuzz.result[i].response =~ /odbc/i)
>> puts "SQL injection vulnerability at Index[#{i}]"
>> end
>> i += 1
>> end
SQL injection vulnerability at Index[0]
SQL injection vulnerability at Index[1]
=> nil
>>

 インデックス0と1にこの脆弱性が存在します。これで、この2つの要求を詳しく調べると同時に、脆弱でないすべてのインスタンスを配列から削除することができます。

 さらに、dumpメソッドを使うとファジングブロック全体をファイルに書き込むことができます。これにより、Rubyを利用してirbで対話式のファジングを実行できます。

 また、次のように「webfuzz.rb」フレームワークを実行するスクリプトを書くこともできます。

require 'webfuzz'

t = Target.new
t.ip = "webshop.example.com"
t.port = 80
t.request = "GET /dvds4less/details.asp?id=$fuzz$ HTTP/1.0\r\n\r\n"

fuzz = Fuzz.new
fuzz.target = t
fuzz.loadfile("sqlfuzz")
fuzz.run

i=0
while (i<fuzz.result.length)
  if(fuzz.result[i].response =~ /odbc/i)
    puts "SQL injection vulnerability at Index[#{i}]"
    puts "Vulnerable request=>"
    puts fuzz.result[i].request
  end
  i += 1
end

 このスクリプトを実行すると、コンソールに次のような結果が表示されます。

D:\webfuzz> detail_fuzz.rb
Loading the library ...
Library loaded
SQL injection vulnerability at Index[0]
Vulnerable request=>
GET /dvds4less/details.asp?id=' HTTP/1.0

SQL injection vulnerability at Index[1]
Vulnerable request=>
GET /dvds4less/details.asp?id=" HTTP/1.0

 これにより、さまざまな範囲の文字列を使ってHTTP要求をファジングし、脆弱性を検出できます。

アプリケーションの安全でない動作の検出

 Webファジングは、脆弱性の検出に有効な興味深い手法です。アプリケーションの脆弱な動作、つまり開発者にとって予想外で、攻撃者に悪用されかねない動作が明らかになります。可能な限りのファジング文字列が含まれる大きなファイルを作成して対象に送信し、任意のアプリケーションコンポーネントを標的にすることができます。本稿ではSQLインジェクションの脆弱性について簡単に触れましたが、さらに多くの文字列をファイルに追加することもできます。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

著者プロフィール

  • Shreeraj Shah(Shreeraj Shah)

    Net-Squareの創設者で取締役。『Web Hacking: Attacks and Defense』(Addison Wesley刊)の共同執筆者。HackInTheBox、RSA、Blackhat、Bellua、CII、NASSCOMをはじめとする会議で講演を行う。

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5