ELインジェクションCheat Sheet

ELインジェクションとは何か

Spring Framework に存在した脆弱性 CVE-2011-2730 です。これは EL式を2重実行することで引き起こされます。

発見者は MindedSecurity の Stefano Paola (@WisecWisec) 氏と Aspect Security の
Arshan Dabrirsiaghi 氏で、詳細な解説は
http://www.mindedsecurity.com/fileshare/ExpressionLanguageInjection.pdf
にあります。

ブラインドインジェクションでの配列の長さの検出方法

list の要素数が 3 より大きいかどうかを判別する

${list[3]=list[3] ? 'OK' : 'OK'}

  これは要素の数が 3 以下の場合に配列のインデクス範囲オーバーで HTTP 500 になります。

ブラインドインジェクションでBASIC認証のIDとパスワードを盗む

${header} はブラウザから送信されたHTTPヘッダの内容を取得するのに使用できます。
これはXSTのようにBASIC認証のIDとパスワードを取得することに使用可能です。

長さを得る。

_index_ の値を変えてテストすることでヘッダテキストの長さを得ます。

     ${header['Authorization'].bytes[_index_] le 255 ? 'ok':'ok'}
ヘッダ内容を得る

_index_ と _value_ を変えて調べる

   ${header['Authorization'].bytes[_index_]=_value_ ? 'd':1>true}
デコード

Basic認証のIDとパスワードはBase64エンコードされているので適当なデコーダーでデコードするとIDとパスワードが復元できます。

リフレクションで変数のメンバ名を得る

サーブレットコンテナによっては、ELで .class を使って getClass メソッドを呼ぶことを許可している場合があります。その場合、その結果を使ってWebアプリケーションの内部データを保持する変数の getter メソッド名を調べることが可能です

Tomcat 6 Tomcat 7
デフォルトで許可 オプション org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true を設定
   ${variable.class.methods[0].name}

parseFloatのバグ CVE-2010-4476 を強制的に突く

パッチのあたっていない Java ランタイム + Tomcat 7.0.7/6.0.31/5.5.32 以前でのみ有効

セットするHTTPヘッダ

Accept-Language: en;q=2.2250738585072012e-308

攻撃コード

${pageScope['javax.servlet.jsp.jspRequest'].locales}

DataSource のインスタンスを用いたデータベースへのコネクションによる DoS (2012/06/08追加)

javax.sql.DataSource のインスタンスがアプリケーション(またはその他)スコープ上に "datasource" として存在する場合はそれをメモリリークさせることが出来ます。Springの流儀にきちんと従って作ったアプリケーションではありえないはずですが。

   ${datasource.connection}

任意コード実行(2013/01/23追加)

EL2.2のメソッド呼び出しの機能を使ってURLClassLoaderに任意のリモートのクラスファイル(または jar)を読み込んで実行させる方法が発見されました。詳細は https://www.aspectsecurity.com/uploads/downloads/2012/12/Remote-Code-with-Expression-Language-Injection.pdf に記載されています。