WEB+DB PRESS Vol.103「脆弱性の見つけ方&ふさぎ方」を読んで、自分なりにまとめてみた

WEB+DB PRESS Vol.103「脆弱性の見つけ方&ふさぎ方」を読んで、自分なりにまとめてみた

テスト環境はRoRだったけどlaravelでも同様だったので、自分なりにまとめてみた。

1, 画像アップロードで、PHPソースをアップロードして、任意のコード実行(サーバ環境・ファイル取得)
脆弱性その1、ファイル名に拡張子(png.php)が含まれてればOK
→ 正規表現ではなくメソッドで取得
脆弱性その2、ブラウザからのMIME偽装(image/png)
→ MIMEは見ずにマジックバイト(ファイル先頭の数バイトが画像形式によって決まっている)をチェック

2, OSコマンド・インジェクション
画像リサイズやファイル検索などをOSコマンドで実行していて、パラメータをブラウザから入力出来る場合、セミコロンで挟んで別のOSコマンドを実行できる。
例) mysqlへの接続ID/PASSをWebのドキュメントルートへコピーして取得。同様の手口でmysqlのレコードを取得
→ 入力値チェック・サニタイジングをしっかり行う

3, ディレクトリ・トラバーサル(親ディレクトリへのアクセス)
project_name/public/img/../../../ のように、../を使う事により親ディレクトリへのアクセスして、ソースコードや設定ファイルにアクセスできてしまう。
→ 画像ファイル名は、乱数に変換して保存。

4, mysqlのcollation(参照順序)の脆弱性
select * from users where name = ‘suzuki ‘;
みたいに文字列の最後に半角スペースがあっても、utf8_general_ciだと無視してname=’suzuki’がヒットしてしまう。(大文字・小文字も同一視。SUZUKIでもOK)
つまり、suuzkiというアカウントに対して、’suzuki ‘や’SUZUKI’というログイン名で新規作成すると、乗っ取れる場合がある
対策
→入力時にトリム
→collationをutf8_bin(完全一致)にする
※カラムをunique制限しても、utf8_general_ciのせいで同値扱いになる!

5, SQLインジェクション
テキスト入力にSQL文を書いて、SQL実行させるという基本?の脆弱性。ORマッパーを使ったとしても内部的にはSQL文に変換するので対策は必要!
select * from users where name = ‘sato’ and password = ‘pass’;
ログイン名に、sato’– みたいに後ろをコメント行にする事によってパスワード無しでユーザ情報が表示される。
select * from users where name = ‘sato’–‘ and password = ‘pass’;

6, アクセス制御の不備
http://example.com/img/1.jpg
みたいな画像保存の仕方をして、アクセス制限をかけないと
http://example.com/img/2.jpg
に画像があるだろうな~と推測が出来てしまい、URLにアクセスするだけで表示出来てしまう。
→ファイル名の乱数化
→ユーザ認証をかける

7, クロス・サイト・スクリプティング(DOM Based XSS)
今回紹介されていたDOM Based XSSは、別サイトは使わずにアップロードされた画像ファイルのEXIF情報にjavascriptを仕込んでおいて、それを表示させたユーザに対してJSを実行するというもの
alertとが出てくるとか位なら良いけど、パスワードマネージャーにアクセスされて、ログイン情報を盗まれると大変!

8, ミドルウェアの脆弱性
OS・ミドルウェア・言語など脆弱性が見つかった古いバージョンを使っていると、そこを攻撃される
→最新バージョンにアップデートする。

総括すると、テキスト入力やファイルアップロードが脆弱性の原因となる事が多いので、そこいらへんを気をつけよう!って事ですね。