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'}
リフレクションで変数のメンバ名を得る
サーブレットコンテナによっては、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 に記載されています。