アップロードラボの範囲の練習
- 1. 環境構築
- 2. レベル分析
-
- 2.1less-1 - フロントエンド JS に基づく検出
- 2.2less-2 - MIMEヘッダー認証
- 2.3less-3 php3,4,5 拡張子解析
- 2.4less-4 .htaccess ファイルのバイパス
- 2.5以下-5ドット空ドット空バイパス
- 2.6 6 文字未満のファイル名の混乱
- 2.7 未満 - 7 スペースのバイパス
- 2.8レス-8ドットバイパス
- 2.9less-9 Winファイルストリーム機能バイパス
- 2.10以下-10点ショートパス
- 2.11less-11 ファイル名空の二重書き込みバイパス
- 2.12 12 未満の get パラメータの受け渡しでの 00 の切り捨て
- 2.13 13 未満のポストパラメータ渡しでの 00 の切り捨て
- 2.14 未満の 14 ファイルには、結合されたファイルのアップロードが含まれています
- 2.15 から 15 ~ 16 個のファイルに結合されたファイルのアップロードが含まれる
- 2.16less-17 ファイルのインクルードとセカンダリ レンダリング バイパス
- 2.17 18 歳未満の人種の脆弱性
- 3. まとめ
ファイル アップロードの脆弱性の目的は、サーバーが解析できる悪意のあるファイルをサーバーにアップロードすることであり、そのようなファイルは攻撃者との接続を確立し、悪意のあるコマンド (Web シェルとも呼ばれる) を実行する可能性があります。その害は非常に大きいため、すでに業界の注目を集めています。
この記事では、アップロード ラボの実践を通じていくつかのバイパス方法を再現しますが、もちろん、ファイル アップロードの脆弱性の基本的な部分を体系的にまとめたものでもあります。
1. 環境構築
ここから作者の github に直接アクセスしてダウンロードできます。
https://github.com/c0ny1/upload-labs
インストールが完了したら、ドキュメントの指示に従ってください。練習と学習のためのこのような優れたプラットフォームを提供してくれた作者に心から感謝します。著者が生意気に投稿したマインドマップは次のとおりです。
上の図は一般的なバイパスのアイデアを示しています。今は理解できなくても大丈夫です。一緒にやってみましょう。そうすれば理解できるでしょう。
2. レベル分析
2.1less-1 - フロントエンド JS に基づく検出
もちろん、早期の検出は最も弱いものでもあります。まず、ページ内のフィルター ステートメントを見てみましょう。
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
解決策 1: アップロード用にブラウザの JS を直接無効にする
1. URL アドレス バー内に「about:config」と入力します
。 2. 既存の JavaScript.enable オプションを検索します
。 3. 無効に設定します。
私たちのものをアップロードしてみてください”webshell“
。ここでは両方が代わりに使用されますwebshell
。phpinfo
<?php phpinfo();?>
解決策 2: げっぷエージェントがデータ型を変更する
JPG サフィックスをアップロードして制限を回避した後、burp のサフィックスを .php に変更して再度バイパスします。
パケットをキャプチャし、ファイルのサフィックスを変更します。
試験結果:
この時点で、フロントエンドの制約は頭を消耗するだけでなく、役に立たないことがわかりました。
2.2less-2 - MIMEヘッダー認証
まずソースコードを分析しましょう。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
これをより明確に確認するために、FILE 変数を出力します。
ファイルのデータ構造を確認できます。
array(1) {
["upload_file"]=> array(5)
{
["name"]=> string(7) "web.php"
["type"]=> string(24) "application/octet-stream"
["tmp_name"]=> string(14) "/tmp/phpPYzq7W"
["error"]=> int(0)
["size"]=> int(18)
}
}
この時点で、上記のソースコードの実行プロセスを大まかに整理できます。ファイルがサーバーに到着すると、サーバーはリクエストパケットの MIME タイプを判断し、タイプが間違っている場合は直接アップロードを拒否します。この時点で、burp プロキシを使用して、アップロードするファイルの MIME タイプを変更する必要があります。
テスト:
2.3less-3 php3,4,5 拡張子解析
この質問は非常に特殊で、サーバーフィルターが厳密ではなく、拡張 php 分析機能が有効になっている場合、分析ソリューションの拡張を試みることができます。
実行効果ビュー:
解析が行われていないことがわかります。これは実際には、Apache 内で対応する危険性を設定していないためです。このようなファイルアップロードバイパスをトリガーするには、Apache 構成ファイル内の対応するサフィックスを持つファイルを構成および解析する必要があります。
2.4less-4 .htaccess ファイルのバイパス
ソース コードを見ると、多くのサフィックスがフィルタリングされていますが、フィルタリングされているファイルがないことがわかります.htaccess
。
.htaccess
ファイルの役割:
htaccess ファイルは、Apache サービスの構成ファイルであり、関連するディレクトリ内の Web ページの構成を担当します。htaccess ファイルを通じて、Web ページ 301 リダイレクト、カスタム 404 エラー ページ、ファイル拡張子の変更、特定のユーザーまたはディレクトリへのアクセスの許可/ブロック、ディレクトリ一覧の禁止、デフォルト ドキュメントの設定などを実現できます。
この機能は、疑似静的ページを実現するためのものです。SetHandler application/x-http-php は、現在のディレクトリ内のすべてのファイルを php によって解析されるように設定することを意味します。一方で、ファイルのサフィックスを html に変更しても、依然として可能です。 php として解析されます。一方、アップロード ディレクトリに制限がない場合、.htaccess ファイルの悪意のあるアップロードは直ちにセキュリティ リスクを引き起こします。どのようなファイルをアップロードしても、php 言語のコード仕様に準拠していれば、PHP として実行されます。
このファイルを有効にするには、次のようなルールを Apache 構成ファイルに追加する必要があります。
AllowOverride All
アップロード例:
まずは作成した.htaccess
ファイルをアップロードします
<FilesMatch "/.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
テスト解析:
解析に失敗しました。問題は不明です。解決したら私を非公開にしてもいいよ、ハハハ
2.5以下-5ドット空ドット空バイパス
ソースコード監査:
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
//删除文件名末尾的点
$file_name = deldot($file_name);
//截取第一个.到末尾的数据
$file_ext = strrchr($file_name, '.');
//转换为小写
$file_ext = strtolower($file_ext);
//去除字符串::$DATA
$file_ext = str_ireplace('::$DATA', '', $file_ext);
//首尾去空
$file_ext = trim($file_ext);
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
ここでコード実行プロセスを要約します: アップロードされたファイルはサフィックス名の正当性について処理されます。処理が完了した後、取得されたサフィックス文字列 file_ext とブラックリストは比較のためにフィルタ プログラムに渡されます。ブラックリストと一致する場合、エラーが報告されるので、アップロードを終了します。ブラックリストに一致しない場合、アップロードは許可されます。
言い換えれば、サフィックスを処理するときにハンドラーに余剰を持たせることができる場合、つまりブラックリストと一致しない場合は、それをバイパスできます。ペイロードを与えることができます:
#()为空格,也可以自己编写,只要保证被处理后可以掏出黑名单并且可以被当成PHP进行解析即可
web.php.().()
ここでは、変更したファイル名が次の処理ステートメントに送信されて処理され、ドットとスペースを削除した後にアップロードが成功したことがわかります。
テスト:
2.6 6 文字未満のファイル名の混乱
ここのソース コードを見ると、1 行が欠落しており、大文字と小文字の変換は実行されず、小文字が直接バイパスされています。
テスト: ファイルは正常にバイパスされてアップロードされましたが、残念ながら解析されませんでした。phpのバージョンの問題と推測されますが、状況は変わりませんので、解決された方はプライベートメッセージをお送りください。
2.7 未満 - 7 スペースのバイパス
$file_ext = trim($file_ext); //首尾去空
ここのソース コードを観察すると、この処理ステートメントが欠落していることがわかります。つまり、接尾辞の後にスペースを追加して、接尾辞を回避することができます。
web.php(此处空格)
テスト:
アップロードに成功しました。
2.8レス-8ドットバイパス
ここでは、ソース コード内の小さなドットのフィルタリングが少なく、考え方は第 7 レベルと同じで、引き続きバイパスします。
web.php.
試験結果:
2.9less-9 Winファイルストリーム機能バイパス
ソース コードを分析した結果、str_ireplace() 関数は文字を置換して文字を削除するために使用されていないことが判明しました::$DATA
。Windows
ストリーム機能をバイパスすると、PHP が Windows 上で実行される場合、後続のデータはファイル ストリームとして文件名+::D A T A "
扱われ::DATA
、サフィックス名は検出されず、::$DATA
以前のファイル名が保持されます。サフィックス名をチェックすることが目的ではありません。
web.php::$data
検出:
2.10以下-10点ショートパス
2.11less-11 ファイル名空の二重書き込みバイパス
ソースコード分析:
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
//首位去除空格
$file_name = trim($_FILES['upload_file']['name']);
//直接将黑单内部的字符替换为空
$file_name = str_ireplace($deny_ext,"", $file_name);
したがって、バイパスするためにファイル名を直接二重に書き込みます。
web.pphphp
テスト:
2.12 12 未満の get パラメータの受け渡しでの 00 の切り捨て
ソースコード分析:
<?php
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
//定义白名单
$ext_arr = array('jpg','png','gif');
//复合使用strrops获取后缀名定位,截取后缀名
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
//白名单验证上传文件的合法性,合法文件才允许进行下一步处理
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
//get接收参数save_path来确定文件的存储路径,利用随机数加日期来拼接出图片文件的名称
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
?>
上記のソース コードから、ファイルのアップロードを制限するためにホワイトリストが使用されると、基本的には解決策がないことがわかります。しかし、ここでも作者が私たちに手を残しており、ここでのファイルアップロードパスはgetパラメータの形式を通じて取得されます。言い換えれば、アップロード パスでトリックを行うことができるでしょうか?
実は、00截断
このようなPHP5.3以前に出現したセキュリティ・ホールは、\0
C言語でストップキャラクタを表すものであり、C言語で書かれたPHPでは意味が変わっていないため、回避することができます。
まずは通常のサフィックスファイルをアップロードしましょう.jpg
。パケットをキャプチャし、拡張子 .php が付いたファイルへのアップロード パスを変更し、URL エンコード形式 %00、つまり \0 を追加します。
アップロードに失敗したことがわかりました。データ クエリの後、使用している環境は 5.3.29 であり、脆弱性を引き起こす最小バージョン 5.2 を超えているため、再現できません。学生はそれを解決してみることができます。同時に、php.ini ファイルを閉じることに注意してください。magic_quotes_gpc
もしそれでも
magic_quotes_gpc = off
2.13 13 未満のポストパラメータ渡しでの 00 の切り捨て
ソース コードを分析すると、ファイルの保存パスが POST パラメーターの受け渡しメソッドによって渡されていることがわかります。パケットをキャプチャし、パスを変更して.php%00
その URL をさらにデコードしてパラメータを渡します。
データ パッケージを変更します。
変更後にパラメータを渡します。
もちろん、バージョンが高すぎるため、PHP の 00 切り捨ての脆弱性を再度利用することはできませんが、誰もが同じようなコード構造に遭遇した場合、このようなアップロードソリューションも考え方の 1 つです。
2.14 未満の 14 ファイルには、結合されたファイルのアップロードが含まれています
まずはヒントを見てみましょう。
ファイルインクルージョンを使用していることを明確にして、絵馬の制作を直接開始できるようにしましょう。
#1.将目标文本文件和图片放到同一个目录下,并在此目录运行cmd
#2.输入copy命令生成图片马
copy src.jpg/b + web.txt web.jpg
copy 图片文件/b + 敏感文本文件 web.jpg
ファイルホースが作成されたら、それを 010editor にドラッグすると、トロイの木馬の情報が表示されます。
アップロードする:
テストには次のものが含まれます。
http://127.0.0.1/upload-labs/include.php?file=http://127.0.0.1/upload-labs/upload/1620230315204119.jpg
このファイルには私が理解できない古いアイアンが含まれています。fileパラメータで受け取ったデータをそのままPHPファイルとして実行できると理解できます。
これは、画像に機密性の高い PHP ステートメントが含まれているためです。したがって、インクルードされた後、サーバーによって PHP として解析され、イメージ自体に PHP コードが含まれます。したがって、そのような潜在的な安全上の危険が引き起こされています。
2.15 から 15 ~ 16 個のファイルに結合されたファイルのアップロードが含まれる
ここでは、2 つのソース コードが同時に分析されます。
#15关的过滤语句
//定义过滤函数
function isImage($filename){
//定义白名单上的文件后缀
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
//使用getimagessize确定任何支持的指定图像文件的大小,并返回尺寸以及文件类型和 height/width 文本字符串,以在标准 HTML IMG 标签和对应的 HTTP 内容类型中使用。
$info = getimagesize($filename);
//从info的前两个字节中截取出文件后缀名
$ext = image_type_to_extension($info[2]);
//stripos返回types在ext中首次出现的数字位置,这里是在进行白名单匹配
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
#16关的过滤语句
function isImage($filename){
//需要开启php_exif模块,exif_imagetype() 读取一个图像的第一个字节并检查其签名。
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
まだ画像の種類を判断していることがわかりますが、正確なファイルに抜け穴が含まれている限り、ランダムな画像を作成することで上記の機能を簡単に回避できます。
15未満
1.馬の絵を作る
C:\Users\HP\Desktop\muma>copy tailuo.png/b + web.txt web.png
tailuo.png
web.txt
已复制 1 个文件。
2. ファイルのアップロード
3. ファイルには解析が含まれています
less-16 トリックを繰り返すだけです。
2.16less-17 ファイルのインクルードとセカンダリ レンダリング バイパス
ソースコードの分析を続けましょう。
//判断文件后缀与类型,合法才进行上传操作
if(($fileext == "jpg") && ($filetype=="image/jpeg")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片 --- 二次渲染
$im = imagecreatefromjpeg($target_path);
if($im == false){
$msg = "该文件不是jpg格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".jpg";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagejpeg($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
上記のコア コードは、この公式カードの独自のフィルタリング スキームを示しています。写真がアップロードされた後でも、写真は引き続き再編成されます。次のフィルター強度を試すことができます。
先に進んで、以前の web.jpg 画像の馬をアップロードしてください。
解析に失敗しました。画像をプルダウンして、アップロード前後の違いを分析してみます。
バイナリ解析には 010editor を使用します。
すでに明らかなデータ シャッフル動作が発生しており、以前の PHP ステートメントが消えていることがわかります。この時点で、変更されていない場所にステートメントを挿入してみることができます。理論的には、この解決策は実現可能ですが、異なる画像が同じ二次レンダリング関数で実行されるため、結果は同じではありません。そして、私が試したjpg形式の写真は明らかに順序が間違っており、多くの試みが失敗しました。
gif 画像の馬をアップロードし、エンコード比較のためにアップロードされた画像をローカルにプルし、未変更の部分に php コードを挿入してみます。
1. GIF トロイの木馬を作成する
C:\Users\HP\Desktop\muma>copy dijia.gif/b + web.txt web.gif
dijia.gif
web.txt
已复制 1 个文件。
2. ファイルをアップロードし、ローカルに再度保存します
3.編集バイナリ比較分析
コード挿入テストを行うには、この部分をクリックしてください。
n 回のテストの後、最終的にこの位置で WebShell のアップロードを実現できます。
一般に、二次レンダリングは二次変換を行わないと従来の位置から逃れることができません。継続的なテストを通じて、最終的にバイナリ ファイル内で変換されておらず、ファイル構造に影響を与えない小さなバイナリ領域を特定し、php コードのインジェクションを完了します。
画像がアップロードされた直後に、ファイルに含まれる脆弱性と組み合わせて悪意のある WebShell 解析を実装する必要があります。プロセス全体では複数回の試行が必要です。期待される効果を得るために。ただし、jpg,png,gif
同等の画像のエンコード形式を体系的に理解できれば、この作業はより速く実行されます。まだまだたくさんのことを学ぶ必要があります。
2.17 18 歳未満の人種の脆弱性
競合する脆弱性は、ほとんどの初心者にとって目新しい概念ですが、このタイプの脆弱性を理解するには、誰が誰と競合するのかという非常に重要な点を理解する必要があります。これを知ることで、追跡調査の対象となることができます。
ソースコード分析:
if(isset($_POST['submit'])){
//定义白名单
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
//截取文件后缀
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
//先将文件移动到上传路径
if(move_uploaded_file($temp_file, $upload_file)){
//判断是否在白名单内部 如果是则重命名放置到文件夹内部
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
//判断非法文件直接进行删除
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
ここでもう一度考え方を見てみましょう. ファイルは最初にフォルダーにアップロードされ、その後サフィックスの有効性がチェックされます。合法的な名前変更は保留され、違法な削除は直接実行されます。
いいように聞こえますが、よく考えてみると壊れています。ファイルが最初にディレクトリに保存されるまでの時間枠があるため、十分に高速であれば、その時間枠内に悪意のあるファイルが含まれる可能性があります。この悪意のあるファイルに Web シェルを生成させるだけで十分ではないでしょうか?
最初の悪意のある PHP ファイルは次のとおりです。
#webat.php
<?php fputs(fopen('shell.php','w'),'<?php phpinfo();?>')?>
次に、burp を使用して 2 つのプロセスを開始します。1 つは高速アップロード用で、もう 1 つはファイル アドレスの高速アップロード要求用です。最終的には、悪意のあるコードが実行されて Web シェルが生成されます。
ここでは 2 つのデータ パケットをキャプチャし、処理のために ctrl+i を使用してブラスト モジュールに送信します。
リクエスト パッケージを再度取得して、同じ操作を実行してみましょう。
アップロード モジュールを構成します。
リクエストモジュールを設定します。
結果取得:
Webシェルをテストします:
無事にアップロードされました!!!
要約すると、この例の競争ポイントは、アップロードしたファイルがwebat.php
最初に削除されるか、または最初に要求されるかです。ワイヤレスアップロード用と限定リクエスト用の 2 つのプロセスを使用します。最後に、エコーステータスコードによりアップロード状況を確認し、webshell
アップロードを実行します。
3. まとめ
まず、一般的なファイルアップロード検出スキームについて説明します。著者が示した分類体系に従って、クライアント側の制限とサーバー側の制限に大別できます。
クライアントは主に JS レベルで合法性の検出 (紳士を悪者から防ぐ) を実行でき、サーバーはファイルのサフィックスをチェックし、ファイルの内容をチェックできます。サーバー側の検出では、ブラックリストとホワイトリストに従って分類できますが、ブラックリストは安全率が低く、ケースのフィルタリングが厳密ではない、フィルタのサフィックスなどの問題により通常はバイパスされます。コードが厳密ではなく、プログラムのバージョンが低すぎます。
ホワイトリストの方がはるかに安全なので、ホワイトリストの検出を回避して Web シェルをアップロードしたい場合でも、ファイル アップロードの可能性のある脆弱性を組み合わせて攻撃する必要があります。攻撃側の攻撃難易度を大幅に上昇させる。
もちろん、コードの実行ロジックで発生する別のタイプのアップロードの問題もあり、ファイルの合法性が確認される前に、ファイルをいかなる形式であってもサーバー上に公開することは非常に危険です。特にアップロード ディレクトリでは、攻撃者は、悪意のあるファイルを削除して Web シェルの生成を実現する前に、マルチプロセス競合リクエストの方法を使用して悪意のあるコードを実行する可能性があります。この部分では、対応する問題を見つけるためにコード監査が必要です。
著者のアップロードのアイデアは次のとおりです。一般的に、フロントエンド フィルタとバックエンド フィルタを判断し、フィルタ タイプ (コンテンツ検出、サフィックス検出、コード ロジックの問題) を判断します。
もちろん、誰かがファイルのアップロードを防ぐ方法を尋ねたら、私は間違いなくすぐに答えます。フロントエンドとバックエンドでの同時ホワイトリスト フィルタリング、フロントエンドでのサフィックス フィルタリング、バックエンドでのファイル コンテンツの検出、およびランダムな複数のレンダリングです。回。最初にファイルの正当性を必ず判断し、ファイルをディレクトリにアップロードし、名前を変更してください。
これにより、安全率を99%まで引き上げることができ、ハッカーが夢見る「シェル挿入の夢」を完全に阻止することができます。