japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2007年6月26日 10:00
デベロッパー・バックナンバー
Rubyを使ってWebアプリケーションの脆弱性を早期に検出する

著者: Shreeraj Shah  オリジナル版を読む プリンター用 記事を転送
2007年6月26日 10:00 付の記事
海外internet.com発の記事
このエントリーを含むはてなブックマーク この記事をクリップ! Buzzurlにブックマーク Yahoo!ブックマークに登録 newsing it!

はじめに

 Webアプリケーションファジング(fuzzing)とは、運用システムに導入する前にWebアプリケーションの脆弱性を検出する手法です。この手法では、いくつもの不正な要求をアプリケーションに送信し、返される応答に基づいてアプリケーションのセキュリティの状態を判断します。また、SQL、XPATH、LDAPインジェクションなどのさまざまな種類の攻撃ベクトルや、エラー処理に関するテストを実施するためにファジングを利用することもできます。

 本稿ではRubyコードを使ってWebアプリケーションファジングの仕組みを説明し、その実装方法を示します。例に示すコードはフレームワークの叩き台になるので、これを基に高度なファジングソフトウェアを構築することができます。本稿で説明する内容は次のとおりです。

  • HTTP要求を使ったWebファジングの手法
  • Rubyファジングフレームワークの使い方
  • irb(interactive Ruby)をWebファジングに利用する方法
  • Rubyでファジング用のオブジェクトを定義する方法
  • ファジングによって脆弱性を検出する方法

Webファジングの概要

 Webアプリケーションファジング(フォールトインジェクション)は、さまざまな想定外の値をアプリケーションの入力として渡し、その応答に基づいてアプリケーションの動作を評価する手法です。Webファジングは明確な目的を持って、HTTPまたはHTTPS経由で実行されます。これにより、Webサーバー、アプリケーションサーバー、またはWebアプリケーションコードにかかわる脆弱性が明らかになります。

 HTTPプロトコルには、ヘッダーとデータバッファの2つのセクションがあります。ヘッダー情報には、メソッド、URI、およびプロトコルバージョンのパラメータと共に属性と値のペア(Cookie、Referrer、Hostなど)が含まれます。データバッファはPOST要求の一部で、情報が特定の"Content-Length"と共にアプリケーションに渡されます。これらの値とパラメータを、次のようなさまざまな値の組み合わせを使ってファジングすることができます。

  • データ型ファジング
  • ……integer、string、floatなどを渡す
  • さまざまなバッファサイズを使ったファジング
  • メタ文字ファジング
  • ……二重引用符、#、$などの値を渡す
  • 脆弱性特有のシグニチャ
  • ……SQL、XPATH、XQuery、XSSの各インジェクションをテストする
  • ブルートフォースによる資格証明を使ったファジング
  • ……ユーザーとパスワードの値をブルートフォースする
  • さまざまなコーディング規約を使ったファジング

 ロジックと実装に応じて、このようなファジング負荷(fuzz load)をWebサーバー、アプリケーションサーバー、データベース、およびアプリケーションコードのさまざまな部分に適用します。返される応答を調べることにより、脆弱性を検出することができます。いずれかのコンポーネントが脆弱な場合は、応答にサーバーコンポーネントのシグニチャが含まれることさえあります。

 Webアプリケーションのセキュリティを評価するすべての手法は、ブラックボックスとホワイトボックスのどちらかに分類できます。ブラックボックスの評価は「ゼロ知識」(zero knowledge)で行われるのに対し、ホワイトボックスの評価はソースコードと導入の設定に完全にアクセスできる状態で行われます。効果的なファジングを行うことで、ブラックボックス手法による脆弱性の検出が可能になります。

