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;

原文地址:https://www.cnblogs.com/tinyphp/p/5048169.html