今日、データパケットの検索資料を分析している際に、偶然に ${IFS} についての Freebuf の記事を見つけました。
以下にリンクを添付します:
https://www.freebuf.com/articles/web/286513.html
知識の盲点だったので、調べてみました。自分の理解を記録しておきます。
$IFS は、シェルスクリプト内の set 変数の一種であり、シェルが「コマンドの置換」と「パラメータの置換」を処理する際に、IFS の値に基づいて、デフォルトではスペース、タブ、改行を使用して入力された変数を分解し、特殊文字を処理し、最後に再度組み合わせてその変数に割り当てます。
もし直接 echo "cd${IFS}/home" を実行すると、${IFS} の値は \n になるはずです。
しかし、$IFS をダブルクォーテーションで囲むと、$IFS は無効になります。例えば、以下の内容を含むシェルファイルを作成します。
入力:
IFS='-'
string2="1--2--3--4"
echo $string2
echo "$string2"
出力:
1 2 3 4
1--2--3--4
リンク先のハッカーの攻撃手法に従って、サーバー上で直接実行してみます:
/bin/sh${IFS}-c${IFS}'cd${IFS}/home/target;ls${IFS}-l'
このような書き方のコマンドは実行可能であり、コマンドの実行結果を取得することができます。
もし、このようなコマンドが URL に含まれており、ウェブ上にディレクトリトラバーサルの脆弱性が存在し、IPS や WAF が URL の検出時に ${IFS} の判断を含んでいない場合、攻撃者によって悪用される可能性が非常に高くなります。
その場合、攻撃者はパスワードファイルの抽出や nc の逆接続などを行うかもしれません。
今後、新たな学びの結果があれば、追記しますね〜