Rubyを利用したフレームワークの構築

 Rubyは有用なファジングフレームワークの構築に利用できる強力なスクリプト言語です。本稿ではフレームワークの最初のフェーズのみを扱いますが、これを土台にしてより高度なライブラリを構築することができます。フレームワークの言語にRubyを使用することには、次のような利点があります。

  • 言語のサポート環境を整えれば、複数のプラットフォーム間で利用できる。
  • オブジェクト指向言語なので、オブジェクト指向プログラミングの特徴を活かしてフレームワークの柔軟性を高めることができる。
  • ソケットとライブラリでHTTPとHTTPSをサポートしている。
  • 対話型シェルを利用して効果的な対話式のファジングを実行できる。

 実際のRubyコードのファイル「Webfuzz.rb」をリスト1に示します。このファイルには、Webファジングを実装する次の2つのクラスが含まれています。

  1. Target……ファジングするIPアドレス、ポート、および要求を指定するために必要
  2. Fuzz……さまざまなペイロードの送信要求をファジングするメソッドが含まれる/結果配列のインターフェイスを提供する

 この2つのクラスを使ってファジングのロジックを作成し、個々の要求に合わせてカスタマイズしたファジングの負荷を提供できます。それぞれのクラスを詳しく見ていくことにしましょう。

リスト1 Webfuzz.rb
require ’socket’
puts "Loading the library ..."
class Target
  def initialize()
    @ip=""
    @port=""
    @request=""
    @response=""
  end

  def ip=(newip)
    @ip = newip
  end

  def port=(newport)
    @port = newport
  end

  def request=(newrequest)
    @request = newrequest
  end

  def response
    @response
  end

  def request
    @request
  end

  def show
    puts "---------------------"
    puts "ip =>"+@ip
    puts "port =>"+@port.to_s
    puts "request =>"
    puts @request
    puts "response =>"
    puts @response
    puts "---------------------"
  end

  def send
    s = TCPsocket.open(@ip,@port)
    s.write(@request)
    @response = s.read
  end
end

