代码之家  ›  专栏  ›  技术社区  ›  John

MySQL php查询缺陷

  •  3
  • John  · 技术社区  · 6 年前

    我要做一个关于SQL注入的演示,还有什么比创建自己的php查询并向类显示更好的方法呢。 问题是,我的DB和php代码运行得很完美,但在我制作的编辑表单中,似乎找不到利用我的更新查询的漏洞。 如果有人能看看它,告诉我如何插入,比如说“DROP TABLE”命令或类似的命令,那将非常有用!

    <?php
    session_start();
    
    require_once 'config.php';
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    $userid = $_SESSION["userid"];
    $fname = $_SESSION["fname"];
    $lname = $_SESSION["lname"];
    $gender = $_SESSION["gender"];
    $email = $_SESSION["email"];
    
    if($_SERVER["REQUEST_METHOD"] == "POST") {
    
        $userid = trim($_POST["userid"]);
        $fname = trim($_POST["fname"]);
        $lname = trim($_POST["lname"]);
        $gender = trim($_POST["gender"]);
        $email = trim($_POST["email"]);
    
        $query = "UPDATE user_details SET fname = '$fname', lname = '$lname', gender = '$gender', email = '$email' WHERE userid = '$userid' ";
    
        if (mysqli_query($link, $query)) {
    
    
            echo 'Update complete!';
    
        }
        echo mysqli_error($link);
        // else { 
    
        //     echo '<p>' . 'Woah something went really wrong dude' . '</p>' ;
        //     echo mysqli_error($link);
        // }
    
    
    }
    
    ?>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Edit</title>
        <link rel="stylesheet" href="bootstrap.css">
        <style type="text/css">
            body{ font: 14px sans-serif; }
            .wrapper{ width: 350px; padding: 20px; }
        </style>
    </head>
    <body>
        <div class="container">
            <form class= "form-inline" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
                <label>First Name</label>
                <input type="text" name="fname" class="form-control" value="<?php echo $_SESSION["fname"]; ?>">
                <label>Last Name</label>
                <input type="text" name="lname" class="form-control" value="<?php echo $_SESSION["lname"]; ?>">
                <label>Gender</label>
                <input type="text" name="gender" class="form-control" value="<?php echo $_SESSION["gender"]; ?>">
                <label>Email</label>
                <input type="text" name="email" class="form-control" value="<?php echo $_SESSION["email"]; ?>">
        </div> 
        <div class = "wrapper">
                <label>UserID</label>
                <input type="text" name="userid" class="form-control" value="<?php echo $_SESSION["userid"]; ?>">
                <button type="submit">Submit</button>
    
        </form>
        <form action="action.php"><button type="submit">Back</button></form>
        </div>    
    </body>
    </html>
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Roshana Pitigala Laxmansinghsodhanohdiyala    6 年前

    在大多数情况下,mysqli会阻止多个查询,而MySQL本身也有一些内置的安全措施来防止意外删除表和数据库。所以你的 DROP TABLE 行不通。

    但您可以使用MySQL注入演示成功的登录尝试。

    创建登录表单并将数据传递到验证页面。将您的查询写为,

    query =  "SELECT * FROM `user`
         WHERE `username` = '." username ".' AND `password` = '." password ".'";
    

    现在,在登录表单中输入用户名为 ' OR '1'='1 和密码为 '或“1”=“1” . 所以在最后,完整的查询如下所示,

    SELECT * FROM `user` WHERE `username`='' OR '1'='1' AND `password`='' OR '1'='1';
    

    这将返回 user 表,应用程序只需使用第一条记录登录即可。

        2
  •  0
  •   Peter Stimpel    6 年前

    我不确定我是否完全理解你,但我会尽量告诉你为什么这似乎是个坏主意。。。

    如果我发布到userid

    $userid="';DROP TABLE XY;SELECT * FROM USER_DETAILS WHERE fname = '"
    

    你的代码可以。。。

    $query = "UPDATE user_details SET fname = '$fname', lname = '$lname', gender 
    = '$gender', email = '$email' WHERE userid = '$userid' ";
    

    这将导致查询:

    $query = "UPDATE user_details SET fname = '$fname', lname = '$lname', gender   
    = '$gender', email = '$email' WHERE userid = '';DROP TABLE XY;SELECT * FROM 
    USER_DETAILS WHERE fname = '' ";
    

    查询将是

    UPDATE user_details SET fname = '$fname', lname = '$lname', gender   
    = '$gender', email = '$email' WHERE userid = ''
    
    DROP TABLE XY
    
    SELECT * FROM USER_DETAILS WHERE fname = ''
    

    每一个都是有效的。。。现在创建一个XY表,并使用此发布的注入运行示例的原始查询。。。

    我错过了什么?

    编辑:@RaymondNijland指出,示例中使用的mysql函数似乎可以阻止这种攻击。我仍然认为这是一种危险的代码风格,只有司机才能创造安全。也许将来会有允许批处理sql的更新,如果知道我的代码不会打开这种门,我会睡得更好。。。