第5話 XSS

「おや、またあんたかい?」


 恰幅の良い、愛嬌のある作ったような笑顔のおばちゃん再びである。


「買い取れるものがないか見てほしいんだ……」


 そういって、カバンから雑多な訳の分からないものを出して並べる。


・コエルロサウラヴスの羽

・ヘリコプリオンの歯

・クセナカンタスの角

・ワーゲノコンカの殻

・ディクロイディウムの枝

などなど……。


「こりゃ、なんだい? あんた、詐欺師にでも騙されてガラクタを買わされたんじゃないだろうね?」


 うっ。バッファオーバーフローでアイテム増殖ができたと思ったら袋の中にあった銅貨を潰してしまったとは言えないが、金を失ってガラクタを手に入れたという点では大体似たようなもんだろう。博打で素寒貧すかんぴんのろくでなしが、なけなしの金で詐欺師にガラクタを掴まされた風の目で見られているのがツライ。


「ふーん? このエダフォサウルスの帆とやらはなかなかいい革ねえ。これなら買ってあげてもいい。大きさも1ヤードはあるし、そうね。3アスでどう?」


「買ってくれるのか!?」


「これだけ。他のは買えないね。一体どこでこんなガラクタ仕入れてきたんだい。この枝なんて別に薬草というわけでもなさそうだし。薪にしかなりゃしないじゃない」


「わかった、わかった。勘弁してくれ。この革なら買ってくれるんだな!?」


「ええ。売るの? 売らないの?」


「実はたくさんあるんだ! 何枚買ってくれる!?」


 おばちゃんの作り物の笑顔が剥がれ落ちていた。すったもんだで随分と値切られたが2ダースを60アスで商談成立と相成った。




「はい、1セステルティウス」


 雑貨屋のおばちゃんの後、薪を扱っている店をみつけたのでディクロイディウムの枝とやらを買えるか打診してみたところ、薪として買ってくれるというので、一山売って1セステルティウス (=16アス) を手に入れた。森に入って薪拾いをするよりは楽ではあるものの、正直、換金効率はあまりよくない気がする。


 ゲームであれば最終盤で手に入るような場違いなアイテムでも田舎町の道具屋がどこからともなく大金を持ち出して無条件に買い上げてくれるもんだが、ゲームなんだかリアルなんだかわからないこの世界ではNPCノンプレーヤーキャラクターといえども普通にこちらの様子を伺ってくるし、前回の取引のことも覚えている。あんまり不自然なものは買ってはくれないし、出すところに出せばべらぼうな値が付くものだとしても、そんな金を田舎のいち店主がだせるわけがない。


 アイテム増殖には可能性を感じつつも、文字を入れては何のアイテムに化けるかを試しつつ売れそうなものを探す作業は地味で、これはもはやチートなんてものではなく普通に労働なのでは? という気持ちにすらさせるものだった。


 翌日も頭陀袋ずだぶくろのバグで生み出したアイテムを見てもらいに行ったが


「またあんたかい? どっからこんな怪しいもの手に入れてるのか知らないけどね。いい加減におし。こっちもあんまり妙なものを買うわけにはいかないの。これが盗品とかならこっちだってただじゃ済まないんだからね」


 ようやく探り当てた金属系素材の『古びた釘』を売ろうとしたところで釘を刺された。この町には長居をするとなんとなく怪しいというだけの理由でしょっぴかれそうな気がした。




 冒険者ギルド。それは何でも屋の組合にちょっと格好いい名前の看板を掲げて組合員にちょっとイケてる気分を味わせてメンバー獲得を目論んだものである。


 その冒険者ギルドの前を通りかかると、掲示板には所狭しと依頼が張られていた。その依頼書、強調やら色付けやらレイアウトやら、どうにもWebページのようなHTML臭さを感じるデザインであった。これは冒険者ギルドの職員が書いてるんだろうか?


 少し気になって、冒険者ギルドに入ると依頼書を出すにはどうするのかを聞く。所定の紙に記載して提出すると、魔法で自動的にレイアウトされて依頼書の書式になるのだそうだ。ほほう。これは面白そうだ。試してみるか……?


<script type="text/javascript">window.setTimeout(function(){alert(document.body.innerHTML);});</script>


 そんなスクリプトを用紙に記入していく。とはいえ、それだけだと意味不明すぎるのでダミーの依頼を書いてそこにスクリプトを忍ばせることにした。


 受付のお姉さんは内容を確認もせずに魔道具に用紙を放り込むと、出てきた紙とピンをこちらに渡し


「適当に張っておいてください」


 とそっけない。わりと雑なシステムだなあと思いつつ、用紙に目をやると、見事用紙にはダイアログが表示されていた。


 依頼書部分の実装はHTMLで確定だ。しかもエスケープがされていなくてScriptタグを使ってJavaScriptのコードを書き込めばブラウザ上でそのまま実行されてしまう。どうにも作りが雑だな、このシステムは。


 大真面目にGUIを作るのは大変だが、HTMLを表示させるパーツを使うと、文字や画像のレイアウトをタグを含んだ文字列だけで簡単に行うことができる。そのため、ゲームのようなシステムでも「お知らせ」のような部分にはHTMLの表示機能が使われることがある。この世界では冒険者ギルドの依頼書にHTML表示機能が用いられており、しかもセキュリティがザルだということだ。


 先のスクリプトで何が出てくるかというと、この依頼書のHTML全体のコードだ。ChromeのようなWebブラウザならソースコードを見ることはたやすいのだが、なんせゲーム世界である。HTMLのソースコードを見る機能なんてわざわざ用意されていない。そのHTMLのソースコードを見ることで、次の攻撃の足掛かりを掴むわけだ。


 こいつはじっくり解析しよう……。HTMLの表示された依頼書を頭陀袋ずだぶくろに入れると冒険者ギルドを後にした。


----------


 アイテム増殖技を見つけたとはいえ、なかなか攻略に役立つものを得られず苦労していますね。この手のバグはゲーム内のメモリの使われ方を探ることができてなかなか面白いです。


 HTMLにユーザーの入力値を表示するようなケースでは注意が必要です。<や>をそのまま出力してしまうとHTMLのタグとして機能してしまい、JavaScriptを送り込まれると表示したほかのユーザーのブラウザ上で任意のJavaScriptが動かされたりすることがおきえます。この辺をアレコレしていろいろできたりするのですが割愛。この攻撃はクロスサイトスクリプティング(XSS)と呼ばれています。これを無効化させるために<や>を&lt;や&gt;といった実体参照に置き換えます。


 カクヨムのシステムは流石にこの辺りはちゃんとしていて、この本編の記述で大変なことが起きたりはしません。


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る