为什么Group by&HAVING子句不起作用?

时间:2018-09-28 07:16:18

标签: php sql-injection

我正在测试我的应用程序是否受到 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 及其基于错误的注入 ...

1 个答案:

答案 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-