代码之家  ›  专栏  ›  技术社区  ›  Sarfraz

发现SQL注入漏洞

  •  2
  • Sarfraz  · 技术社区  · 15 年前

    昨天我收到一个家伙的电子邮件,说我们的网站容易受到SQL注入的攻击。邮件说:

    我尝试了一些经典的SQL注入 您的服务器。此URL包含 结果:

    http://www.mysite.com/ppreview.php?id=611111161%20and%201=0%20UNION%20all%20SELECT%201,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user_id,70,71%20%20from%20admin--&u=10064&t=users_cars

    请注意,在上面的URL中,我没有公开我的实际域,而是将其替换为mysite.com。

    有人能解释一下上面的URL是什么意思吗?因为我的网站容易受到那种URL的攻击,而且可能也会受到你网站的攻击。

    如何解码该URL,那里发生了什么?

    3 回复  |  直到 15 年前
        1
  •  8
  •   fyjham    15 年前

    问题是,您正在将查询字符串上的SQL命令连接到SQL命令中。

    大概你的代码是这样写的

    "select * from preview where ID=" + Request.QueryString["id"]
    

    一旦使用该查询字符串,它将变为

    select * from preview where ID=611111161 and 1=0
    UNION ALL
    SELECT 1,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user=id,70,71
    FROM admin
    

    他让你的管理员帐户登录显示在你的预览页面上。

    您应该始终确保SQL转义从用户那里得到的任何输入,或者更好地使用参数化查询,服务器将负责处理这些输入。在不知道SQL Server的语言或类型的情况下,我不能真正地向您指出需要执行该操作的代码的方向。

        2
  •  1
  •   Michel van Engelen    15 年前

    您可能有类似的代码(我不知道PHP语法):

    string sql = "select * from mytable where customerid = " + Request.QueryString("id");

    现在,由于给您发邮件的人在您页面的查询字符串中添加了很多不仅仅是ID,所以您的SQL语句如下所示:

    select * from mytable where customerid = 6111111661 and union all the tables that you don't want.

    始终在查询中使用参数并检查用户输入! 尽可能避免使用动态SQL。

        3
  •  0
  •   Alt-Rock Ninja Cowgirl    15 年前

    将代码更改为这样工作。

    $id = $_GET['id'];
    $user = mysql_real_escape_string($_GET['user']);
    
    if( is_numeric($id) )
    {
       mysql_query($query);
    }
    

    现在,只要使用我概述的方法清理所有字符串,代码就不会接受无效的用户ID,也不会出现SQL注入问题。