利用 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
,否则不会选择任何行。这种技术被称为“基于布尔的盲法”。