我考试中的一个非常基本的 SQL 注入问题 - 我的 "weird" 解决方案是否有效?

A very basic SQL injection problem from my exam - will my "weird" solution work?

(我不是英语母语,有错误请见谅)

它获得了一些 Java 代码,用于构建一个简单的 SQL 查询。任务是 为两个参数 usernamepassword 提供字符串参数以删除 user_table

注意:我们没有教过 SQL 代码,所以不要担心确切的 SQL 语法。这里无所谓。

我不记得确切的代码,但它与此非常相似:

function(String username, String password)
{
    String sql = "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;
    //invoke the SQL query with this String
}

现在最好的解决方案可能是:

username = "Oscar"
password = "123; DROP TABLE user_table"

但这是我写的:

username = "Oscar; DROP TABLE user_table; 1=1"
password = "123"

我在解决方案中看到的问题是,最后一个 SQL 命令将是 1=1 AND pw = 123,这只是一个在代码中浮动的布尔表达式,什么都不做。它没有分配给任何东西或作为任何东西的条件。

这会导致运行时错误吗?如果是,之前的命令还会执行吗?

首先,此代码:

String sql = 
    "SELECT * FROM user_table WHERE id =" + username + "AND pw =" + password;

生成无效查询:

  • idpw 大概是字符串,所以传递的值应该用单引号括起来

  • and关键字前少了一个space

应该是:

String sql = 
    "SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";

现在说到练习,您可以简单地使用 pwSELECT 之后添加一个 delete 语句(同时仍然生成有效的 SQL SELECT)。如果应用程序代码允许一次执行多个查询,则第二个语句将在第一个语句之后执行。

例如,这个:

id: "foo"
pw: "bar'; DROP TABLE user_table; --"

将连接为:

SELECT * FROM user_table 
WHERE id = 'foo' AND pw ='bar'; DROP TABLE user_table; --'

请注意,最后的注释标记转义了最后一个引号。这是有效的 SQL,实际上会删除 table.

士气:使用查询参数。

String sql = 
    "SELECT * FROM user_table WHERE id = :id AND pw = :pwd";

"SELECT * FROM user_table WHERE id ="+用户名+"AND pw ="+密码;

用户名="Oscar; DROP TABLE user_table; 1=1"

密码=“123”

现在,如果您手动替换它们,将导致:

SELECT * 来自 user_table WHERE id = Oscar;下降 TABLE user_table; 1=1 AND pw = 123

这将导致 SQL 语法错误。如果你想聪明点,你可以在用户名"Oscar; DROP TABLE user_table; 1=1--"末尾添加“--”,这将注释其余查询并且注入将生效。