web-dev-qa-db-ja.com

XSSを取得するためにPHPでhtmlentities()関数をバイパスする方法は?

これが私が扱っているPHPフィルター関数です:

function xss_check_2($data)
  {
    return htmlentities($data, ENT_QUOTES);
  }

出力のソースコード(出力は下部にある名前Peter Wazinckです):

<div id="main">

<h1>HTML Injection - Reflected (GET)</h1>

<p>Enter your first and last name:</p>

<form action="/work/bwapp/bWAPP/htmli_get.php" method="GET">

    <p><label for="firstname">First name:</label><br>
    <input id="firstname" name="firstname" type="text"></p>

    <p><label for="lastname">Last name:</label><br>
    <input id="lastname" name="lastname" type="text"></p>

    <button type="submit" name="form" value="submit">Go</button>  

</form>

<br>
Welcome Steve Wozniak
</div>

それをバイパスする方法はありますか?

1
Yacine

指定したコンテキストから、このフィルターは安全であるように見えます。

出力はデータ状態です(タグまたは属性値の外側)。したがって、攻撃者は新しいHTMLコードを導入するために、少なくとも開始山かっこ(_<_)を挿入する必要があります。

htmlentities() は、すべての開始山かっこをHTMLエンティティ表現(_&lt;_)に変換するため、フィルターをバイパスする明白な方法はありません。

3
Arminius

BWAPPアプリケーションには、2セット(実際には3セット)のXSS保護があります。レベル2およびレベル3。

function xss_check_2($data)
{

    // htmlentities - converts all applicable characters to HTML entities

    return htmlentities($data, ENT_QUOTES);


}


function xss_check_3($data, $encoding = "UTF-8")
{
    // htmlspecialchars - converts special characters to HTML entities    
    // '&' (ampersand) becomes '&amp;' 
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'  

    return htmlspecialchars($data, ENT_QUOTES, $encoding);

}

レベル3のフィルターを見ると、$ encodingがUTF-8に設定されており、UTF-7およびその他の種類のエンコーディングが無効になります。レベル2の他のエンコーディングを検索して、自分に合ったフィルタバイパスが見つかるかどうかを確認することもできます。

0
Moses Renegade