CSRF攻击演示
CSRF就是伪装成用户做坏事!
它的手段可能是:
一张引发邪恶请求的图片:
<img src="http://localhost/demoA.php?money=500" />
一个嵌入的iframe
<iframe src="http://localhost/demoA.php?money=800" frameborder="0"></iframe>
一个会自动提交的表单:
<body onload="javascript:document.forms[0].submit()"> <form method="get" action="http://localhost/demoA.php"> <input type="hidden" name="money" value="300"> </form> </body>
....等
某天抠门的你慷慨解囊地去A站捐了100块:
http://localhost/demoA.php
<?php //把money插入表 session_start(); //A站session $_SESSION['admin']="admin"; $conn = mysql_connect("localhost", "root", "open00") or die("数据库连接失败!"); mysql_select_db("test", $conn); mysql_query("set names utf8"); $money=$_GET['money']; $sql="insert into `mytable` (`money`) values('".$money."')"; if(isset($_SESSION['admin'])){ mysql_query($sql); echo "你捐款了".$money."块"; }else{ echo "未登录,不能操作"; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>A站</title> </head> <body> <form action="" method="get"> <input type="text" name="money" value="100"> <input type="submit" value="提交"> </form> </body> </html>
然后你不知怎么的从一个网页上看到这样一个图片,诱惑到不行啊 ~ =_=!!
手贱点击了一下~跳转到B站~然后又捐了300块! 花擦!你一辈子都没捐那么多!
<a href="http://127.0.0.2/demoB.php"><img src="猥琐图" /></a>
怎么回事!到底是怎么回事呢?我们看看B站代码,就是访问的时候向A发送了一个请求,而这时候你登录着A站,所以A站以为是你本人操作,就执行了:
http://127.0.0.2/demoB.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>B站发起CSRF</title> </head> <body onload="javascript:document.forms[0].submit()"> <form method="get" action="http://localhost/demoA.php"> <input type="hidden" name="money" value="300"> </form> </body> </html>
=======================================
你跟站长打了小报告,A站站长一怒之下在表单内加入了随机token值,页面每提交一次就变更一次,B站没办法制造出一样的token所以再也攻击不了了
functions.php
<?php //CSRF防卫token function gen_token() { $token = md5(uniqid(rand(), true)); $_SESSION['token'] = gen_token(); } function gen_input() { gen_token(); echo '<input type="hidden" name="token" value="' . $_SESSION['token'] . '">'; } ?>
demoA.php
<?php //把money插入表 session_start(); include("functions.php"); //A站session $_SESSION['admin']="admin"; $conn = mysql_connect("localhost", "root", "open00") or die("数据库连接失败!"); mysql_select_db("test", $conn); mysql_query("set names utf8"); $money=$_POST['money']; $sql="insert into `mytable` (`money`) values('".$money."')"; //判断用户登录 if(isset($_SESSION['admin'])){ //判断是否带有正确的token if(isset($_SESSION['token']) && $_POST['token']==$_SESSION['token']){ mysql_query($sql); echo "你捐款了".$money."块"; }else{ echo "请点击提交按钮"; } }else{ echo "未登录,不能操作"; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>A站</title> </head> <body> <form action="" method="post"> <input type="text" name="money" value="100"> <? gen_input(); ?> <input type="submit" value="提交"> </form> </body> </html>
=================数据库=====================
--
-- 数据库: `test`
--
-- --------------------------------------------------------
--
-- 表的结构 `mytable`
--
CREATE TABLE `mytable` (
`money` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
2024还活着,挺好的,向着星辰与深渊,加油,博客园不要倒下啊!