リクエスト分割攻撃@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にすることでセッション全体の保護ができるそうです。