我考试中的一个非常基本的 SQL 注入问题 - 我的 "weird" 解决方案是否有效?
A very basic SQL injection problem from my exam - will my "weird" solution work?
(我不是英语母语,有错误请见谅)
它获得了一些 Java 代码,用于构建一个简单的 SQL 查询。任务是
为两个参数 username
和 password
提供字符串参数以删除 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;
生成无效查询:
id
和 pw
大概是字符串,所以传递的值应该用单引号括起来
and
关键字前少了一个space
应该是:
String sql =
"SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";
现在说到练习,您可以简单地使用 pw
在 SELECT
之后添加一个 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--"末尾添加“--”,这将注释其余查询并且注入将生效。
(我不是英语母语,有错误请见谅)
它获得了一些 Java 代码,用于构建一个简单的 SQL 查询。任务是
为两个参数 username
和 password
提供字符串参数以删除 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;
生成无效查询:
id
和pw
大概是字符串,所以传递的值应该用单引号括起来and
关键字前少了一个space
应该是:
String sql =
"SELECT * FROM user_table WHERE id = '" + username + "' AND pw ='" + password + "'";
现在说到练习,您可以简单地使用 pw
在 SELECT
之后添加一个 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--"末尾添加“--”,这将注释其余查询并且注入将生效。