故意不安全php登录-方向不明



对于一个网站漏洞类,我们的任务是设计一个带有可故意利用的mysql数据库的php登录。虽然我有一些基本的编程知识,并且我有一个"正常工作"的登录页面,但我不确定如何使其不安全?也就是说,我输入的任何SQL注入类型的查询似乎都不被接受,并且当我运行诸如"SQL Inject-Me"之类的插件时,它也不会发现任何问题。我理解如何净化用户输入的概念_POST、查询服务器等等……但我并没有遇到让它变得"可破解"的困难。相信我,花了几个小时来调整和尝试不同的东西都无济于事。我想我只是很难从概念上理解这一点,所以我可能没有朝着正确的方向前进。

如果有人愿意为我指明正确的方向,或者给我一些建议,我将不胜感激

这些是基本的SQL注入攻击,我正试图让它在这里变得容易受到攻击。

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<?php
//retrieve session data
// echo "Pageviews=". $_SESSION['views'];
?>
<?php
// Create connection
$con=mysqli_connect("localhost","root","","logins");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$i=0;
$userName = $_POST['username'];
$userPass = $_POST['password'];
$result = mysqli_query($con,"SELECT * FROM users");
while($row = mysqli_fetch_array($result)){
if($_POST['username'] == $row['Username'])
{
$i++;}
if($_POST['password'] == $row['Password'])
{
$i++;}
}
if($i>1){
echo "Winner";
}
else{
echo "Loser";}
//echo $row['Username'] . " " . $row['Password'];
//echo "<br>";

//echo "<br>";
//echo $_POST['username'];
//echo "<br>";
//echo $_POST['password'];
// echo "<br>";

?>

我正在尝试的另一种方法:

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<?php
//retrieve session data
// echo "Pageviews=". $_SESSION['views'];
?>
<?php
// Create connection
$con=mysqli_connect("localhost","root","","logins");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$verify = mysqli_query($con,"SELECT * FROM users");
while($row = mysqli_fetch_array($verify))
{
if (($_POST["username"] == $row['Username']) and ($_POST["password"] == $row['Password']))
{
echo "Winner " .$row['Firstname']." " .$row['Lastname'];
}
else
{
echo "Failure";
}
}
mysqli_close($con);
?>

对于一段要向SQL注入开放的代码,您只需要接受用户输入(通常来自表单)并将其传递到数据库,而无需对其进行转义。

由于输入没有转义,用户可以脱离预期的查询。

PHP/MMySQL中最基本的例子如下:

$mysqli->query("SELECT * FROM some_table WHERE some_column = '{$_POST['some_field']}'");

在您的示例中,它将把发布的用户名/密码传递给数据库查询而不进行转义

为了防止mysqli中的SQL注入,您可以使用real_escape_stringprepared statements

对于登录系统,通常最好的做法是查询数据库并查看是否找到匹配项,而不是遍历存储的每个用户名和密码以查看是否存在匹配项。想象一下,如果有一百万个用户帐户。这样,您也不需要从数据库中传输用户名/密码,因为您只需要SELECT 1并查看返回的行数。这使得代码更干净、更快、更安全。

最新更新