zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    汉字乱码、加密后结果字符串不一致
    msgpack和TParams互相转换
    unigui监听会话开始和结束
    System.JSON.Builders.pas
    保证最终一致性的模式
    使用 Delta Sharing 协议进行数据共享
    dremio 16 升级问题
    graylog 4.0 运行
    supabase 开源firebase 可选工具
    cube.js 最新playground 说明
  • 原文地址:https://www.cnblogs.com/tinyphp/p/5048169.html
Copyright © 2011-2022 走看看