この講演では、難解なWebアプリケーションの脆弱性を詳しく見せる。これらの脆弱性は多くのセキュリティ・コンサルタントの簡易な脆弱性診断では見逃される可能性があり、リモートコード実行、認証バイパスや、実際にお金を支払うことなくPayPal経由でお店の商品を購入されてしまうことに繋がる。
SQLインジェクションは廃れたが、私は気にしない。null、nil、NULLの世界や、noSQLインジェクション、通話音声傍受に繋がるHostヘッダ・インジェクション、PayPalの二重支払い、RailsのMessage Verifierのリモートコード実行の世界を探検しようではないか。
--- アンドレス・リアンチョ Andres Riancho
アンドレス・リアンチョはアプリケーション・セキュリティの専門家であり、現在はコミュニティを前提としたオープン・ソースのw3afプロジェクトを率いていて、世界中の企業に徹底的なWebアプリケーション侵入テストサービスを提供している。
研究の分野では、3comやISSからのIPS装置に対し重大な脆弱性を発見していて、元雇用者のひとりが行ったSAP研究に貢献し、何百ものWebアプリケーションに対して脆弱性を報告している。
彼が注力しているものは常に、Webアプリケーションのセキュリティ分野である。それは彼が開発したw3afであり、侵入テスターやセキュリティ・コンサルタントたちに幅広く使われるWebアプリケーション攻撃、Auditフレームワークだ。アンドレスは、BlackHat(米国と欧州)、SEC-T(スウェーデン)、DeepSec(オーストリア)、OWASP World C0n(米国)、CanSecWest(カナダ)、PacSecWest(日本)、T2(フィンランド)、Ekoparty(ブエノスアイレス)など、世界中の多くのセキュリティ会議において講演をし、トレーニングの場を設けてきた。
アンドレスは、自動Webアプリケーション脆弱性の検知と開発を更に研究するため、2009年にWebセキュリティに特化したコンサルタント会社Bonsai Information Securityを設立している。
4. ORM はペンテストの星を殺した
▪ 全ての現代的な Web 開発フレームワークは、(no) SQL データ
ベースとの相互作用の概念を提供する。開発者はもはや生の
SQL クエリを記述することはない。
Video killed the radio star (youtube)
▪ 今日ではSQL インジェクションに出く
わすことは滅多にない。これはテスタ
ーが対象となる Web アプリケーショ
ンを慎重に掘り下げて、危険性の高
い脆弱性を検出することを要求してい
る。
5. テンプレートとデフォルト HTML エンコードを用いる MVC
は XSS を殺した
▪ ほとんどの現代の Web 開発フレームワークは、ユーザーに向け
て表示する HTML をレンダリングするためにテンプレートを用い
る、モデル・ビュー・コントローラー・アーキテクチャを利用している。
▪ Jinja2 のようなテンプレートエンジンでは、コンテキストデータが
標準で HTML エンコードされている。
▪ 開発者がクロスサイトスクリプティングに脆弱なテンプレートを作
成するには、たくさんのコードを書く必要があるため、脆弱性の抑
制につながる。
<ul>
{% for user in user_list %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
6.
7.
8. 強引な入力値のデコーディング
Ruby on Rails、Sinatra およびその他の (ruby ベースの) Webフレ
ームワークは強引な入力値のデコーディングを行う:
http://www.phrack.org/papers/attacking_ruby_on_rails.html
post '/hello' do
name = params[:name]
render_response 200, name
POST /hello HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=andres
POST /hello HTTP/1.1
Host: example.com
Content-Type: application/json
{"name": "andres"}
9. Ruby ハッシュへのデコード
POST /hello HTTP/1.1
Host: example.com
Content-Type: application/json
{"name": {"foo": 1}}
前述のすべての場合では name 変数の型は String 型だった。しかし
我々はそれをハッシュ型に強制できる:
36. セキュアではない IPNハンドラ
import requests
PAYPAL_URL = 'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate'
def handle_paypal_ipn(params):
# params contains all parameters sent by Paypal
response = requests.post(PAYPAL_URL, data=params).text
if response == 'VERIFIED':
# The payment is valid at Paypal, mark the cart instance as paid
cart = Cart.get_by_id(params['custom'])
cart.record_user_payment(params['mc_gross'])
cart.user.send_thanks_email
else:
return 'Error'