代码之家  ›  专栏  ›  技术社区  ›  Mohit Jain

SQL注入是如何完成的?[副本]

  •  1
  • Mohit Jain  · 技术社区  · 14 年前


    XKCD SQL injection - please explain

    成为rails开发者

    这是不安全的

      Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}'] )
    

    这就是安全:--

     Booking.find(:all, :conditions => [ 'bookings.user_id = ?', params[user_id]] )
    

    我说得对吗?

    所以我的问题是sql注入是如何完成的? 那些家伙是怎么做这种事的。任何有人展示这种东西的实例/教程。任何基本的逻辑知识。

    6 回复  |  直到 7 年前
        1
  •  2
  •   fire.eagle    14 年前

    当程序员变得懒惰时,就会发生SQL注入。易受攻击的查询如下所示:

    DECLARE @cmd varchar(256)
    
    SET cmd='SELECT @col FROM Table'
    EXEC @cmd
    

    @col是传递到存储过程的变量。

    * FROM Table; DROP DATABASE data;--
    

    表中的*结束了前面的语句。然后,DROP DATABASE data;就是做坏事的有效负载,在本例中,就是删除数据库。最后,-注释会删除查询的其余部分,这样就不会从注入中得到任何错误。

    SELECT column
    FROM Table
    

    SELECT *
    FROM Table;
    DROP DATABASE data;
    --
    

    这不好。

    alt text

        2
  •  1
  •   froadie    14 年前

    1234; DROP TABLE BOOKINGS
    

    ...

        3
  •  1
  •   Colin Hebert    14 年前

    Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}'] ) ,则用户可能会给用户\u id值 1 OR 1=1 如您所见,它将修改您的请求。

    再多注射一点 1; DROP TABLE BOOKINGS

    基本上,注入只是“劫持”一个基本的请求添加你的。

    Bobby tables

        4
  •  1
  •   Zaki    14 年前

    选择*FROM bookings WHERE user\u id=ORDER BY user\u id ASC;

    如果您不检查用户id,它可以关闭您的查询,然后启动一个新的(有害的)并放弃其余的查询。要实现这一点,一般来说,您需要输入以下内容

    initial;关闭好的查询,下一个是坏的查询,然后用关闭;并且--确保注释掉好查询中下一个出现的任何内容。最后你会得到

        5
  •  0
  •   GSto    14 年前

    如果您的数据在正确的清理和sanatized,用户可以尝试获得自己的SQL代码在服务器上运行。例如,假设您有这样一个查询:

     "SELECT * FROM products WHERE product_type = $type"
    

    其中类型是文本字段中的用户输入。现在,如果我要搜索这种类型:

    (从产品中删除)

    你会受到伤害的。这就是为什么在数据库中运行sanatized之前,确保所有用户输入都已被激活的原因。

        6
  •  0
  •   Martin    14 年前

    这里有大量关于SQL注入理论的优秀论文:

    sql injection filetype:pdf

    应该很容易找到一个特定于您的语言/DB组合。