脆弱性"&'<<>\ Advent Calendar 2016の24日目の記事です。
おちゃのこネット
ネットショップのシステムを提供するサービス。「おちゃのこネットは15000店以上に利用されています」というサービスに脆弱性があると、15000店以上のサイトに脆弱性があることになるので怖い。
XSS。ページタイトルに表示される検索キーワードがエスケープされていなかった。
<head>
<title>
<script>alert(location)</script>
</title>
</head>
ではスクリプトは動作しないらしい(サンプル)。</title><script>alert(location)</script>
と一旦閉じてやると当然動く。脆弱性が無いか確認するときに、単純に<img src=x onerror=alert(0)>
などを入力するだけだと見落とすのかもしれない。
「おちゃのこネット」を使っているサイトで見つけて、「おちゃのこネット」の脆弱性としてIPAに報告したけど、「複数のウェブサイトの脆弱性について記載されていた」という扱いで、「おちゃのこネット」と使っているサイトで、取り扱い番号が2個発行された。
DLsite.com
脆弱な部分は下記の通り。HTMLのエスケープを解除したかったらしい。
<script type="text/javascript">
//<!CDATA[
jQuery(function($){
$('input#search_text').val($('<div>\x3cimg src=x onerror=alert(location)\x3e</div>').text());
jQueryの$
の引数にタグを含めることができるとスクリプトが動かせる。この部分を正しく動かすためには、HTMLのエスケープをした後に、JavaScriptの文字列としてのエスケープをする必要がある(さらに</script>
という文字列が含まれないようにしないとならないが、<
と>
は最初のHTMLのエスケープで消えるはず)。これは<script>
タグの中だけど、もし、onsubmit
などの属性値の中に移動するならば、さらにHTMLのエスケープをする必要がある。JavaScriptを動的に生成するのは止めましょう。条件が複雑すぎるからか、\
でエスケープしていると、ChromeのXSS Auditorも守ってくれない。
ページのロード時に常にこの処理が実行されるならば、単にinput#search_text
のvalue
に出力すれば良かったのに、どうしてこんなことに……。今はinput#search_text
に出力されるようになっている。
ジーカツ
http://g-katsu.com/
「18歳以上ですか?」みたいな注意書きは出てこないけど、たぶんアダルトサイトなので閲覧注意。
検索キーワードに'
が含まれていると、下記のSQLエラーが出ていた。やばい。
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%" OR description LIKE "%"%")' at line 3
今は503エラーが返るようになっている。どうせなら'
が含まれていても検索できるようにしてくれれば良いのに。
この脆弱性は対応がとても速かった。
- 2016年5月16日 6時29分 届出
- 2016年5月16日 10時56分 届出情報受信の連絡
- 2016年5月16日 11時26分 届出情報受理の連絡
- 2016年5月17日 9時46分 取扱い開始(脆弱性関連情報の通知)の連絡
- 2016年5月20日 18時41分 修正完了の連絡
受信から受理まで30分。やはり脅威度に応じて優先順位が変わっているのかも。
@kusano_k 今年になって対応が受信順じゃなくなって脆弱性によって優先されることも出てきましたね。e-taxの件は報告して3日で受理されました
— yousukezan (@yousukezan) 2016年12月21日
SYSZO
XSS。「"><script>alert(location)</script>
でスクリプトが動く」と報告して修正後に確認したところ、"
, >
, <
はエスケープされるようになっていたけど、'
がエスケープされていなかった。このサイトはなぜかHTMLの属性値を括るのに"
と'
が混在している。該当箇所は'
で括られていたから、'autofocus onfocus='alert(location)
でまだスクリプトが動いた。どういう事情で混在しているのか分からないけど、できるなら統一したほうが良さそう。
████████
記事を書こうと思って確認していたら、脆弱性が修正されていたはずなのに元に戻っているサイトがあった。サーバー上のコードを直接書き換えるとかで突貫で直して、通常の更新フローで上書きされたとかだろうか。怖い。
— kusanoさん@がんばらない (@kusano_k) 2016年12月24日