• 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;

  • 相关阅读:
    PhoneGap 的文件 api
    81-POJ-Wall(计算几何)
    12-凸包模板-计算几何
    80-计算几何-奶牛
    79-多边形的面积-计算几何
    78-直线相交-计算几何
    11-欧拉函数详解
    76-Relatives-欧拉函数
    29-中国剩余定理CRT
    2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
  • 原文地址:https://www.cnblogs.com/tinyphp/p/5048169.html
Copyright © 2020-2023  润新知