【问题标题】:Injection through php通过php注入
【发布时间】:2017-05-19 17:39:59
【问题描述】:
<?php
$username=$_POST['user'];
$password=$_POST['pass'];
if($username=='admin' AND $password=='pass'){
echo "inside";
}
?>
<form action='' method='post'>

    <input name=user>
    <input name=pass>
    <input type='submit'>

</form>

由于我是 php 新手并且我正在研究 sql 注入...我已经制作了一个没有 sql 查询的示例代码,我只想进入打印... 我正在尝试将用户值和密码值设置为""==""OR""...但它不起作用...如果我尝试使用此echo var_dump(""==""OR""=='admin'); 它是真实的

【问题讨论】:

  • 第一。我会检查您是否获得了您想要在帖子中获得的数据。在将其放入您的 if 语句之前,请先尝试回显它。从表单获取数据的一个好习惯是检查是否发布了任何内容。您可以使用以下方法进行检查:` if(isset($POST["user]) { ..do something }` 您的逻辑很好,因此您发布的值一定是不正确的。
  • SQL在哪里?
  • 我不知道这是怎么回事。
  • 永远不要存储纯文本密码!请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用低于 5.5 的 PHP 版本,您可以使用 password_hash() compatibility pack在散列之前不需要escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。

标签: php sql-server


【解决方案1】:

假设你有这个代码(只是一个给出想法的例子)

方法 1(不推荐)

<?php
    $username=$_POST['user'];
    $password=$_POST['pass'];
    $sql = "SELECT * FROM users WHERE username LIKE '".$_POST['user']."'";
    //Execute the query
?>
<form action='' method='post'>
    <input name=user>
    <input name=pass>
    <input type='submit'>
</form>

现在这很容易受到 SQL 注入的攻击。如果用户输入

abc'; DROP TABLE users;

此查询将呈现为

"SELECT * FROM users WHERE username LIKE 'abc'; DROP TABLE users";

现在有两个查询,首先它执行 SELECT 然后它执行 DROP 因此最后你的 users 表被删除。

方法 2(建议使用准备好的语句)

<?php
    $username=$_POST['user'];
    $password=$_POST['pass'];
    $stmt = $mysqli->prepare("SELECT * FROM users WHERE username LIKE ?");
    $stmt->bind_param("s", $_POST['user']);
    $stmt->execute();
    //Execute the query
?>
<form action='' method='post'>
    <input name=user>
    <input name=pass>
    <input type='submit'>
</form>

现在在$stmt-&gt;$mysqli-&gt;prepare() 行,简而言之,它将转到 MySQL 并告诉有一个带有参数的查询。 然后bind_param 将只作为参数将自己注册到 MySQL。并因此执行。

我不能用更简单的词来写。希望你能明白!

【讨论】:

    【解决方案2】:

    在脚本中查看注入的最佳方式是“输出”您的输入而不进行“清理”。这通常是查看存在的安全问题的最快方式(以及大多数漏洞扫描程序检查注入能力的方式)。因此,如果您想查看研究的安全问题,我建议您将用户输入的值添加到页面中。尝试将您的代码更新为此,(请注意,这是非常不安全的,不应在生产中使用,但对于您的注入研究应该足够了)。

    <?php
    $username=$_POST['user'];
    $password=$_POST['pass'];
    if($username=='admin' AND $password=='pass'){
    echo "inside";
    }
    ?>
    <form action='' method='post'>
    
        <input name="user" value="<?php echo $username; ?>">
        <input name="pass" value="<?php echo $password; ?>">
        <input type='submit'>
    
        <p>PHP:  <?php echo $_SERVER['PHP_SELF']; ?></p>
    </form>
    

    我还添加了“$_SERVER['PHP_SELF']”调用来演示使用该 PHP 变量可能进行的注入。如果您运行“OWASP ZAP”或“OpenVAS”或“Nessus”,您应该会看到它描述了您研究的注入漏洞。

    如果您有任何问题,请告诉我,谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 2013-11-14
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多