web-dev-qa-db-ja.com

画像にJavaScriptを隠す

私は thehackernews の投稿を読み、ネットを検索してそれがどのように機能するかを見つけました。

画像が表示されたときにスクリプトを実行できるように、画像にjavascriptを追加するにはどうすればよいですか。

これは他の言語でも可能ですか?

7
user38257

リンクした記事では、JavaScriptコードは画像ファイル自体に含まれていません。画像を参照するHTMLページ内に表示されています。信頼できない入力は、十分な検証またはサニタイズなしでイメージタグ内に返されます。これは 永続的なクロスサイトスクリプティング です。誰かがこの画像を含むページを表示するたびに悪意のある入力が返されるためです(つまり、おそらくユーザーのプロファイルの一部としてデータベースに保存されています)。

従来、プロフィール写真を含めるためのHTMLマークアップは次のようになります。

_<img src="/imagename.jpg">
_

ただし、ユーザーごとに異なる必要があるため、それを生成するアプリケーションコードは次のようになります(例:PHP)。

_<img src="/<?=$imagename?>">
_

したがって、ユーザーAliceが_alicespic.jpg_をアップロードした場合、ユーザーが彼女のプロフィールにアクセスしたときに、その画像が表示されます。ただし、イメージ名が適切に検証またはサニタイズされていない場合、この場所で脆弱性が発生する可能性があります。

たとえば、マロリーがプロファイルの画像名をinncoent.jpg" onload="alert(1)に設定できた場合、次のHTMLマークアップが生成されます。

_ <img src="/inncoent.jpg" onload="alert(1)">
_

Onloadイベントを利用すると、画像の読み込みが完了すると、任意のスクリプトが実行されます。基本的に、このJavascriptコードは、影響を受けるプロファイルが表示されるたびに実行されますが、そのブラウザ内で実行されます。

これは、開発者が画像名の中に安全な文字のみを含めることを許可した場合は発生しません。

7
itscooper

これを行うには2つの方法があります。1つ目は、スクリプトをテキストファイルに記述して、jpgとして保存することです。これは明らかに画像ではありませんが、機能します。実際の画像が必要な場合は、画像を取得し、hexeditorを使用してスクリプトを画像メタデータに追加できます。これは、ブラウザが画像をHTMLにレンダリングしようとするときにコードを解釈するためです。

画像は、カメラモデル、解像度、フラッシュなどの画像に関する情報を含むEXIFと呼ばれるヘッダーを使用します。このヘッダーにスクリプトを挿入できます。アプリケーションが画像メタデータを表示している場合は、代わりにスクリプトが表示されます。詳細については this リンクを確認してください。これは、JavaScriptの代わりにPHPコードを挿入していますが、考え方は同じです。

2
Kotzu

編集:itscooperの答えは、私の意見では、質問がリンクされているTHN記事の脆弱性の正しい解釈です。以下の答えは、jsを非表示にし、画像オブジェクト内で実行させる方法に関する一般的な質問に対するものです。

歴史的に、「javascript:」URLを画像ソースとして挿入することで、一部のブラウザーをXSSできました。これは、ブラウザーが自動的にスクリプトを実行するためです( https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Image_XSS_using_the_JavaScript_directive )。驚くべきことに、JavaScriptはサンドボックス化されており、ページオブジェクトへのアクセス権はありませんが、Firefoxでも同様です。それでも、メインスレッドをフリーズする未終了のループを実行することにより、DOSページの読み込みに使用できます。このバグをMozillaに報告しましたが、まだ修正されていません: https://bugzilla.mozilla.org/show_bug.cgi?id=924252

1
Yan Z