SQL 注入如何通过 URL 工作?

信息安全 Web应用程序 sql注入
2021-08-20 21:20:28

我想知道 SQL 注入是如何通过带有参数中的 SQL 的 URL 进行的。假设我有一个带有名为mytable. 当我从方法 POST 中获得一个 ID 时,我将它放在这个查询中:

SELECT * FROM `mytable` WHERE id='POST[id]'

即使用户将 SQL 设置为:

SELECT * FROM 'mytable'

它变成了这样:

SELECT * FROM `mytable` WHERE id='SELECT * FROM 'mytable'

所以它只是返回:

您的 SQL 语法有错误。

那么这种攻击是如何起作用的呢?攻击者如何在不导致语法错误的情况下更改查询?

2个回答

SQL注入的重点是修改变量所在的查询。

让我们以您编写的查询为例。如果变量id包含类似这样的内容并且未正确清理:

' OR 1=1#

它将返回每一行,因为它已被修改为:

SELECT * FROM `mytable` WHERE id='' OR 1=1#'

避免语法错误的技巧是注释查询的其余部分(字符#在这种情况下会这样做。

利用 SQL 注入是提供参数的艺术,当将这些参数合并到 SQL 语句中时,会产生有效的 SQL 语句语法,同时将开发人员想要的语义更改为对攻击者有利的语义。

根据可能注入的 DMBS 和语句类型,成功的 SQL 注入的结果从信息泄露(读取任意数据、本地文件)到数据操作(插入、删除或更改任意数据、写入本地文件),通过任意命令执行。

DBMS 和语句也会影响在利用期间可以使用哪些技术如果连接 API 不允许执行多个语句(所谓的“堆栈查询”),则经常引用的Robert';DROP TABLE Students; --语句将无效。在这种情况下,您还将受到注入发生的特定语句类型的副作用的限制:如果它是一个SELECT语句,则很可能只能读取数据,而不能写入或删除数据。

最后,它还取决于向攻击者提供的关于执行语句结果的反馈。错误消息,尤其是由连接 API 或编程语言生成的错误消息,通常非常技术性和冗长,并且可以揭示关键信息,例如,失败语句的部分内容,例如“您的 SQL 语法在 '...' 附近有错误”。此类消息可以为攻击者提供有关注入发生的上下文(语句类型、子句类型、括号嵌套级别等)的方便信息。

在您的示例中,一个简单id=' OR '1'='1的语句将导致以下语句:

SELECT * FROM `mytable` WHERE id='' OR '1'='1'

使用后一个表达式,'1'='1'所有行都将被选中。对此的扩展是使用子查询以盲目方式读取任意数据:

SELECT * FROM `mytable` WHERE id='' OR EXISTS (SELECT * FROM users WHERE name='admin' AND password LIKE 'a%') AND '1'='1'

admin这里只有存在密码以 开头的用户时才会选择所有行a,否则不会选择任何行。这种技术被称为“基于布尔的盲法”。