ホームページ >バックエンド開発 >PHPチュートリアル >PHP の脆弱性: クロスサイト リクエスト フォージェリとフォージェリを防ぐ方法_PHP チュートリアル

PHP の脆弱性: クロスサイト リクエスト フォージェリとフォージェリを防ぐ方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:58:57973ブラウズ

偽のクロスサイト リクエストの概要
偽のクロスサイト リクエストは防ぐのが難しく、攻撃者がこの方法を使用していたずら、スパム メッセージの送信、データの削除などを行う可能性があります。この攻撃の一般的な形式は次のとおりです:
ユーザーにクリックさせるための偽のリンク、またはユーザーが知らないうちにアクセスできるようにする
ユーザーを送信させるための偽のフォーム。フォームを非表示にしたり、画像やリンクに見せかけたりすることができます。
一般的で安価な防止方法は、ユーザーの書き込み操作が含まれる可能性のあるすべてのフォームにランダムで頻繁に変更される文字列を追加し、フォームの処理時にこの文字列をチェックすることです。このランダムな文字列が現在のユーザー ID に関連付けられている場合、攻撃者にとってリクエストを偽造するのはさらに困難になります。
攻撃者がターゲット ユーザーに隠れた方法でリンクを送信した場合
ターゲット ユーザーが誤ってアクセスすると、購入金額が1000になる
インスタンス
Suiyuan Network PHP Message Board 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);
}
else
{
$sql="id=".$id が含まれる書籍から削除; //メッセージ ID を削除するために渡します
mysql_query($sql);
}
mysql_close($conn);
echo "";
?>

管理者権限がある場合は、http://localhost/manage/delbook.php?id を送信してください。 =2 、ID 2 のメッセージが削除されます
使用方法:
通常のユーザー メッセージ (ソース コード メソッド) を使用します。内容は
コードをコピーします コードは次のとおりです:

< img src="delbook.php?id=2" />



それぞれ 4 つの画像リンクを挿入し、4 つの ID メッセージを削除します。その後、ホームページに戻って参照し、変更がないことを確認します。 。画像を表示できません
ここで、管理者アカウントでログインしてホームページを更新すると、メッセージが 1 つだけ残っており、画像リンクで指定された ID 番号を持つ他のメッセージがすべて削除されていることがわかります。
攻撃者はメッセージに非表示の画像リンクを挿入します。このリンクには、攻撃者自身がこれらの画像リンクにアクセスする場合、権限がないため、管理者がログに記録した場合には、何の効果も確認できません。このメッセージを表示した後、隠しリンクが実行され、彼の権限は十分に大きいため、これらのメッセージは削除されます
管理者のパスワードを変更します
コードをコピーします コードは次のとおりです:

//pass.php
if($_GET["act"])
{
$username=$_POST["username"];
$sh=$_POST["sh"];
$gg=$_POST ["gg"];
$title=$_POST["title"];
$copyright=$_POST["copyright"]."
ウェブサイト: スクリプト ホーム";
$password=md5($_POST["パスワード"]);
if(empty($_POST["パスワード"]))
{
$sql=" update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='". $copyright ."' where id=1";
}
else
{
$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 サイト設定に関するいくつかの情報を変更するために使用されます。次のフォームを直接構築できます:





< input type ="password" name="password" value="root">
;





Attack.html として保存し、自分の Web サイト http://www.jb51.net に配置します。ページにアクセスすると、ターゲット プログラムの pass.php にパラメータが自動的に送信され、ユーザー名が root に変更され、パスワードが root に変更されます。その後、メッセージを送信してリンクを非表示にします。管理アクセスの後、ユーザー名とパスワードはすべて変更されます。
偽のクロスサイト リクエストを防止する
偽のクロスサイト リクエストに対処する Yahoo の方法は、フォームに .crumb というランダムな文字列を追加することです。同様のソリューションであり、そのフォームには post_form_id と fb_dtsg が含まれることがよくあります。
ランダム文字列コードの実装
このアイデアに従って、パンくずの実装をコピーします。コードは次のとおりです:
コードをコピーします コードは次のとおりです:

class Crumb {
CONST SALT = "your-secret -salt";
static $ttl = 7200;
static public functionChallenge($data) {
return hash_hmac('md5', $data, self::SALT);
static public function issueCrumb($uid, $action = -1) {
$i = ceil(time() / self::$ttl);
return substr(self::challenge($i . $action . $uid), -12, 10);
} 静的パブリック関数 verifyCrumb($uid, $crumb, $action = -1) {
$i = ceil(time() / self::$ttl); ::challenge($i . $action . $uid), -12, 10) == $crumb ||
substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)
return true;
}
} コード内の


$uid はユーザーの一意の識別子を表し、$ttl はこのランダムな文字列の有効時間を表します。
応用例
フォームの構築
非表示のランダム文字列のくずをフォームに挿入



コードをコピー
コードは次のとおりです:




フォームdemo.phpを処理
パンくずを確認


コードをコピー
コードは以下の通りです if (Crumb::verifyCrumb($uid, $_POST['crumb'])) {
//通常のプロセスに従ってフォームを処理します
} else {
//Crumb 検証に失敗しました、エラープロンプトプロセス
}
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328172.html技術記事偽のクロスサイト リクエストの概要: 偽のクロスサイト リクエストは防ぐのが難しく、攻撃者がこの方法を使用していたずら、スパム メッセージの送信、データの削除などを行う可能性があります。この種の攻撃はよくあることです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。