WEBサイトに対してのCSRF攻撃で

ファイルをアップロードさせるような攻撃は可能でしょうか。
可能であれば仕組みと方法を教えてください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/03/25 11:06:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Sampo No.4

回答回数556ベストアンサー獲得回数104

ポイント100pt

No.3の方の解説には間違いがありますね。
file型input要素には、Javascriptからアップロードファイルを設定することができません。もちろんセキュリティ上の理由からの制限で、質問者様が危惧なさっているとおりの事態を避けるためのものです。

というわけで、HTML+Javascriptのみに限って言えばご質問のような攻撃は不可能です。FLASHが絡んだ場合のことはちょっと守備範囲外ですのでどなたかフォローを。

id:la-la-land

ありがとうございます。参考になりました。
今回Flashを組み込む予定はないので大丈夫だと思います

2013/03/25 11:07:13

その他の回答3件)

id:kamesuta No.1

回答回数2ベストアンサー獲得回数0

基本的にできません。
ファイルをアップロードするには、CGIなどのサーバーのプログラムが必要になります。(話それてるー!)
理由は、サーバーは、アクセス権限がないと入るのはできないからです。
CGIは、パーミッションと呼ばれる権限を持っているので大丈夫です。
サーバーにそのようなプログラムがあれば
htmlファイルを作って(テキストなんで、新規作成から新規テキストファイルをえらんで、拡張子を変える 拡張子の変え方は「http://ratan.dyndns.info/win/kakutyoushi.html」などを参考に)



↓テキスト(HTML)ファイル中身↓(自作)

<html><head><script type="text/javascript"><!--
set1=1000;//アクセスする間隔(ミリ秒 1000分の1秒) 小さくしすぎるとサーバーだけでなくPCやインターネット回線が.....
set2="http://ここは変えてね/";//URL (攻撃のまと)
set3=256;//ランダムで生成されるファイルの大きさ (大きくしすぎるとサーバーだけでなくPCやインターネット回線が.....
set4="POST";//メソッド、GETかPOSTがある
function on(){var dat="";for(var i=0;i<set3;i++){if(i<Math.sqrt(set3)) dat+="%0"+i.toString(16);else dat+="%"+i.toString(16);};var f=document.createElement("form");document.body.appendChild(f);f.action=set2;f.method=set4;f.target="at";var inp=document.createElement("input");f.appendChild(inp);inp.name="data";inp.value=dat;sub=function(){f.submit();};setInterval("sub()",set1);};
//--></script><title>保存テスト</title></head><body>
<a href="javascript:on();void(0);">アタック</a>
攻撃サイト<iframe src="" name="at" width="200" height="150">この部分はインラインフレームを使用しています。</iframe>
</body></html>

↑終わり↑


で、ブラウザで開いて、「アタック」をクリック!
ブラウザやパソコン、インターネット回線、(WEBサーバー)に迷惑をかけるので、自己責任で。

id:JULY

> ファイルをアップロードするには、CGIなどのサーバーのプログラムが必要になります。

CSRF ってどういう攻撃か、理解してますか?

CGI などの Web サーバサイドでプログラム側の欠陥(厳密に欠陥かどうかは、Web アプリケーションの仕様にもよるのですが)を突いて、罠サイトにアクセスすると、攻撃対象のサイトに POST するものを言います。

つまり、ファイルのアップロードを受ける Web サイトで CSRF に対する脆弱性を持つ Web サイトがすでに存在している、という状態で、罠サイトを用意して、ユーザが気づかないうちに、その脆弱性を持つサイトにファイルをアップロード出来るか、という話です。

詳しくは、「安全な Web アプリケーションの作り方」(通称:徳丸本)の 141 ページ以降を読んで下さい。

2013/03/20 08:13:18
id:la-la-land

enctype=multipart/form-data とかの設定は要らないのでしょうか。
書いてもらったプログラムと説明は、いまいちよくわかりませんでした。

2013/03/22 02:15:34
id:JULY No.2

回答回数966ベストアンサー獲得回数247

まじめに CSRF に対する対策を知りたいのであれば、IPA が公開している「安全なウェブサイトの作り方」の「1.6 CSRF(クロスサイト・リクエスト・フォージェリ)」を読んで下さい。
情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方
下手なブログ記事なんかよりも、しっかりとした対策内容が書いてあります。

ただ、この資料は CSRF の仕組み自体に関しては簡単にしか書かれていません。もし、その辺をしっかり学びたければ、通称:徳丸本と呼ばれる、下記の本を読むことをお薦めします。

id:sloto No.3

回答回数49ベストアンサー獲得回数6

Aさんがホームページを開設しました。
Bさんがホームページを訪問した瞬間、パスワードを記録したpasswd.txtがAさんのホームページのサーバにアップロードされました。

Aさんはどのような攻撃方法をとったのでしょうか。ということでしたら、

img src="upload.php"として、upload.php読み込み時に指定したファイルパスを持つファイルがある場合、
それをアップロードするようあらかじめパスを書き込んだjavascriptを用意し、これとjquery.uploadで行う。

とかでしょうね。

ただ狙ったファイルのパスがわからないことにはアップロードさせようがありません。
passwd.txtが読み込んだ人のPC内にあったとして、
c:\usr\passwd.txtにあるのかc:\var\www\html\jquery\passwd.txtはクライアント以外にわからないからです。

逆にアップロードさせるファイルのパスがわかるのであれば、セキュリティにもよりますができるでしょう。

id:Sampo No.4

回答回数556ベストアンサー獲得回数104ここでベストアンサー

ポイント100pt

No.3の方の解説には間違いがありますね。
file型input要素には、Javascriptからアップロードファイルを設定することができません。もちろんセキュリティ上の理由からの制限で、質問者様が危惧なさっているとおりの事態を避けるためのものです。

というわけで、HTML+Javascriptのみに限って言えばご質問のような攻撃は不可能です。FLASHが絡んだ場合のことはちょっと守備範囲外ですのでどなたかフォローを。

id:la-la-land

ありがとうございます。参考になりました。
今回Flashを組み込む予定はないので大丈夫だと思います

2013/03/25 11:07:13
  • id:rouge_2008
    可能だと思いますが、攻撃方法を問うのは、人力検索はてな利用ガイドラインの下記の項目に該当すると思います。
    キャンセルした方がいいのではないでしょうか?

    http://q.hatena.ne.jp/help/guideline
    ---------------------------------------------------------------
    2.下記のような迷惑行為・嫌がらせ行為を行ってはいけません
    vi.不快感を与える回答、公序良俗に反する回答を募る質問を投稿する行為

    3.下記のような公序良俗に反する行為を行ってはいけません
    i.倫理的に問題がある低俗、有害、下品な内容を投稿する行為、およびそのような内容の投稿を募る行為
    v.犯罪行為、違法行為を教唆する内容を投稿する行為、およびそのような内容の投稿を募る行為
  • id:la-la-land
    攻撃方法としくみを質問しましたが、悪質な目的があっての質問ではありません。
    攻撃方法をわからなければ対策方法を考えることができないと思ったからです。
    もちろん、ファイルアップロードの攻撃があるのであれば、対策方法を聞くのが一番ですが
    そういう攻撃自体を聞いたことがなかったので、あえてまず攻撃方法としくみを質問しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません