SQL注入是如何完成的? [复制]
Posted
技术标签:
【中文标题】SQL注入是如何完成的? [复制]【英文标题】:how SQL injection is done? [duplicate] 【发布时间】:2011-04-01 19:13:06 【问题描述】:可能重复:XKCD SQL injection - please explain
sql注入背后的一般概念是什么?
成为一名 Rails 开发人员
这是不安全的
Booking.find(:all, :conditions => [ 'bookings.user_id = #params[user_id]]'] )
这是安全的:--
Booking.find(:all, :conditions => [ 'bookings.user_id = ?', params[user_id]] )
我说的对吗?
所以我的问题是sql注入是如何完成的? 那些家伙是怎么做这样的事情的。任何有人展示此类内容的实时示例/教程。了解逻辑的任何基本知识。
【问题讨论】:
XKCD SQL injection - please explain 和 couple others 的可能副本 第一次投票结束我自己的问题 :-(。但它很好。在搜索 *** 之前问这样的问题是我的错误。对不起伙计们。:-) 【参考方案1】:这里有很多关于SQL注入理论的优秀论文:
sql injection filetype:pdf
应该很容易找到一个特定于您的语言/数据库组合的人。
【讨论】:
【参考方案2】:当程序员变得懒惰时,就会发生 SQL 注入。易受攻击的查询如下所示:
DECLARE @cmd varchar(256)
SET cmd='SELECT @col FROM Table'
EXEC @cmd
@col 是传递给存储过程的变量。
通常,用户会为该变量输入一个已经存在的列。但更狡猾的用户可能会输入这样的内容:
* FROM Table; DROP DATABASE data;--
* FROM 表;结束前面的语句。然后,DROP DATABASE 数据;是做坏事的有效负载,在这种情况下,删除数据库。最后, -- cmets 退出查询的其余部分,因此它不会从注入中得到任何错误。
所以,不要执行这个:
SELECT column
FROM Table
你明白了:
SELECT *
FROM Table;
DROP DATABASE data;
--
这不好。
还有这个:
【讨论】:
为 XKCD 投票。写出漫画中的例子以及究竟发生了什么会很棒。【参考方案3】:如果你有一个简单的查询,比如
SELECT * FROM bookings WHERE user_id = ORDER BY user_id ASC;
如果您不检查用户 ID,它可以关闭您的查询,然后开始一个新的(有害的)并丢弃其余的。为了实现这一点,通常,您会输入类似
1;从预订中删除; --
初始;关闭好查询,接下来是坏查询,然后用 ; 关闭和 -- 确保将在良好查询中出现的任何内容都注释掉。然后你会得到
SELECT * FROM bookings WHERE user_id = 1;从预订中删除; -- 按用户 ID ASC 排序;
【讨论】:
【参考方案4】:我不了解 Rails,但这样做 Booking.find(:all, :conditions => [ 'bookings.user_id = #params[user_id]]'] )
,您可能会冒着用户向 user_id 提供值 1 OR 1=1
的风险,如您所见,它会修改您的请求。
通过更多的注入,您可以执行1; DROP TABLE BOOKINGS
等操作。
基本上注入只是“劫持”一个添加你的基本请求。
Bobby tables
【讨论】:
【参考方案5】:如果您的数据经过适当的清理和清理,用户可以尝试让自己的 SQL 代码在服务器上运行。例如,假设您有这样的查询:
"SELECT * FROM products WHERE product_type = $type"
其中 type 是文本字段中未更改的用户输入。现在,如果我要搜索这种类型:
(从产品中删除)
你会在一个受伤的世界里。这就是为什么在数据库中运行之前确保所有用户输入都经过消毒很重要的原因。
【讨论】:
【参考方案6】:用户只需输入:
1234; DROP TABLE BOOKINGS
...
【讨论】:
以上是关于SQL注入是如何完成的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章