リクエスト分割攻撃@PHP技術

リクエスト分割攻撃です。
リクエスト分割攻撃とはHTTPリクエストに改行を含ませることでHTTPのリクエストを自在に操る攻撃です。

  • リクエスト分割 攻撃側

リクエスト分割攻撃はHTTPリクエストをURLエンコードした改行を含ませることでヘッダを複数記述でき、Cookieなどを改ざんできる攻撃です。
まず、以下は脆弱なコードです。
Getでdopostに値が送られてきた場合、リダイレクトしています。

if($_GET['dopost']){
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
}

これに攻撃をしてみます。

http://localhost/sites/PHPS/2-3.php/%0d%0aSet-Cookie:%20PHPSESSID=ASYOULIKE;max-age=1000;path=/?dopost=1

いろいろ値を送っていますが、この攻撃のキモは"Set-Cookie:〜"です。
このURLを投げると、Cookieに値がセットされてしまいます。

ただし、PHP5.1.2以上のバージョンでHTTPリクエスト分割攻撃を行うと、以下のようなエラーが出力され、成功しません。CRやLFを検知しているようです。

Header may not contain more than a single header, new line detected
  • リクエスト分割 防御側

これに対して防御するには、サニタイズを行います
ヘッダに出力しようとしている文字列に対し、CRやLFがあれば削除することで防御することができます。

また、php.iniのsession.use_only_cookiesをOnにすることでセッション全体の保護ができるそうです。