我正在测试我的应用程序是否受到 SQL注入攻击,这是源代码:
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
和类似的网址:
http://localhost:8080/sqli-labs-master/Less-1/?id=1
当我放(')时,它给我这样的错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
因此,当我想通过 HAVING AND GROUP BY 提取列名称时,它不起作用。我尝试这个:
http://localhost:8080/sqli-labs-master/Less-1/?id=1' HAVING 1=1 -- -
什么也没有发生。那么为什么我不能通过 HAVING 及其基于错误的注入 ...
答案 0 :(得分:1)
如果我对您的理解是正确的,那么您将试图通过不通过在hading或group by子句中指定所有列名而引发错误来提取列名。
对于SQL Server,这应该可以工作。
MySQL有一个名为ONLY_FULL_GROUP_BY的选项,如果未启用,则不会出现错误。版本5.7.5默认情况下默认启用ONLY_FULL_GROUP_BY
模式,因此我假设您使用的是旧版MySQL。
对于您的攻击,您可能想先启用ONLY_FULL_GROUP_BY
,然后引发error 1055-但是,只有在用户具有执行此操作所需的权限时,该功能才有效。
鉴于您具有必需的权限,这样的事情可能会起作用(未试用):
http://localhost:8080/sqli-labs-master/Less-1/?id=1%27%3B%20SET%20GLOBAL%20sql_mode%20%3D%20%27ONLY_FULL_GROUP_BY%27%20--%20-
http://localhost:8080/sqli-labs-master/Less-1/?id=1%27%20GROUP%20BY%201%20--%20-