class Fuzz
  def initialize()
    @payload = []
    @result = []
    @target = Target.new()
  end

  def target=(newtarget)
    @target = newtarget
  end

  def loadfile(file)
    File.open(file,’r’) do |temp|
      while line = temp.gets
        @payload.push(line.chomp)
      end
    end
  end

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

  def dump(file)
      f = File.open(file,’w’)
      @result.each do |res|
       f.write("===
")
       f.write(res.request)
       f.write("###
")
       f.write(res.response)
       f.write("===
")
      end
      f.close
  end

  def target
    @target
  end

  def result
    @result
  end

  def payload
    @payload
  end
end
puts "Library loaded"

Targetクラス

 Targetクラス(図1のRDoc出力を参照)は、重要なパラメータを設定する次のメソッドを提供します。

  1. ip=……対象のIPアドレスを設定する
  2. port=……対象のポートを設定する
  3. request=……ファジング用のHTTP要求を設定する
図1 TargetクラスのRDoc出力
図1 TargetクラスのRDoc出力

 ご覧のように、これらのメソッドはすべて=演算子で終わります。newはコンストラクタを示します。「webfuzz.rb」コードのip=メソッドは、次のようにパラメータを受け取り、それを@ipインスタンス変数に設定します。

# File webfuzz.rb, line 11
  def ip=(newip)
    @ip = newip
  end

 他の2つのメソッド、port=request=も同じような働きをします。

 次の「webfuzz.rb」コードは、オブジェクトの形式でクラスのインスタンスを初期化し、4つの変数を作成します。

# File webfuzz.rb, line 4
  def initialize()
    @ip=""
    @port=""
    @request=""
    @response=""
    end

 残りの2つのメソッド、requestresponseは、それぞれHTTPファジング要求と、その応答のプレースホルダです。

 最後に、sendメソッドには、ネットワーク経由で要求を「投げ」て、対象からの応答を取得するコードが含まれます。

# File webfuzz.rb, line 42
  def send
    s = TCPsocket.open(@ip,@port)
    s.write(@request)
    @response = s.read
    end

 この非常に簡潔なコードがソケットライブラリを使ってTCPコネクションを開き、サーバーに要求を送信し、応答を待機して@response変数に応答を代入します。

 従って、Targetの各インスタンスは独自のIP、ポート、および要求を持ちます。sendメソッドを使用して、アクセス、対象の指定、およびresponse変数への書き込みを行うことができます。また、インスタンスのすべての変数を表示できるshowというメソッドもあります。

 Targetクラスの使い方を簡単に見てみましょう。Rubyには、irbという独自の対話型プロンプトがあります。irbを使って対話式の評価を行うには、次の手順に従います。

  1. irbセッションを開き、requireディレクティブを使って「webfuzz.rb」を読み込みます。
  2. D:webfuzz> irb --simple-prompt
    >> require ’webfuzz’
    Loading the library ...
    Library loaded
    => true
    
    「webfuzz.rb」が置かれているディレクトリでirbを実行してください。「webfuzz.rb」と入力する必要はありません。webfuzzだけで十分です。
  1. ライブラリが読み込まれると、クラスを使って対象を指定し、ネットワーク経由でごく基本的な要求を送信できるようになります。例として、次のURLを対象に指定します。
  2. http://webshop.example.com/dvds4less/details.asp?id=1
    変数"id"をファジングするとしましょう。この変数はWebショップアプリケーションの整数値を格納します。対象の設定を次のように作成します。
  1. 対象のオブジェクトを作成します。
  2. >> t = Target.new
    => #<Target:0x2be93d8 @port="", @ip="", @response="", @request="">
    
  1. ipに"webshop.example.com"を指定します。
  2. >> t.ip = "webshop.example.com"
    => "webshop.example.com"
    
  1. portに80を指定します。
  2. >> t.port = 80
    => 80
    
    オブジェクト"t"の中身は次のようになります。
    >> t
    => #<Target:0x2be93d8 @port=80, @ip="webshop.example.com",
     @response="", @request="">
    
  1. TargetクラスのGET要求を設定します。変数"id"をファジングするので、値として"$fuzz$"を挿入します。
  2. >> t.request = "GET /dvds4less/details.asp?id=$fuzz$
     HTTP/1.0
    
    "
    => "/dvds4less/details.asp?id=$fuzz$ HTTP/1.0
    
     "
    
    これにより、irbでt.sendコマンドを実行し、sendメソッドを使ってネットワーク経由で要求を送信できるようになります。また、t.showコマンドを使うとクラスインスタンス全体を表示することができます。これでファジング対象の準備はすべて整いました。

 今度はFuzzクラスを見てみましょう。このクラスはTarget(この例では、先ほど定義した対象)を使ってWebファジングを実行します。次のセクションで、Fuzzクラスが"$fuzz$"の値を読み取って処理する仕組みを示します。

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
Server: Microsoft-IIS/5.0

Date: Thu, 28 Dec 2006 06:21:58 GMT
X-Powered-By: ASP.NET
Con
nection: Keep-Alive
Content-Length: 4531
Content-Type: text/htm
l
Expires: Thu, 28 Dec 2006 06:21:58 GMT
Set-Cookie: ASPSESSION
IDACBRRQTB=HCGJELKBPBGDPJOOGEHOPEOK; path=/
Cache-control: private



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">


<html dir=ltr>

<head>
<style>
a:link{font:
8pt/11pt verdana; color:FF0000}
a:visited{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

"

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インジェクションの脆弱性について簡単に触れましたが、さらに多くの文字列をファイルに追加することもできます。

著者紹介

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


関連記事
  • CodeGear、「Ruby on Rails」向け IDE βテストを開始
  • 民間刑務所で Ruby によるソフトウェア開発者を養成、アウトソーシング業務を
  • ジャスダック女性経営者の SNS は Ruby on Rails による「Looops SNS」
  • OSJ など Ruby トレーニングコースを体系化、Ruby 入門や Agile 開発まで販売
  • Sun と NetBeans コミュニティ、Ruby と JRuby のサポートを発表


  • 関連テーマ
  • Ruby
  • Microsoft
  • IIS


  • ★最新トップニュース
    海外 ネットワークの基本―IP アドレスを理解する(LinuxToday 7月25日 11:00)
    ネットワークは、アドレスがなければ機能しない。何かを送信する時は、送信先と送信元を指定する必要がある。
    コラム メディアのニーズ 〜アフィリエイトに対する思い〜(Webマーケティング 7月25日 10:00)
    アフィリエイト広告は、広告費用に対するリスクが最小限である反面、成果の想定がつきにくいというデメリットを持っている。これは一概に、広告主だけに該当することではなく、アフィリエイト広告を運用する媒体側でも同様のことが言える。
    コラム Blu-ray がノート PC でも快適に!インテル「Centrino 2」(Webテクノロジー 7月25日 10:00)
    ソニーの VAIO をはじめレノボの ThinkPad など、ノート PC の夏モデルが各社から一斉に発表された。2008年夏モデルの大きな特徴はインテルのプラットフォーム「Centrino 2」を採用したことだろう。今回は、ノート PC の夏モデルで初めて登場した「Centrino 2」についてみてみよう。
    コラム Visual C++ 2008 Feature Pack: MFCの強化 (2)(デベロッパー 7月25日 10:00)
    [中級] Visual C++ 2008 Feature Packでの配列・正規表現・関数オブジェクト
    国内 ネットワーク入門:IP アドレスを理解する――基本の習得画像のある記事(LinuxTutorial 7月25日 10:00)
    ネットワークはアドレスがなければ機能しない。何かを送信するときは、送信先と送信元を指定する必要がある。今回はIPアドレスの基本の理解に努める。
    トピックス
    > オススメのIT系求人情報【毎週月曜日更新】
    footer_301.gif


    リサーチ
    > デイリーリサーチDLサイト
    > OnlineResearchPortal (リサーチデータバンク)
    > モバイルリサーチ with goo
    footer_301.gif
    キーワード
    > iPhone > Youtube
    > Google > モバイルノート
    > 半導体 > ウィルコム
    > テーマ一覧はこちら
    footer_301.gif
    セミナー情報
    > 第1回インターネットコムマーケティングセミナー「新規クライアントを効率的に獲得する Web マーケティング手法とは」(3月26日)多数のご参加ありがとうございました
    footer_301.gif
    デベロッパー
    > DevX
    > CodeGuru
    > developer.com
    footer_301.gif
    日本Oracle
    footer_301.gif
    j.i.c.ブログ
    ブログ一覧
    データメーション 【データメーション】
    本物のスパム王様はお名乗り出ください(7月24日)
    Graphic Design Forum 【Graphic Design Forum】
    興味深い(?)90年代 (7月24日)
    エンジニアの独り言 【エンジニアの独り言】
    新入社員が配属される季節ですね。(7月23日)
    ジュピターメディア創設者がITを斬る 【ジュピターメディア創設者がITを斬る】
    Alan を探せ(7月18日)
    ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
    「『訪問歯科診療』のパイオニア」/デンタルサポート株式会社(7月15日)
    デスマーチからの脱却 【デスマーチからの脱却】
    mod_rewriteを使ったiPhone対応(7月12日)
    footer_301.gif
    最新コラム一覧
    CodeGuru CodeGuru

    Visual C++ 2008 Feature Pack: MFCの強化 (2)(7月25日)
    最新アフィリエイト事例にみる成功の法則 最新アフィリエイト事例にみる成功の法則

    メディアのニーズ 〜アフィリエイトに対する思い〜(7月25日)
    最新ハイテク講座 最新ハイテク講座

    Blu-ray がノート PC でも快適に!インテル「Centrino 2」(7月25日)
    百式のネットビジネス研究 百式のネットビジネス研究

    究極にシンプルなタスク管理ツール「now do this」(7月25日)
    週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

    ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(7月24日)
    IT マネジメント IT マネジメント

    Google Trends で見る IT のトレンド(7月24日)
    ハードウェアから見たデータベース ハードウェアから見たデータベース

    表計算ソフトの計算を支える仕組(7月24日)
    「IT の耳」 「IT の耳」

    【書評】ネットオークションで騙す。―全米を揺るがした絵画詐欺犯の告白―(7月24日)
    検索エンジンマーケティング 検索エンジンマーケティング

    ピンポイントマーケティングにおける P4P(検索連動型広告)の“当たり前”(7月24日)
    Eメールマーケティング事情 Eメールマーケティング事情

    大量送信のスパムからターゲット絞り込みスパムメールへ(7月23日)
    footer_301.gif
    専門チャンネル
    > セキュリティチャネル > テレコムチャネル
    > サーチエンジンウォッチ
    footer_301.gif
    海外のインターネットコム アメリカ韓国ドイツトルコ
    関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
    Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
    space.gif space.gif