2016-04-27 7 views

答えて

3

これはXPath injection attackで、文書内のすべてのノードを再帰的に取得しようとしました(//*部分)。何が起こったのかを理解するには、例を挙げること。

subnodeの値をユーザーが入力したテキストで検索するXPath式を動的に構築するとします。あなたが使用するXML文書:

<root> 
    <node> 
     <subnode>value1</subnode> 
     <subnode>value2</subnode> 
    </node> 
</root> 

そして、あなたはこの表現があります:%sは、ユーザーが入力した値のプレースホルダです//node[. = "%s"]を。ユーザーはvalue1と入力すると、//node[. = "value1"]の式が生成されます。これは完全に安全で、<subnode>value1</subnode>を返します。

しかし、今、ユーザーがtest" and 1=0] | //* | /*["0クエリを入力した場合、ユーザーが何であったかアクセスし、この場合にも、ユーザーがroot含めたすべてのノードになるだろう、構文的には正しいがある//node[. = " test" and 1=0] | //* | /*["0"]nodesubnodesになるだろうと想像アクセスしないでください。

//node[. = " test" and 1=0] | //* | /*["0"]の表現を分解しましょう。攻撃者はtest" and 1=0]部分を使用して既存の状態から抜け出し、1=0条件を追加することなく一致させました。 |は、XPathで「or」を意味します。 //*は、文書内のすべてのノードに再帰的に一致します。これが攻撃者に何があったかを示します。式を構文的に正しいものに保ち、引用符のバランスを取るためには、/*["0の部分が必要です。起きてからそれを防ぐために、いくつかの方法があります


は、hereを要約:

  • サニタイズ/は、ユーザー入力を検証します。プリコンパイルされたXPathには、すでにプログラムが実行される前にプリセットではなく、ユーザーの後にその場で作成されている

:あなたが行うことができます最小は引用符に

  • 使用を逃れるために、プリコンパイル XPath式であります入力が文字列に追加されました。
  • パラメータ化は入力が発生します。あなたは

    • 使用パラメータ化 XPath式をエスケープされているはずの文字が欠落し心配する必要はありませんので、これは、より良いルートです文字列や整数などの特定のドメインに制限され、そのようなドメインの外部の入力は無効とみなされ、クエリは失敗します。

    も参照してください:

    +0

    おかげで多くのことを、任意のアイデアは、これはもう起こり得ないことを確認する方法は? –

    +0

    @AlexBouttelgier大丈夫です、確かに、いくつかの情報とリンクで答えを更新しました。 – alecxe

    +0

    申し訳ありませんが、私はネットワーキングの人ですので、今は彼の問題であるウェブサイトの世話をする人にそれを渡します;)本当に感謝してくれてありがとう。 –

    関連する問題