XPathインジェクション

XPathインジェクション

説明

文字列の連結や書式設定でユーザー入力をXPath式へ含めると、条件を迂回されたり、意図しないXMLノードを取得されたりするおそれがあります。

想定される影響

  • 認証や認可の検証を迂回される可能性があります。
  • XMLデータから機密情報が漏えいするおそれがあります。

対処方法

  • XPath式は固定してください。APIが対応していれば値を変数としてバインドし、対応していなければ固定パスでノードを選択してアプリケーション内で値を比較してください。
  • 入力の形式と長さを許可リストで検証し、返すノードへのアクセス権限も確認してください。

例

goxpath、XML文書 doc、リクエスト r が用意されたコードの抜粋です。

変更前

go
expr := "//user[@id='" + r.FormValue("id") + "']"
goxpath.MustExec(expr, doc)

変更後

go
expr := "/root/user"
goxpath.MustExec(expr, doc)

解説:

  • 変更前: 入力がXPathの構文へ直接入り、条件を変更できる可能性があります。
  • 変更後: 固定パスを検索するだけで、変数バインディングやIDの絞り込みは実装していません。必要なユーザー選択と権限検証を別途実装してから結果を返してください。

参考資料