Skip to content

Instantly share code, notes, and snippets.

@hakatashi
Last active August 29, 2015 14:23
Show Gist options
  • Select an option

  • Save hakatashi/9c76bc400911f71c4fac to your computer and use it in GitHub Desktop.

Select an option

Save hakatashi/9c76bc400911f71c4fac to your computer and use it in GitHub Desktop.
セキュキャン2015 応募用紙 問題9

セキュキャン2015 応募用紙 問題9

以下のコードは、与えられたテキスト内からURLらしき文字列を探して、それらを<a>要素でリンクにしたHTMLを生成するJavaScriptの関数であるとします。攻撃者が引数 text の中身を自由に制御可能な場合、このコードにはどのような問題点があるか、またこのコードを修正するとすればどのようにすればよいか、自分なりに考察して書いてください。

function makeUrlLinks( text ){
 var html = text.replace( /[\w]+:\/\/[\w\.\-]+\/[^\r\n \t<>"']*/g, function( url ){
   return "<a href=" + url + ">" + url + "</a>";
   } );
 document.getElementById( "output" ).innerHTML = html;
}
  1. そもそもURLの有無にかかわらず、入力されたtextをエスケープせずinnerHTMLに突っ込んでいるため、XSS脆弱性が存在する。例えば、<script>alert(1)</script>のような文字列を入力することにより、任意のコードが実行される可能性がある。
  2. スキーム名の検査をしていないので、javascriptスキームによるURLを埋め込まれ、任意のコードが実行されるXSS脆弱性が存在する。例えば、javascript://&#x2028;alert(1)//のような文字列を入力することにより、任意のコードを実行される可能性がある。
  3. 属性値を引用符で囲んでいないので、空白文字の挿入により他の属性を挿入できるXSS脆弱性が存在する。空白文字については正規表現で検査されているが、\f(U+000C)が弾かれていない。よって例えば、http://xss/ onclick=alert(1)のような文字列(onclickの前に\fが挿入されている)を入力することにより、任意のコードを実行される可能性がある。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment