HTTPヘッダインジェクションとOSコマンドインジェクションの違いと対策方法を徹底解説!

2020.01.06

セキュリティ対策

HTTPヘッダインジェクションとOSコマンドインジェクションの違いと対策方法を徹底解説!


今回は、HTTPヘッダインジェクションとOSコマンドインジェクションという、2種類のサイバー攻撃についてご紹介します。

HTTPヘッダインジェクション

概要

HTTPヘッダインジェクションは、HTTPレスポンスヘッダの出力処理に関するサイバー攻撃です。この脆弱性が存在する場合、「任意のクッキーがセットされる」、「任意のURLへリダイレクトされる」などの問題が発生する可能性があります。

 

前提

攻撃の説明の前に、少しだけHTTPレスポンスのデータ構造についてご説明します。
データ構造の仕組みを悪用することがHTTPヘッダインジェクションになり、最低限の知識は身につけておく必要があります。
HTTPで通信した際、HTTPレスポンスは下記のような内容になります。

【HTTPレスポンスの例】

HTTP/1.1 200 OK
Date: Wed, 08 Feb 2017 08:33:35 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
(中略)
Vary: Accept-Encoding

<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head>
(以下略)

一番上の行はステータスラインと呼ばれており、通信の結果(上記は200なので正常終了)を示します。
「Date〜」から「Vary〜」の行は、レスポンスヘッダと呼ばれており、Content-Type(データの形式や文字コードを示す)などの補足情報が格納されます。その後、空白行が一行はいります。
空白行より後ろは、レスポンスボディと呼ばれており、実際にブラウザに表示されるHTMLが格納されます。
ポイントは、それぞれの要素が「改行と空白行によって分割されている」という点です。
HTTPヘッダインジェクションは、空白行や改行コマンドに巧みに罠を張り巡らすことで、攻撃者にとって都合の良い環境を作っています。

攻撃手法

例えば、あるサイトのリンクが下記URLとなっており、リンクをクリックすると「redirect_url」に指定されたURLにリダイレクトする仕組みとなっていたとします。

http://example.com/123/aaa.cgi?redirect_url=http://example.com/456

この際、HTTPレスポンスは下記となります。

HTTP/1.1 302 Found
Date: Wed, 08 Feb 2017 08:33:35 GMT
Location: http://example.com/456
(中略)
Vary: Accept-Encoding

<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head>
(以下略)

リダイレクト先のURLがレスポンスヘッダの「Location」に入っており、ステータスはリダイレクトを示す302が返却されています。

さて、攻撃ですが、先ほどのリンクをクリックする代わりに下記URLでアクセスしてみます。

http://example.com/123/aaa.cgi?redirect_url=http://example.com/456%0D%0ASet-Cookie:+SID=ABCD1234

HTTPレスポンスは下記となります。先ほどは存在しなかった「Set-Cookie」があります。
この結果、「Set-Cookie」に指定された値がブラウザのCookieにセットされてしまいます。

HTTP/1.1 302 Found
Date: Wed, 08 Feb 2017 08:33:35 GMT
Location: http://example.com/456
Set-Cookie: SID=ABCD1234
(中略)
Vary: Accept-Encoding

<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head>
(以下略)

実際の攻撃方法としては、攻撃者が罠サイトに上記のようなURLを配置し、利用者がクリックすることで特定の値がCookieにセットされます。その結果、成りすまし攻撃が成立してしまう可能性があります。
また、同様の攻撃手法でURLに「%0D%0ALocation〜」のような文字列を含めることで、リダイレクト先のURLを任意のURL(罠サイト等)に書き換えることも可能です。

原因

HTTPレスポンスは「改行と空白行によって分割されている」と前述しました。
先ほどの例では、本来、「redirect_url」に指定された値は、レスポンスヘッダの「Location」に入るはずです。
しかし、「%0D%0A」(改行コード)が存在することで、「%0D%0A」以降の文字列が次の要素として扱われてしまい、Set-Cookieヘッダが有効になってしまいました。
なお、レスポンスヘッダとレスポンスボディは空白行で分割されているため、「%0D%0A%0D%0A」のように連続で改行コードを入れることで、レスポンスボディに任意のHTMLやJavaScriptを挿入するような攻撃も可能です。

対策

HTTPヘッダインジェクションの最も確実な対策は、外部からのパラメータをHTTPレスポンスヘッダに出力しないようにすることです。
例えば、「redirect_url」に指定された値をそのまま出力するのではなく、「redirect_url」に”456″が入力されていた場合は、「http://example.com/456」にリダイレクトするという実装になっていれば問題は発生しません。
「Location」に出力されるのは、必ず「http://example.com/456」等の固定値であり、外部からのパラメータがそのまま入ることはありません。
下記URLでアクセスされた場合も、「456%0D%0ASet-Cookie:+SID=ABCD1234」は「456」と一致しないので、無視されるか、単にNot Found等のエラーとなります。

http://example.com/123/aaa.cgi?redirect_url=456%0D%0ASet-Cookie:+SID=ABCD1234

 

OSコマンドインジェクション

概要

OSコマンドインジェクションは、シェルによるOSコマンドの実行において、意図しないOSコマンドが実行されてしまうという攻撃です。この脆弱性が存在する場合、想定外のコマンドにより秘密情報の漏洩やデータの改ざんなど様々な問題が発生する可能性があります。

攻撃手法

例として、宛先メールアドレスとコメントを入力して、「送信」ボタンをクリックするとメールが送信される画面を考えてみます。この際、メールアドレスの送信処理は、サーバー側の下記のコードで実行しているとします。

# params[:mail]には入力したメールアドレスが含まれる
system("/usr/sbin/sendmail -i < sample.txt #{params[:mail]}")

ここで、メールアドレスに「test@example.co.jp」を入力した場合、最終的にサーバー側で実行されるコマンドは下記です。

/usr/sbin/sendmail -i < sample.txt test@example.co.jp

次に、攻撃者が「test@example.co.jp; rm -rf /home/test_user」を入力した場合、下記コマンドが実行されてしまいます。

/usr/sbin/sendmail -i < sample.txt test@example.co.jp; rm -rf /home/test_user

コマンド実行ユーザーの権限にもよりますが、上記が成立した場合、「/home/test_user」配下の全てのファイルおよびディレクトリが削除されます。

原因

シェルコマンドには、一行で複数のコマンドを実行する方法を提供しており、「;」の後の文字列は別のコマンドとして扱われます。前述の例では、「;」で区切られた下記の二つのコマンドが実行されていました。

/usr/sbin/sendmail -i < sample.txt test@example.co.jp
rm -rf /home/test_user

 

対策

根本的な対策として、OSコマンドを直接実行する関数を利用しないことが重要です。
例では、system関数を使用してsendmailコマンドを実行していましたが、メール送信が目的であればメール送信用のライブラリを利用すれば、sendmailコマンドを実行せずにメール送信機能が利用できます。
なお、OSコマンド呼び出し関数を利用する場合でも、ユーザーの入力値など、外部から入力されたデータを関数のパラメータに渡さず、固定値をパラメータにしているような場合は問題ありません。
もし、どうしても外部から入力されたデータを、OSコマンド呼び出し関数のパラメータに渡す必要がある場合は、エスケープ処理のライブラリ※を利用して事前にパラメータをエスケープした上で、OSコマンド呼び出し関数に渡すようにするべきです。
※PHPのescapeshellargやRubyのShellwordsなど。

今回は、HTTPヘッダインジェクションとOSコマンドインジェクションについてご紹介しました。
以前にご紹介したSQLインジェクションやクロスサイトスクリプティングと比較すると、ややマイナーな攻撃であるため、漏れがないようにしっかりと対策をしていきましょう!


クラウド型WAFでの対策がおすすめ

WAFはファイアーウォールやIPS/IDSでは防ぐことができない、Webアプリケーションの脆弱性を悪用したサイバー攻撃を防ぎます。SQLインジェクション以外の攻撃にも対応しているため、より安全にWebサイトを運用できるようになります。
リソース不足によりWebアプリケーションを最新バージョンへ更新できない場合や、すぐにセキュリティパッチを適用できない状況でも、WAFを導入することでSQLインジェクション攻撃への対応が可能です。

なかでもクラウド型WAFは初期・運用コストが小さいため、手軽に対策できます。
クラウド型WAFも選択肢が多いですが、導入しやすいものとしておすすめするものに「攻撃遮断くん」があります。システム変更不要のため最短翌営業日で導入でき、ユーザー側での運用は一切必要ないため低価格かつ簡単に高セキュリティを実現できます。

「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。
 

サイバーセキュリティ クラウド型WAF 攻撃遮断くん Web Application Firewall
https://www.shadan-kun.com/

 
(2017/2/13 執筆、2020/1/6修正・加筆)


テック


  • 国内商用Webサイトが受けやすいサイバー攻撃とは?|サイバー攻撃の統計データから傾向を読み解く|今すぐ無料で資料をダウンロード
  • 御社のセキュリティ対策は本当に大丈夫ですか?約80%の企業が対策不足と言われています。Webセキュリティをいますぐ確認!3つのチェックポイント。今すぐ無料で資料ダウンロード