Php 故意使脚本SQL可注入

Php 故意使脚本SQL可注入,php,sql,sql-injection,Php,Sql,Sql Injection,我正在审核安全工具,我决定一个好的方法是创建我自己的“不安全区域”(使用随机生成的假数据),因此我设置了一个易受sql注入影响的区域。然而,我实际上似乎不能注射它。我注意到,当我给它一个错误的查询时,“这里是找到的帐户”不会打印,但是错误消息也不会打印 有人能告诉我我做了什么不正确的事吗 <?php $resultHTML; if (isset($_POST['email']) || isset($_GET['email'])) { $conn = mysqli_connect

我正在审核安全工具,我决定一个好的方法是创建我自己的“不安全区域”(使用随机生成的假数据),因此我设置了一个易受sql注入影响的区域。然而,我实际上似乎不能注射它。我注意到,当我给它一个错误的查询时,“这里是找到的帐户”不会打印,但是错误消息也不会打印

有人能告诉我我做了什么不正确的事吗

<?php

$resultHTML;
if (isset($_POST['email']) || isset($_GET['email'])) {

    $conn = mysqli_connect($servername,$username,$password);

    if ($conn) {

        //this part is insecure (intentionally for testing)
        if (isset($_GET['email'])) {
            $query = "SELECT * from badSQL.Two WHERE email = '$_GET[email]'";
        } else {
            $query = "SELECT * from badSQL.Two WHERE email = '$_POST[email]'";
        }

        //echo $query;
        $result = $conn->query($query);

        if ($result) {
            $resultHTML = "Here are the accounts found: ";

            $hasAccount = false;
            while ($row = mysqli_fetch_assoc($result)) {
                $hasAccount = true;
                $resultHTML .= "<br>".print_r($row);
            }

            if ($hasAccount === false) {
                $resultHTML = "No accounts found.";
            }
        }

    } else {
        $resultHTML = "DB Connection could not be established: ".$conn->connect_error;
    }

}

?>

<html>
<head>

    <title>Two BadSQL Test</title>

</head>
<body>

    <h1>Two Website!</h1>
    <br>
    <h3>Forgot Password</h3>
    <p>Enter your email below, and click submit:</p>
    <form id="forgotForm" method="get">
        <input type="text" name="email" />
        <input type="submit" value="submit" />
    </form>

    <br>
    <div id="results"><?php echo $resultHTML; ?></div>
</body>
</html>

1'或'1'='1
应该是上述脚本的有效SQLi,因为它的计算结果是:

"SELECT * from badSQL.Two WHERE email = '1' OR '1'='1'"
电子邮件地址总是错误并不重要,因为它使用了
子句。考虑到
1
始终等于
1
,表达式作为一个整体将始终保持正确。因此,上面的脚本将“跳过”所有电子邮件检查,然后尝试查找满足
'1'='1'
条件的第一个用户。这与表中的第一个用户相关(通常是管理员,因为ID为1,导致进一步利用)

为了防止出现这种情况,我建议使用,并使每个表中的第一个用户拥有尽可能少的权限。我还建议您查看

等效的非易受攻击的PHP参数化查询如下所示:

$stmt = $dbConnection->prepare('SELECT * FROM badSQL.TwoWHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
此外,我建议不要故意让你自己的网站更容易受到攻击,因为为封装的虚假数据创建漏洞可能会成为合法攻击的载体


希望这有帮助:)

您使用的注射载体是什么?你想从表中提取什么数据?你在说什么错误信息?如果
此处是找到的帐户
未打印且没有连接错误。。。然后没有要打印的错误消息。请尝试
1'或'1'='1
。对于上述脚本,这应该是有效的SQLi。虽然我不知道你为什么要故意让自己的网站更容易受到攻击,因为为封装的虚假数据创建漏洞可能会成为合法攻击的载体。谢谢大家,最后一个成功了!结果证明我使用了错误的查询(可能是不匹配的单引号)。另外,请注意,在执行此操作之前(在其他地方),我已经从整个站点中删除了所有敏感数据。^Awesome;将写下答案:)